eidos-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (633) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +175 -0
  3. package/dist/Breadcrumb.types-DaykU-C8.d.cts +20 -0
  4. package/dist/Breadcrumb.types-DaykU-C8.d.ts +20 -0
  5. package/dist/Button.types-BH0CPyPx.d.ts +33 -0
  6. package/dist/Button.types-DZRCVqyN.d.cts +33 -0
  7. package/dist/CommandPalette.types-DRMMS_ev.d.cts +73 -0
  8. package/dist/CommandPalette.types-DRMMS_ev.d.ts +73 -0
  9. package/dist/Footer.types-Dv2TPN2J.d.cts +24 -0
  10. package/dist/Footer.types-Dv2TPN2J.d.ts +24 -0
  11. package/dist/Header.types-BZi80bWz.d.cts +17 -0
  12. package/dist/Header.types-DJt-q01P.d.ts +17 -0
  13. package/dist/Input.types-DFZNyJGF.d.cts +45 -0
  14. package/dist/Input.types-XrJTI0JC.d.ts +45 -0
  15. package/dist/Menu.types-DNIpjSAK.d.ts +49 -0
  16. package/dist/Menu.types-DwcuCZM7.d.cts +49 -0
  17. package/dist/Navigation.types-Ctu5mlTa.d.cts +94 -0
  18. package/dist/Navigation.types-DVcLJnrB.d.ts +94 -0
  19. package/dist/Table.types-Bv9l7qxd.d.ts +103 -0
  20. package/dist/Table.types-DQ0ReOLj.d.cts +103 -0
  21. package/dist/Toolbar.types-BGD57Uhm.d.ts +22 -0
  22. package/dist/Toolbar.types-tQkLmPIu.d.cts +22 -0
  23. package/dist/accordion/index.cjs +10 -0
  24. package/dist/accordion/index.cjs.map +1 -0
  25. package/dist/accordion/index.d.cts +39 -0
  26. package/dist/accordion/index.d.ts +39 -0
  27. package/dist/accordion/index.js +10 -0
  28. package/dist/accordion/index.js.map +1 -0
  29. package/dist/alert/index.cjs +12 -0
  30. package/dist/alert/index.cjs.map +1 -0
  31. package/dist/alert/index.d.cts +29 -0
  32. package/dist/alert/index.d.ts +29 -0
  33. package/dist/alert/index.js +12 -0
  34. package/dist/alert/index.js.map +1 -0
  35. package/dist/avatar/index.cjs +10 -0
  36. package/dist/avatar/index.cjs.map +1 -0
  37. package/dist/avatar/index.d.cts +26 -0
  38. package/dist/avatar/index.d.ts +26 -0
  39. package/dist/avatar/index.js +10 -0
  40. package/dist/avatar/index.js.map +1 -0
  41. package/dist/badge/index.cjs +8 -0
  42. package/dist/badge/index.cjs.map +1 -0
  43. package/dist/badge/index.d.cts +27 -0
  44. package/dist/badge/index.d.ts +27 -0
  45. package/dist/badge/index.js +8 -0
  46. package/dist/badge/index.js.map +1 -0
  47. package/dist/breadcrumb/index.cjs +8 -0
  48. package/dist/breadcrumb/index.cjs.map +1 -0
  49. package/dist/breadcrumb/index.d.cts +7 -0
  50. package/dist/breadcrumb/index.d.ts +7 -0
  51. package/dist/breadcrumb/index.js +8 -0
  52. package/dist/breadcrumb/index.js.map +1 -0
  53. package/dist/button/index.cjs +14 -0
  54. package/dist/button/index.cjs.map +1 -0
  55. package/dist/button/index.d.cts +21 -0
  56. package/dist/button/index.d.ts +21 -0
  57. package/dist/button/index.js +14 -0
  58. package/dist/button/index.js.map +1 -0
  59. package/dist/button-group/index.cjs +8 -0
  60. package/dist/button-group/index.cjs.map +1 -0
  61. package/dist/button-group/index.d.cts +46 -0
  62. package/dist/button-group/index.d.ts +46 -0
  63. package/dist/button-group/index.js +8 -0
  64. package/dist/button-group/index.js.map +1 -0
  65. package/dist/card/index.cjs +8 -0
  66. package/dist/card/index.cjs.map +1 -0
  67. package/dist/card/index.d.cts +18 -0
  68. package/dist/card/index.d.ts +18 -0
  69. package/dist/card/index.js +8 -0
  70. package/dist/card/index.js.map +1 -0
  71. package/dist/checkbox/index.cjs +9 -0
  72. package/dist/checkbox/index.cjs.map +1 -0
  73. package/dist/checkbox/index.d.cts +16 -0
  74. package/dist/checkbox/index.d.ts +16 -0
  75. package/dist/checkbox/index.js +9 -0
  76. package/dist/checkbox/index.js.map +1 -0
  77. package/dist/chip/index.cjs +11 -0
  78. package/dist/chip/index.cjs.map +1 -0
  79. package/dist/chip/index.d.cts +27 -0
  80. package/dist/chip/index.d.ts +27 -0
  81. package/dist/chip/index.js +11 -0
  82. package/dist/chip/index.js.map +1 -0
  83. package/dist/chunk-2HTBZGBP.cjs +113 -0
  84. package/dist/chunk-2HTBZGBP.cjs.map +1 -0
  85. package/dist/chunk-2JWY36LD.cjs +112 -0
  86. package/dist/chunk-2JWY36LD.cjs.map +1 -0
  87. package/dist/chunk-2YQE26EK.js +54 -0
  88. package/dist/chunk-2YQE26EK.js.map +1 -0
  89. package/dist/chunk-2ZWBN3LK.cjs +92 -0
  90. package/dist/chunk-2ZWBN3LK.cjs.map +1 -0
  91. package/dist/chunk-3ETWFS2N.cjs +40 -0
  92. package/dist/chunk-3ETWFS2N.cjs.map +1 -0
  93. package/dist/chunk-3KAR5KCS.cjs +47 -0
  94. package/dist/chunk-3KAR5KCS.cjs.map +1 -0
  95. package/dist/chunk-3RUIKBH4.cjs +1 -0
  96. package/dist/chunk-3RUIKBH4.cjs.map +1 -0
  97. package/dist/chunk-3SKI6FXB.js +40 -0
  98. package/dist/chunk-3SKI6FXB.js.map +1 -0
  99. package/dist/chunk-3YPTYI7R.js +194 -0
  100. package/dist/chunk-3YPTYI7R.js.map +1 -0
  101. package/dist/chunk-4NUZP66U.js +299 -0
  102. package/dist/chunk-4NUZP66U.js.map +1 -0
  103. package/dist/chunk-5D3LIJYW.cjs +299 -0
  104. package/dist/chunk-5D3LIJYW.cjs.map +1 -0
  105. package/dist/chunk-5QG2I3FK.cjs +169 -0
  106. package/dist/chunk-5QG2I3FK.cjs.map +1 -0
  107. package/dist/chunk-5TGBNYZK.cjs +11 -0
  108. package/dist/chunk-5TGBNYZK.cjs.map +1 -0
  109. package/dist/chunk-5WRI5ZAA.js +31 -0
  110. package/dist/chunk-5WRI5ZAA.js.map +1 -0
  111. package/dist/chunk-63N2KZZX.cjs +54 -0
  112. package/dist/chunk-63N2KZZX.cjs.map +1 -0
  113. package/dist/chunk-66R54X6R.js +1 -0
  114. package/dist/chunk-66R54X6R.js.map +1 -0
  115. package/dist/chunk-6NZXWKUE.js +1 -0
  116. package/dist/chunk-6NZXWKUE.js.map +1 -0
  117. package/dist/chunk-6P4WYB3B.js +169 -0
  118. package/dist/chunk-6P4WYB3B.js.map +1 -0
  119. package/dist/chunk-6QFT3BUD.cjs +28 -0
  120. package/dist/chunk-6QFT3BUD.cjs.map +1 -0
  121. package/dist/chunk-6USUVU6J.js +26 -0
  122. package/dist/chunk-6USUVU6J.js.map +1 -0
  123. package/dist/chunk-73EKJU4G.js +11 -0
  124. package/dist/chunk-73EKJU4G.js.map +1 -0
  125. package/dist/chunk-7IOOFKG3.js +26 -0
  126. package/dist/chunk-7IOOFKG3.js.map +1 -0
  127. package/dist/chunk-7KGV6YCG.cjs +54 -0
  128. package/dist/chunk-7KGV6YCG.cjs.map +1 -0
  129. package/dist/chunk-7NZTRSMT.js +1484 -0
  130. package/dist/chunk-7NZTRSMT.js.map +1 -0
  131. package/dist/chunk-7R7IFWGB.cjs +86 -0
  132. package/dist/chunk-7R7IFWGB.cjs.map +1 -0
  133. package/dist/chunk-A35Y5MRJ.js +235 -0
  134. package/dist/chunk-A35Y5MRJ.js.map +1 -0
  135. package/dist/chunk-AOV32YBE.js +113 -0
  136. package/dist/chunk-AOV32YBE.js.map +1 -0
  137. package/dist/chunk-AUFCW7QU.cjs +526 -0
  138. package/dist/chunk-AUFCW7QU.cjs.map +1 -0
  139. package/dist/chunk-BFYSYUA6.cjs +125 -0
  140. package/dist/chunk-BFYSYUA6.cjs.map +1 -0
  141. package/dist/chunk-BTPCSBGP.js +1622 -0
  142. package/dist/chunk-BTPCSBGP.js.map +1 -0
  143. package/dist/chunk-C7F2VFAI.cjs +259 -0
  144. package/dist/chunk-C7F2VFAI.cjs.map +1 -0
  145. package/dist/chunk-CDV2OAS3.cjs +235 -0
  146. package/dist/chunk-CDV2OAS3.cjs.map +1 -0
  147. package/dist/chunk-CJUZDUXW.cjs +79 -0
  148. package/dist/chunk-CJUZDUXW.cjs.map +1 -0
  149. package/dist/chunk-CKH36D7H.js +28 -0
  150. package/dist/chunk-CKH36D7H.js.map +1 -0
  151. package/dist/chunk-D7PGZ3M3.cjs +117 -0
  152. package/dist/chunk-D7PGZ3M3.cjs.map +1 -0
  153. package/dist/chunk-DFADZZ3K.js +126 -0
  154. package/dist/chunk-DFADZZ3K.js.map +1 -0
  155. package/dist/chunk-DI2VKKLW.js +1 -0
  156. package/dist/chunk-DI2VKKLW.js.map +1 -0
  157. package/dist/chunk-DK4S3EHG.js +29 -0
  158. package/dist/chunk-DK4S3EHG.js.map +1 -0
  159. package/dist/chunk-DZUJEN5N.cjs +31 -0
  160. package/dist/chunk-DZUJEN5N.cjs.map +1 -0
  161. package/dist/chunk-E2B33QB7.js +97 -0
  162. package/dist/chunk-E2B33QB7.js.map +1 -0
  163. package/dist/chunk-E3XATJ63.js +4418 -0
  164. package/dist/chunk-E3XATJ63.js.map +1 -0
  165. package/dist/chunk-EACNRR3C.cjs +1 -0
  166. package/dist/chunk-EACNRR3C.cjs.map +1 -0
  167. package/dist/chunk-EQ6BNPTL.cjs +39 -0
  168. package/dist/chunk-EQ6BNPTL.cjs.map +1 -0
  169. package/dist/chunk-F54MVGKO.js +342 -0
  170. package/dist/chunk-F54MVGKO.js.map +1 -0
  171. package/dist/chunk-FNUOTM44.cjs +238 -0
  172. package/dist/chunk-FNUOTM44.cjs.map +1 -0
  173. package/dist/chunk-FO5FNTJX.js +69 -0
  174. package/dist/chunk-FO5FNTJX.js.map +1 -0
  175. package/dist/chunk-FQZ6F7FQ.cjs +1 -0
  176. package/dist/chunk-FQZ6F7FQ.cjs.map +1 -0
  177. package/dist/chunk-G2FANEA2.cjs +101 -0
  178. package/dist/chunk-G2FANEA2.cjs.map +1 -0
  179. package/dist/chunk-G36S5CWN.cjs +26 -0
  180. package/dist/chunk-G36S5CWN.cjs.map +1 -0
  181. package/dist/chunk-GI7WPGP2.cjs +454 -0
  182. package/dist/chunk-GI7WPGP2.cjs.map +1 -0
  183. package/dist/chunk-GL4DHGQE.js +1316 -0
  184. package/dist/chunk-GL4DHGQE.js.map +1 -0
  185. package/dist/chunk-GOVOQZYN.js +18 -0
  186. package/dist/chunk-GOVOQZYN.js.map +1 -0
  187. package/dist/chunk-GRH57M3E.js +88 -0
  188. package/dist/chunk-GRH57M3E.js.map +1 -0
  189. package/dist/chunk-H523JFY2.js +303 -0
  190. package/dist/chunk-H523JFY2.js.map +1 -0
  191. package/dist/chunk-H56YUMFB.cjs +1622 -0
  192. package/dist/chunk-H56YUMFB.cjs.map +1 -0
  193. package/dist/chunk-HO7P6IJO.js +238 -0
  194. package/dist/chunk-HO7P6IJO.js.map +1 -0
  195. package/dist/chunk-HPIBYEGE.cjs +1484 -0
  196. package/dist/chunk-HPIBYEGE.cjs.map +1 -0
  197. package/dist/chunk-HQ4KZRFH.js +67 -0
  198. package/dist/chunk-HQ4KZRFH.js.map +1 -0
  199. package/dist/chunk-HUNMRKGE.js +21 -0
  200. package/dist/chunk-HUNMRKGE.js.map +1 -0
  201. package/dist/chunk-I44YNYI6.cjs +1 -0
  202. package/dist/chunk-I44YNYI6.cjs.map +1 -0
  203. package/dist/chunk-I6UOIS4J.cjs +1 -0
  204. package/dist/chunk-I6UOIS4J.cjs.map +1 -0
  205. package/dist/chunk-ICJ3SV5I.cjs +183 -0
  206. package/dist/chunk-ICJ3SV5I.cjs.map +1 -0
  207. package/dist/chunk-IYQX7PBO.cjs +320 -0
  208. package/dist/chunk-IYQX7PBO.cjs.map +1 -0
  209. package/dist/chunk-JFA5ABVE.js +54 -0
  210. package/dist/chunk-JFA5ABVE.js.map +1 -0
  211. package/dist/chunk-JORQYNJD.js +79 -0
  212. package/dist/chunk-JORQYNJD.js.map +1 -0
  213. package/dist/chunk-K5TKNT6I.cjs +34 -0
  214. package/dist/chunk-K5TKNT6I.cjs.map +1 -0
  215. package/dist/chunk-KF64C4QI.js +138 -0
  216. package/dist/chunk-KF64C4QI.js.map +1 -0
  217. package/dist/chunk-KGXGTWUL.js +1 -0
  218. package/dist/chunk-KGXGTWUL.js.map +1 -0
  219. package/dist/chunk-KKOZX64Z.js +34 -0
  220. package/dist/chunk-KKOZX64Z.js.map +1 -0
  221. package/dist/chunk-KO2MKZDW.cjs +69 -0
  222. package/dist/chunk-KO2MKZDW.cjs.map +1 -0
  223. package/dist/chunk-KQKJVFYF.js +259 -0
  224. package/dist/chunk-KQKJVFYF.js.map +1 -0
  225. package/dist/chunk-KV2FG7AN.cjs +401 -0
  226. package/dist/chunk-KV2FG7AN.cjs.map +1 -0
  227. package/dist/chunk-L3UPSLJ5.cjs +4418 -0
  228. package/dist/chunk-L3UPSLJ5.cjs.map +1 -0
  229. package/dist/chunk-LEZ4HSBD.cjs +744 -0
  230. package/dist/chunk-LEZ4HSBD.cjs.map +1 -0
  231. package/dist/chunk-LQ3C3OR2.js +21 -0
  232. package/dist/chunk-LQ3C3OR2.js.map +1 -0
  233. package/dist/chunk-LTOHGCU4.cjs +69 -0
  234. package/dist/chunk-LTOHGCU4.cjs.map +1 -0
  235. package/dist/chunk-M56IGNH7.cjs +125 -0
  236. package/dist/chunk-M56IGNH7.cjs.map +1 -0
  237. package/dist/chunk-MOX6LYGC.js +125 -0
  238. package/dist/chunk-MOX6LYGC.js.map +1 -0
  239. package/dist/chunk-MSQXPGOD.cjs +125 -0
  240. package/dist/chunk-MSQXPGOD.cjs.map +1 -0
  241. package/dist/chunk-N5JDL4VE.js +1 -0
  242. package/dist/chunk-N5JDL4VE.js.map +1 -0
  243. package/dist/chunk-N7HX5635.cjs +138 -0
  244. package/dist/chunk-N7HX5635.cjs.map +1 -0
  245. package/dist/chunk-NDLMU6HJ.js +744 -0
  246. package/dist/chunk-NDLMU6HJ.js.map +1 -0
  247. package/dist/chunk-O5ZPSZNY.cjs +88 -0
  248. package/dist/chunk-O5ZPSZNY.cjs.map +1 -0
  249. package/dist/chunk-O6B4KB4D.js +125 -0
  250. package/dist/chunk-O6B4KB4D.js.map +1 -0
  251. package/dist/chunk-OHUVWPFJ.js +86 -0
  252. package/dist/chunk-OHUVWPFJ.js.map +1 -0
  253. package/dist/chunk-OT3VZLN4.js +117 -0
  254. package/dist/chunk-OT3VZLN4.js.map +1 -0
  255. package/dist/chunk-OVYIBDGE.js +183 -0
  256. package/dist/chunk-OVYIBDGE.js.map +1 -0
  257. package/dist/chunk-P2BTQ33C.cjs +126 -0
  258. package/dist/chunk-P2BTQ33C.cjs.map +1 -0
  259. package/dist/chunk-P6ZBENAG.js +211 -0
  260. package/dist/chunk-P6ZBENAG.js.map +1 -0
  261. package/dist/chunk-P74HNSNJ.cjs +106 -0
  262. package/dist/chunk-P74HNSNJ.cjs.map +1 -0
  263. package/dist/chunk-PEPYVWGY.cjs +327 -0
  264. package/dist/chunk-PEPYVWGY.cjs.map +1 -0
  265. package/dist/chunk-POX6JZLO.cjs +67 -0
  266. package/dist/chunk-POX6JZLO.cjs.map +1 -0
  267. package/dist/chunk-PWIA4XQD.js +320 -0
  268. package/dist/chunk-PWIA4XQD.js.map +1 -0
  269. package/dist/chunk-QGZF5MOS.cjs +342 -0
  270. package/dist/chunk-QGZF5MOS.cjs.map +1 -0
  271. package/dist/chunk-QP2A5ZMK.cjs +18 -0
  272. package/dist/chunk-QP2A5ZMK.cjs.map +1 -0
  273. package/dist/chunk-QYHTMEI5.js +92 -0
  274. package/dist/chunk-QYHTMEI5.js.map +1 -0
  275. package/dist/chunk-QYK4ECSZ.js +69 -0
  276. package/dist/chunk-QYK4ECSZ.js.map +1 -0
  277. package/dist/chunk-R36SGSJX.cjs +26 -0
  278. package/dist/chunk-R36SGSJX.cjs.map +1 -0
  279. package/dist/chunk-R5QPUQSI.cjs +303 -0
  280. package/dist/chunk-R5QPUQSI.cjs.map +1 -0
  281. package/dist/chunk-R5UNLPQZ.cjs +103 -0
  282. package/dist/chunk-R5UNLPQZ.cjs.map +1 -0
  283. package/dist/chunk-RSBQNIJZ.js +199 -0
  284. package/dist/chunk-RSBQNIJZ.js.map +1 -0
  285. package/dist/chunk-S25WB7KJ.js +50 -0
  286. package/dist/chunk-S25WB7KJ.js.map +1 -0
  287. package/dist/chunk-SAFSEXMU.cjs +211 -0
  288. package/dist/chunk-SAFSEXMU.cjs.map +1 -0
  289. package/dist/chunk-SJDTFR3I.cjs +1 -0
  290. package/dist/chunk-SJDTFR3I.cjs.map +1 -0
  291. package/dist/chunk-SOGUWOSQ.cjs +21 -0
  292. package/dist/chunk-SOGUWOSQ.cjs.map +1 -0
  293. package/dist/chunk-SWPZ3HFY.cjs +1 -0
  294. package/dist/chunk-SWPZ3HFY.cjs.map +1 -0
  295. package/dist/chunk-SXF3TCYA.js +401 -0
  296. package/dist/chunk-SXF3TCYA.js.map +1 -0
  297. package/dist/chunk-T56K5IKQ.js +526 -0
  298. package/dist/chunk-T56K5IKQ.js.map +1 -0
  299. package/dist/chunk-TBMVUI7S.cjs +21 -0
  300. package/dist/chunk-TBMVUI7S.cjs.map +1 -0
  301. package/dist/chunk-TCX3QKF3.js +103 -0
  302. package/dist/chunk-TCX3QKF3.js.map +1 -0
  303. package/dist/chunk-TH3ITGUM.js +1 -0
  304. package/dist/chunk-TH3ITGUM.js.map +1 -0
  305. package/dist/chunk-TPNCV7KA.js +1 -0
  306. package/dist/chunk-TPNCV7KA.js.map +1 -0
  307. package/dist/chunk-TQCNQKWF.cjs +194 -0
  308. package/dist/chunk-TQCNQKWF.cjs.map +1 -0
  309. package/dist/chunk-TZWNX7FF.js +1 -0
  310. package/dist/chunk-TZWNX7FF.js.map +1 -0
  311. package/dist/chunk-UEJSRMU2.js +39 -0
  312. package/dist/chunk-UEJSRMU2.js.map +1 -0
  313. package/dist/chunk-UTENJWSE.cjs +21 -0
  314. package/dist/chunk-UTENJWSE.cjs.map +1 -0
  315. package/dist/chunk-V5JNYS77.cjs +29 -0
  316. package/dist/chunk-V5JNYS77.cjs.map +1 -0
  317. package/dist/chunk-VFYG7GAH.js +327 -0
  318. package/dist/chunk-VFYG7GAH.js.map +1 -0
  319. package/dist/chunk-VGYJ4VKX.cjs +62 -0
  320. package/dist/chunk-VGYJ4VKX.cjs.map +1 -0
  321. package/dist/chunk-VLC2OZV3.cjs +50 -0
  322. package/dist/chunk-VLC2OZV3.cjs.map +1 -0
  323. package/dist/chunk-VTAABT55.js +47 -0
  324. package/dist/chunk-VTAABT55.js.map +1 -0
  325. package/dist/chunk-VW32UTUE.cjs +1 -0
  326. package/dist/chunk-VW32UTUE.cjs.map +1 -0
  327. package/dist/chunk-VYV45YOK.cjs +1316 -0
  328. package/dist/chunk-VYV45YOK.cjs.map +1 -0
  329. package/dist/chunk-VZ43OLU6.cjs +97 -0
  330. package/dist/chunk-VZ43OLU6.cjs.map +1 -0
  331. package/dist/chunk-XJAXKENE.cjs +1 -0
  332. package/dist/chunk-XJAXKENE.cjs.map +1 -0
  333. package/dist/chunk-XJBMEDQ5.js +101 -0
  334. package/dist/chunk-XJBMEDQ5.js.map +1 -0
  335. package/dist/chunk-XMRMCWSQ.js +454 -0
  336. package/dist/chunk-XMRMCWSQ.js.map +1 -0
  337. package/dist/chunk-XSGUFMT4.js +21 -0
  338. package/dist/chunk-XSGUFMT4.js.map +1 -0
  339. package/dist/chunk-XUZOU2EB.js +1 -0
  340. package/dist/chunk-XUZOU2EB.js.map +1 -0
  341. package/dist/chunk-YCUT6NQ4.js +106 -0
  342. package/dist/chunk-YCUT6NQ4.js.map +1 -0
  343. package/dist/chunk-YLKESEHQ.cjs +199 -0
  344. package/dist/chunk-YLKESEHQ.cjs.map +1 -0
  345. package/dist/chunk-YPK7RV3Y.js +62 -0
  346. package/dist/chunk-YPK7RV3Y.js.map +1 -0
  347. package/dist/chunk-Z7S4UQKY.js +125 -0
  348. package/dist/chunk-Z7S4UQKY.js.map +1 -0
  349. package/dist/chunk-ZBGTVTQJ.js +112 -0
  350. package/dist/chunk-ZBGTVTQJ.js.map +1 -0
  351. package/dist/color-picker/index.cjs +9 -0
  352. package/dist/color-picker/index.cjs.map +1 -0
  353. package/dist/color-picker/index.d.cts +40 -0
  354. package/dist/color-picker/index.d.ts +40 -0
  355. package/dist/color-picker/index.js +9 -0
  356. package/dist/color-picker/index.js.map +1 -0
  357. package/dist/combobox/index.cjs +12 -0
  358. package/dist/combobox/index.cjs.map +1 -0
  359. package/dist/combobox/index.d.cts +37 -0
  360. package/dist/combobox/index.d.ts +37 -0
  361. package/dist/combobox/index.js +12 -0
  362. package/dist/combobox/index.js.map +1 -0
  363. package/dist/command-palette/index.cjs +10 -0
  364. package/dist/command-palette/index.cjs.map +1 -0
  365. package/dist/command-palette/index.d.cts +7 -0
  366. package/dist/command-palette/index.d.ts +7 -0
  367. package/dist/command-palette/index.js +10 -0
  368. package/dist/command-palette/index.js.map +1 -0
  369. package/dist/context-menu/index.cjs +13 -0
  370. package/dist/context-menu/index.cjs.map +1 -0
  371. package/dist/context-menu/index.d.cts +38 -0
  372. package/dist/context-menu/index.d.ts +38 -0
  373. package/dist/context-menu/index.js +13 -0
  374. package/dist/context-menu/index.js.map +1 -0
  375. package/dist/data-grid/index.cjs +28 -0
  376. package/dist/data-grid/index.cjs.map +1 -0
  377. package/dist/data-grid/index.d.cts +217 -0
  378. package/dist/data-grid/index.d.ts +217 -0
  379. package/dist/data-grid/index.js +28 -0
  380. package/dist/data-grid/index.js.map +1 -0
  381. package/dist/date-picker/index.cjs +19 -0
  382. package/dist/date-picker/index.cjs.map +1 -0
  383. package/dist/date-picker/index.d.cts +106 -0
  384. package/dist/date-picker/index.d.ts +106 -0
  385. package/dist/date-picker/index.js +19 -0
  386. package/dist/date-picker/index.js.map +1 -0
  387. package/dist/divider/index.cjs +8 -0
  388. package/dist/divider/index.cjs.map +1 -0
  389. package/dist/divider/index.d.cts +9 -0
  390. package/dist/divider/index.d.ts +9 -0
  391. package/dist/divider/index.js +8 -0
  392. package/dist/divider/index.js.map +1 -0
  393. package/dist/drawer/index.cjs +13 -0
  394. package/dist/drawer/index.cjs.map +1 -0
  395. package/dist/drawer/index.d.cts +39 -0
  396. package/dist/drawer/index.d.ts +39 -0
  397. package/dist/drawer/index.js +13 -0
  398. package/dist/drawer/index.js.map +1 -0
  399. package/dist/dropdown/index.cjs +13 -0
  400. package/dist/dropdown/index.cjs.map +1 -0
  401. package/dist/dropdown/index.d.cts +66 -0
  402. package/dist/dropdown/index.d.ts +66 -0
  403. package/dist/dropdown/index.js +13 -0
  404. package/dist/dropdown/index.js.map +1 -0
  405. package/dist/empty-state/index.cjs +8 -0
  406. package/dist/empty-state/index.cjs.map +1 -0
  407. package/dist/empty-state/index.d.cts +20 -0
  408. package/dist/empty-state/index.d.ts +20 -0
  409. package/dist/empty-state/index.js +8 -0
  410. package/dist/empty-state/index.js.map +1 -0
  411. package/dist/file-upload/index.cjs +8 -0
  412. package/dist/file-upload/index.cjs.map +1 -0
  413. package/dist/file-upload/index.d.cts +27 -0
  414. package/dist/file-upload/index.d.ts +27 -0
  415. package/dist/file-upload/index.js +8 -0
  416. package/dist/file-upload/index.js.map +1 -0
  417. package/dist/footer/index.cjs +8 -0
  418. package/dist/footer/index.cjs.map +1 -0
  419. package/dist/footer/index.d.cts +7 -0
  420. package/dist/footer/index.d.ts +7 -0
  421. package/dist/footer/index.js +8 -0
  422. package/dist/footer/index.js.map +1 -0
  423. package/dist/header/index.cjs +13 -0
  424. package/dist/header/index.cjs.map +1 -0
  425. package/dist/header/index.d.cts +10 -0
  426. package/dist/header/index.d.ts +10 -0
  427. package/dist/header/index.js +13 -0
  428. package/dist/header/index.js.map +1 -0
  429. package/dist/index.cjs +269 -0
  430. package/dist/index.cjs.map +1 -0
  431. package/dist/index.css +8895 -0
  432. package/dist/index.css.d.ts +2 -0
  433. package/dist/index.d.cts +69 -0
  434. package/dist/index.d.ts +69 -0
  435. package/dist/index.js +269 -0
  436. package/dist/index.js.map +1 -0
  437. package/dist/inline-edit/index.cjs +11 -0
  438. package/dist/inline-edit/index.cjs.map +1 -0
  439. package/dist/inline-edit/index.d.cts +56 -0
  440. package/dist/inline-edit/index.d.ts +56 -0
  441. package/dist/inline-edit/index.js +11 -0
  442. package/dist/inline-edit/index.js.map +1 -0
  443. package/dist/input/index.cjs +11 -0
  444. package/dist/input/index.cjs.map +1 -0
  445. package/dist/input/index.d.cts +9 -0
  446. package/dist/input/index.d.ts +9 -0
  447. package/dist/input/index.js +11 -0
  448. package/dist/input/index.js.map +1 -0
  449. package/dist/kbd/index.cjs +9 -0
  450. package/dist/kbd/index.cjs.map +1 -0
  451. package/dist/kbd/index.d.cts +34 -0
  452. package/dist/kbd/index.d.ts +34 -0
  453. package/dist/kbd/index.js +9 -0
  454. package/dist/kbd/index.js.map +1 -0
  455. package/dist/menu/index.cjs +14 -0
  456. package/dist/menu/index.cjs.map +1 -0
  457. package/dist/menu/index.d.cts +14 -0
  458. package/dist/menu/index.d.ts +14 -0
  459. package/dist/menu/index.js +14 -0
  460. package/dist/menu/index.js.map +1 -0
  461. package/dist/modal/index.cjs +12 -0
  462. package/dist/modal/index.cjs.map +1 -0
  463. package/dist/modal/index.d.cts +34 -0
  464. package/dist/modal/index.d.ts +34 -0
  465. package/dist/modal/index.js +12 -0
  466. package/dist/modal/index.js.map +1 -0
  467. package/dist/navigation/index.cjs +14 -0
  468. package/dist/navigation/index.cjs.map +1 -0
  469. package/dist/navigation/index.d.cts +8 -0
  470. package/dist/navigation/index.d.ts +8 -0
  471. package/dist/navigation/index.js +14 -0
  472. package/dist/navigation/index.js.map +1 -0
  473. package/dist/number-input/index.cjs +8 -0
  474. package/dist/number-input/index.cjs.map +1 -0
  475. package/dist/number-input/index.d.cts +31 -0
  476. package/dist/number-input/index.d.ts +31 -0
  477. package/dist/number-input/index.js +8 -0
  478. package/dist/number-input/index.js.map +1 -0
  479. package/dist/o-t-p-input/index.cjs +8 -0
  480. package/dist/o-t-p-input/index.cjs.map +1 -0
  481. package/dist/o-t-p-input/index.d.cts +33 -0
  482. package/dist/o-t-p-input/index.d.ts +33 -0
  483. package/dist/o-t-p-input/index.js +8 -0
  484. package/dist/o-t-p-input/index.js.map +1 -0
  485. package/dist/page-layout/index.cjs +24 -0
  486. package/dist/page-layout/index.cjs.map +1 -0
  487. package/dist/page-layout/index.d.cts +28 -0
  488. package/dist/page-layout/index.d.ts +28 -0
  489. package/dist/page-layout/index.js +24 -0
  490. package/dist/page-layout/index.js.map +1 -0
  491. package/dist/pagination/index.cjs +17 -0
  492. package/dist/pagination/index.cjs.map +1 -0
  493. package/dist/pagination/index.d.cts +34 -0
  494. package/dist/pagination/index.d.ts +34 -0
  495. package/dist/pagination/index.js +17 -0
  496. package/dist/pagination/index.js.map +1 -0
  497. package/dist/pill/index.cjs +8 -0
  498. package/dist/pill/index.cjs.map +1 -0
  499. package/dist/pill/index.d.cts +20 -0
  500. package/dist/pill/index.d.ts +20 -0
  501. package/dist/pill/index.js +8 -0
  502. package/dist/pill/index.js.map +1 -0
  503. package/dist/popover/index.cjs +8 -0
  504. package/dist/popover/index.cjs.map +1 -0
  505. package/dist/popover/index.d.cts +35 -0
  506. package/dist/popover/index.d.ts +35 -0
  507. package/dist/popover/index.js +8 -0
  508. package/dist/popover/index.js.map +1 -0
  509. package/dist/progress/index.cjs +8 -0
  510. package/dist/progress/index.cjs.map +1 -0
  511. package/dist/progress/index.d.cts +18 -0
  512. package/dist/progress/index.d.ts +18 -0
  513. package/dist/progress/index.js +8 -0
  514. package/dist/progress/index.js.map +1 -0
  515. package/dist/radio/index.cjs +10 -0
  516. package/dist/radio/index.cjs.map +1 -0
  517. package/dist/radio/index.d.cts +33 -0
  518. package/dist/radio/index.d.ts +33 -0
  519. package/dist/radio/index.js +10 -0
  520. package/dist/radio/index.js.map +1 -0
  521. package/dist/renderIcon-C2lEMMzb.d.cts +30 -0
  522. package/dist/renderIcon-C2lEMMzb.d.ts +30 -0
  523. package/dist/segmented-control/index.cjs +11 -0
  524. package/dist/segmented-control/index.cjs.map +1 -0
  525. package/dist/segmented-control/index.d.cts +70 -0
  526. package/dist/segmented-control/index.d.ts +70 -0
  527. package/dist/segmented-control/index.js +11 -0
  528. package/dist/segmented-control/index.js.map +1 -0
  529. package/dist/select/index.cjs +13 -0
  530. package/dist/select/index.cjs.map +1 -0
  531. package/dist/select/index.d.cts +46 -0
  532. package/dist/select/index.d.ts +46 -0
  533. package/dist/select/index.js +13 -0
  534. package/dist/select/index.js.map +1 -0
  535. package/dist/sizes-DM6Rrrgq.d.cts +11 -0
  536. package/dist/sizes-DM6Rrrgq.d.ts +11 -0
  537. package/dist/skeleton/index.cjs +8 -0
  538. package/dist/skeleton/index.cjs.map +1 -0
  539. package/dist/skeleton/index.d.cts +14 -0
  540. package/dist/skeleton/index.d.ts +14 -0
  541. package/dist/skeleton/index.js +8 -0
  542. package/dist/skeleton/index.js.map +1 -0
  543. package/dist/slider/index.cjs +8 -0
  544. package/dist/slider/index.cjs.map +1 -0
  545. package/dist/slider/index.d.cts +37 -0
  546. package/dist/slider/index.d.ts +37 -0
  547. package/dist/slider/index.js +8 -0
  548. package/dist/slider/index.js.map +1 -0
  549. package/dist/snackbar/index.cjs +18 -0
  550. package/dist/snackbar/index.cjs.map +1 -0
  551. package/dist/snackbar/index.d.cts +68 -0
  552. package/dist/snackbar/index.d.ts +68 -0
  553. package/dist/snackbar/index.js +18 -0
  554. package/dist/snackbar/index.js.map +1 -0
  555. package/dist/spinner/index.cjs +9 -0
  556. package/dist/spinner/index.cjs.map +1 -0
  557. package/dist/spinner/index.d.cts +12 -0
  558. package/dist/spinner/index.d.ts +12 -0
  559. package/dist/spinner/index.js +9 -0
  560. package/dist/spinner/index.js.map +1 -0
  561. package/dist/split-button/index.cjs +13 -0
  562. package/dist/split-button/index.cjs.map +1 -0
  563. package/dist/split-button/index.d.cts +53 -0
  564. package/dist/split-button/index.d.ts +53 -0
  565. package/dist/split-button/index.js +13 -0
  566. package/dist/split-button/index.js.map +1 -0
  567. package/dist/stepper/index.cjs +8 -0
  568. package/dist/stepper/index.cjs.map +1 -0
  569. package/dist/stepper/index.d.cts +42 -0
  570. package/dist/stepper/index.d.ts +42 -0
  571. package/dist/stepper/index.js +8 -0
  572. package/dist/stepper/index.js.map +1 -0
  573. package/dist/switch/index.cjs +8 -0
  574. package/dist/switch/index.cjs.map +1 -0
  575. package/dist/switch/index.d.cts +15 -0
  576. package/dist/switch/index.d.ts +15 -0
  577. package/dist/switch/index.js +8 -0
  578. package/dist/switch/index.js.map +1 -0
  579. package/dist/table/index.cjs +33 -0
  580. package/dist/table/index.cjs.map +1 -0
  581. package/dist/table/index.d.cts +20 -0
  582. package/dist/table/index.d.ts +20 -0
  583. package/dist/table/index.js +33 -0
  584. package/dist/table/index.js.map +1 -0
  585. package/dist/tabs/index.cjs +13 -0
  586. package/dist/tabs/index.cjs.map +1 -0
  587. package/dist/tabs/index.d.cts +34 -0
  588. package/dist/tabs/index.d.ts +34 -0
  589. package/dist/tabs/index.js +13 -0
  590. package/dist/tabs/index.js.map +1 -0
  591. package/dist/tag-input/index.cjs +12 -0
  592. package/dist/tag-input/index.cjs.map +1 -0
  593. package/dist/tag-input/index.d.cts +36 -0
  594. package/dist/tag-input/index.d.ts +36 -0
  595. package/dist/tag-input/index.js +12 -0
  596. package/dist/tag-input/index.js.map +1 -0
  597. package/dist/textarea/index.cjs +10 -0
  598. package/dist/textarea/index.cjs.map +1 -0
  599. package/dist/textarea/index.d.cts +28 -0
  600. package/dist/textarea/index.d.ts +28 -0
  601. package/dist/textarea/index.js +10 -0
  602. package/dist/textarea/index.js.map +1 -0
  603. package/dist/timeline/index.cjs +8 -0
  604. package/dist/timeline/index.cjs.map +1 -0
  605. package/dist/timeline/index.d.cts +24 -0
  606. package/dist/timeline/index.d.ts +24 -0
  607. package/dist/timeline/index.js +8 -0
  608. package/dist/timeline/index.js.map +1 -0
  609. package/dist/toolbar/index.cjs +20 -0
  610. package/dist/toolbar/index.cjs.map +1 -0
  611. package/dist/toolbar/index.d.cts +13 -0
  612. package/dist/toolbar/index.d.ts +13 -0
  613. package/dist/toolbar/index.js +20 -0
  614. package/dist/toolbar/index.js.map +1 -0
  615. package/dist/tooltip/index.cjs +9 -0
  616. package/dist/tooltip/index.cjs.map +1 -0
  617. package/dist/tooltip/index.d.cts +25 -0
  618. package/dist/tooltip/index.d.ts +25 -0
  619. package/dist/tooltip/index.js +9 -0
  620. package/dist/tooltip/index.js.map +1 -0
  621. package/dist/tree-view/index.cjs +8 -0
  622. package/dist/tree-view/index.cjs.map +1 -0
  623. package/dist/tree-view/index.d.cts +36 -0
  624. package/dist/tree-view/index.d.ts +36 -0
  625. package/dist/tree-view/index.js +8 -0
  626. package/dist/tree-view/index.js.map +1 -0
  627. package/dist/virtual-list/index.cjs +9 -0
  628. package/dist/virtual-list/index.cjs.map +1 -0
  629. package/dist/virtual-list/index.d.cts +58 -0
  630. package/dist/virtual-list/index.d.ts +58 -0
  631. package/dist/virtual-list/index.js +9 -0
  632. package/dist/virtual-list/index.js.map +1 -0
  633. package/package.json +108 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Table/Table.component.tsx"],"sourcesContent":["import { useState, useMemo, useLayoutEffect, useRef } from 'react';\r\nimport React from 'react';\r\nimport {\r\n ChevronsUpDown,\r\n ArrowUp,\r\n ArrowDown,\r\n X,\r\n Check,\r\n Download,\r\n Columns3,\r\n AlignJustify,\r\n GripVertical,\r\n FolderOpen,\r\n SearchX,\r\n} from 'lucide-react';\r\nimport { DndContext, PointerSensor, KeyboardSensor, useSensor, useSensors } from '@dnd-kit/core';\r\nimport type { DragEndEvent } from '@dnd-kit/core';\r\nimport {\r\n SortableContext,\r\n horizontalListSortingStrategy,\r\n useSortable,\r\n sortableKeyboardCoordinates,\r\n arrayMove,\r\n} from '@dnd-kit/sortable';\r\nimport { CSS } from '@dnd-kit/utilities';\r\nimport type { TableColumn, TableProps, TableFilters, FilterValue } from './Table.types';\r\n\r\nexport type { TableColumn, TableProps, TableFilters, FilterValue };\r\nimport { Button } from '../Button';\r\nimport { Checkbox } from '../Checkbox';\r\nimport { Dropdown } from '../Dropdown';\r\nimport { EmptyState } from '../EmptyState';\r\nimport { Pagination } from '../Pagination';\r\nimport { SplitButton } from '../SplitButton';\r\nimport { Spinner } from '../Spinner';\r\nimport { TableFiltersDropdown } from './TableFiltersDropdown.component';\r\n\r\n// ── Types ─────────────────────────────────────────────────────────────────────\r\n\r\ntype Density = 'compact' | 'comfortable' | 'spacious';\r\n\r\nconst DENSITY_OPTIONS: { value: Density; label: string }[] = [\r\n { value: 'compact', label: 'Compact' },\r\n { value: 'comfortable', label: 'Comfortable' },\r\n { value: 'spacious', label: 'Spacious' },\r\n];\r\n\r\n// ── CSV helpers ───────────────────────────────────────────────────────────────\r\n\r\nfunction escapeCsvValue(value: string): string {\r\n if (value.includes(',') || value.includes('\\n') || value.includes('\"')) {\r\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\r\n }\r\n return value;\r\n}\r\n\r\n// ── SortableColumnHeader ──────────────────────────────────────────────────────\r\n// Defined as a standalone component so it can legally call useSortable().\r\n// Only rendered when draggableColumns=true (inside a DndContext + SortableContext).\r\n\r\ninterface SortableThProps {\r\n id: string;\r\n column: { label: string };\r\n isSortable: boolean;\r\n isCurrentlySorted: boolean;\r\n sortDirection: 'asc' | 'desc' | null;\r\n alignment: string;\r\n columnType: string;\r\n columnWidth: string | undefined;\r\n pinnedClass: string;\r\n stickyStyle: React.CSSProperties;\r\n onSortClick: () => void;\r\n}\r\n\r\nfunction SortableColumnHeader({\r\n id,\r\n column,\r\n isSortable,\r\n isCurrentlySorted,\r\n sortDirection,\r\n alignment,\r\n columnType,\r\n columnWidth,\r\n pinnedClass,\r\n stickyStyle,\r\n onSortClick,\r\n}: SortableThProps) {\r\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\r\n id,\r\n });\r\n\r\n const transformStr = CSS.Transform.toString(transform);\r\n\r\n const thClassName = [\r\n 'eidos-table-header-cell',\r\n `eidos-table-header-cell-${columnType}`,\r\n isSortable ? 'eidos-table-sortable' : '',\r\n isCurrentlySorted ? 'eidos-table-sorted' : '',\r\n `eidos-table-align-${alignment}`,\r\n pinnedClass,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <th\r\n ref={setNodeRef as React.LegacyRef<HTMLTableCellElement>}\r\n className={thClassName}\r\n style={{\r\n width: columnWidth,\r\n ...stickyStyle,\r\n ...(transformStr ? { transform: transformStr } : {}),\r\n transition: transition ?? undefined,\r\n opacity: isDragging ? 0.5 : 1,\r\n }}\r\n data-col-key={id}\r\n onClick={() => isSortable && onSortClick()}\r\n {...attributes}\r\n >\r\n {/* Grip - absolutely positioned in the left padding zone so it never\r\n displaces the column label or causes layout shift on hover. */}\r\n <span\r\n className=\"eidos-table-drag-handle\"\r\n {...listeners}\r\n onClick={(e) => e.stopPropagation()}\r\n title=\"Drag to reorder\"\r\n >\r\n <GripVertical size={12} />\r\n </span>\r\n <div className={`eidos-table-header-content eidos-table-align-${alignment}`}>\r\n <span className=\"eidos-table-header-label\">{column.label}</span>\r\n {isSortable && (\r\n <div className=\"eidos-table-sort-indicator\">\r\n {sortDirection === 'asc' && <ArrowUp size={14} />}\r\n {sortDirection === 'desc' && <ArrowDown size={14} />}\r\n {!sortDirection && <ChevronsUpDown size={14} />}\r\n </div>\r\n )}\r\n </div>\r\n </th>\r\n );\r\n}\r\n\r\n// ── Table ─────────────────────────────────────────────────────────────────────\r\n\r\nexport const Table = <T extends Record<string, unknown>>({\r\n data,\r\n columns,\r\n loading = false,\r\n emptyMessage = 'No data available',\r\n onRowClick,\r\n className,\r\n showFooter = false,\r\n totalItems,\r\n showPagination = false,\r\n pageSize = 25,\r\n pageSizeOptions = [10, 25, 50, 100],\r\n onSortChange,\r\n currentSort,\r\n filters = {},\r\n onFiltersChange,\r\n defaultFilters,\r\n showFilters = false,\r\n // Selection\r\n selectable = false,\r\n rowKey,\r\n selectedRows: controlledSelected,\r\n defaultSelectedRows = [],\r\n onSelectionChange,\r\n bulkActions = [],\r\n // New features\r\n density = 'comfortable',\r\n showDensity = false,\r\n showColumnVisibility = false,\r\n showExport = false,\r\n draggableColumns = false,\r\n onColumnReorder,\r\n}: TableProps<T>) => {\r\n // ── Column ordering (drag-reorder) ────────────────────────────────────────\r\n const [columnOrder, setColumnOrder] = useState<string[]>(() => columns.map((c) => String(c.key)));\r\n\r\n // Derived-state reset: when the set of column keys changes, reset the order.\r\n // Calling setState during render is the React-idiomatic way to do this.\r\n const columnKeysSignature = columns.map((c) => String(c.key)).join('\\0');\r\n const prevKeysRef = useRef(columnKeysSignature);\r\n if (prevKeysRef.current !== columnKeysSignature) {\r\n prevKeysRef.current = columnKeysSignature;\r\n setColumnOrder(columns.map((c) => String(c.key)));\r\n }\r\n\r\n const orderedColumns = useMemo(() => {\r\n const orderMap = new Map(columnOrder.map((key, idx) => [key, idx]));\r\n return [...columns].sort((a, b) => {\r\n const ai = orderMap.get(String(a.key)) ?? Infinity;\r\n const bi = orderMap.get(String(b.key)) ?? Infinity;\r\n return ai - bi;\r\n });\r\n }, [columns, columnOrder]);\r\n\r\n // ── Density (internal state when showDensity=true) ────────────────────────\r\n const [internalDensity, setInternalDensity] = useState<Density>(density as Density);\r\n // When showDensity is true the table owns density; otherwise respect the prop.\r\n const effectiveDensity: Density = showDensity ? internalDensity : (density as Density);\r\n\r\n // ── Column visibility ─────────────────────────────────────────────────────\r\n const [hiddenColumnKeys, setHiddenColumnKeys] = useState<Set<string>>(() => new Set<string>());\r\n\r\n const visibleColumns = useMemo(\r\n () => orderedColumns.filter((c) => !hiddenColumnKeys.has(String(c.key))),\r\n [orderedColumns, hiddenColumnKeys],\r\n );\r\n\r\n // ── Pinned / sticky columns ────────────────────────────────────────────────\r\n const theadRef = useRef<HTMLTableSectionElement>(null);\r\n const [pinnedOffsets, setPinnedOffsets] = useState<\r\n Map<string, { side: 'left' | 'right'; offset: number }>\r\n >(new Map());\r\n\r\n useLayoutEffect(() => {\r\n const hasPinned = visibleColumns.some((c) => c.pin);\r\n if (!hasPinned || !theadRef.current) {\r\n setPinnedOffsets(new Map());\r\n return;\r\n }\r\n\r\n const headerRow = theadRef.current.querySelector('tr');\r\n if (!headerRow) return;\r\n\r\n const cells = Array.from(headerRow.querySelectorAll<HTMLTableCellElement>('th[data-col-key]'));\r\n\r\n const newOffsets = new Map<string, { side: 'left' | 'right'; offset: number }>();\r\n\r\n // Left-pinned: scan left-to-right.\r\n // Checkbox (when selectable) counts as a left-pinned element.\r\n let leftAccum = 0;\r\n for (const cell of cells) {\r\n const key = cell.dataset.colKey!;\r\n if (key === '__checkbox__') {\r\n newOffsets.set(key, { side: 'left', offset: leftAccum });\r\n leftAccum += cell.offsetWidth;\r\n } else {\r\n const col = visibleColumns.find((c) => String(c.key) === key);\r\n if (col?.pin === 'left') {\r\n newOffsets.set(key, { side: 'left', offset: leftAccum });\r\n leftAccum += cell.offsetWidth;\r\n }\r\n }\r\n }\r\n\r\n // Right-pinned: scan right-to-left.\r\n let rightAccum = 0;\r\n for (let i = cells.length - 1; i >= 0; i--) {\r\n const cell = cells[i];\r\n const key = cell.dataset.colKey!;\r\n const col = visibleColumns.find((c) => String(c.key) === key);\r\n if (col?.pin === 'right') {\r\n newOffsets.set(key, { side: 'right', offset: rightAccum });\r\n rightAccum += cell.offsetWidth;\r\n }\r\n }\r\n\r\n setPinnedOffsets(newOffsets);\r\n }, [visibleColumns, selectable]);\r\n\r\n // ── Selection state (controlled / uncontrolled) ──────────────────────────\r\n const isControlledSelection = controlledSelected !== undefined;\r\n const [internalSelected, setInternalSelected] = useState<string[]>(defaultSelectedRows);\r\n const selectedSet = useMemo(\r\n () => new Set(isControlledSelection ? controlledSelected : internalSelected),\r\n [isControlledSelection, controlledSelected, internalSelected],\r\n );\r\n\r\n /** Stable string key for a row - uses `rowKey` prop, then \"id\", then index. */\r\n const getRowKey = (item: T, index: number): string => {\r\n if (rowKey) return String(item[rowKey]);\r\n if ('id' in item) return String(item.id);\r\n return String(index);\r\n };\r\n\r\n const commitSelection = (keys: string[]) => {\r\n if (!isControlledSelection) setInternalSelected(keys);\r\n const rows = data.filter((item, idx) => keys.includes(getRowKey(item, idx)));\r\n onSelectionChange?.(keys, rows);\r\n };\r\n\r\n const toggleRow = (key: string) => {\r\n const next = selectedSet.has(key)\r\n ? [...selectedSet].filter((k) => k !== key)\r\n : [...selectedSet, key];\r\n commitSelection(next);\r\n };\r\n\r\n const allKeys = useMemo(\r\n () => data.map((item, idx) => getRowKey(item, idx)),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [data, rowKey],\r\n );\r\n\r\n const allSelected = allKeys.length > 0 && allKeys.every((k) => selectedSet.has(k));\r\n const someSelected = !allSelected && allKeys.some((k) => selectedSet.has(k));\r\n\r\n const toggleAll = () => {\r\n commitSelection(allSelected ? [] : allKeys);\r\n };\r\n\r\n const clearSelection = () => commitSelection([]);\r\n\r\n // ── Pagination ────────────────────────────────────────────────────────────\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [currentPageSize, setCurrentPageSize] = useState(pageSize);\r\n\r\n const displayData = useMemo(() => {\r\n if (!showPagination) return data;\r\n const startIndex = (currentPage - 1) * currentPageSize;\r\n return data.slice(startIndex, startIndex + currentPageSize);\r\n }, [data, showPagination, currentPage, currentPageSize]);\r\n\r\n const totalPages = Math.ceil(data.length / currentPageSize);\r\n\r\n const handleSort = (key: string) => {\r\n const newDirection =\r\n currentSort?.key === key && currentSort?.direction === 'asc' ? 'desc' : 'asc';\r\n onSortChange?.(key, newDirection);\r\n };\r\n\r\n const handlePageChange = (page: number) => setCurrentPage(page);\r\n const handlePageSizeChange = (newPageSize: number) => {\r\n setCurrentPageSize(newPageSize);\r\n setCurrentPage(1);\r\n };\r\n\r\n // ── Derived UI state ──────────────────────────────────────────────────────\r\n const hasSelection = selectedSet.size > 0;\r\n const showToolbar =\r\n (showFilters && !!onFiltersChange) ||\r\n showColumnVisibility ||\r\n showExport ||\r\n showDensity ||\r\n (selectable && hasSelection);\r\n\r\n const selectedItems = useMemo(\r\n () => data.filter((item, idx) => selectedSet.has(getRowKey(item, idx))),\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n [data, selectedSet, rowKey],\r\n );\r\n\r\n // ── CSV Export ────────────────────────────────────────────────────────────\r\n const getRawValue = (item: T, column: TableColumn<T>): string => {\r\n const value =\r\n typeof column.key === 'string' && column.key.includes('.')\r\n ? (column.key as string)\r\n .split('.')\r\n .reduce(\r\n (obj: unknown, k: string) => (obj as Record<string, unknown>)?.[k],\r\n item as unknown,\r\n )\r\n : item[column.key as keyof T];\r\n return String(value ?? '');\r\n };\r\n\r\n const handleExportCsv = () => {\r\n const headers = visibleColumns.map((c) => escapeCsvValue(c.label)).join(',');\r\n const rows = data.map((item) =>\r\n visibleColumns.map((col) => escapeCsvValue(getRawValue(item, col))).join(','),\r\n );\r\n const csv = [headers, ...rows].join('\\n');\r\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\r\n const url = URL.createObjectURL(blob);\r\n const link = document.createElement('a');\r\n link.href = url;\r\n link.download = 'export.csv';\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n URL.revokeObjectURL(url);\r\n };\r\n\r\n // ── DnD setup ─────────────────────────────────────────────────────────────\r\n const sensors = useSensors(\r\n useSensor(PointerSensor),\r\n useSensor(KeyboardSensor, {\r\n coordinateGetter: sortableKeyboardCoordinates,\r\n }),\r\n );\r\n\r\n const handleDragEnd = (event: DragEndEvent) => {\r\n const { active, over } = event;\r\n if (!over || active.id === over.id) return;\r\n\r\n const activeId = String(active.id);\r\n const overId = String(over.id);\r\n const oldIndex = columnOrder.indexOf(activeId);\r\n const newIndex = columnOrder.indexOf(overId);\r\n if (oldIndex === -1 || newIndex === -1) return;\r\n\r\n const newOrder = arrayMove(columnOrder, oldIndex, newIndex);\r\n setColumnOrder(newOrder);\r\n\r\n if (onColumnReorder) {\r\n const orderMap = new Map(newOrder.map((key, idx) => [key, idx]));\r\n const reordered = [...columns].sort((a, b) => {\r\n const ai = orderMap.get(String(a.key)) ?? Infinity;\r\n const bi = orderMap.get(String(b.key)) ?? Infinity;\r\n return ai - bi;\r\n });\r\n onColumnReorder(reordered);\r\n }\r\n };\r\n\r\n // ── Helpers ───────────────────────────────────────────────────────────────\r\n\r\n /** Returns sticky style + className for body <td> cells (zIndex: 1). */\r\n const getCellPinnedProps = (\r\n colKey: string,\r\n ): { style: React.CSSProperties; className: string } => {\r\n const pinInfo = pinnedOffsets.get(colKey);\r\n if (!pinInfo) return { style: {}, className: '' };\r\n return {\r\n style: {\r\n position: 'sticky',\r\n [pinInfo.side]: pinInfo.offset,\r\n zIndex: 1,\r\n },\r\n className:\r\n pinInfo.side === 'left'\r\n ? 'eidos-table-cell--pinned-left'\r\n : 'eidos-table-cell--pinned-right',\r\n };\r\n };\r\n\r\n /** Returns sticky style + className for header <th> cells (zIndex: 3). */\r\n const getHeaderPinnedProps = (\r\n colKey: string,\r\n ): { style: React.CSSProperties; className: string } => {\r\n const pinInfo = pinnedOffsets.get(colKey);\r\n if (!pinInfo) return { style: {}, className: '' };\r\n return {\r\n style: {\r\n position: 'sticky',\r\n [pinInfo.side]: pinInfo.offset,\r\n zIndex: 3,\r\n },\r\n className:\r\n pinInfo.side === 'left'\r\n ? 'eidos-table-header-cell--pinned-left'\r\n : 'eidos-table-header-cell--pinned-right',\r\n };\r\n };\r\n\r\n // ── Density class ─────────────────────────────────────────────────────────\r\n const densityClass = effectiveDensity !== 'comfortable' ? `eidos-table--${effectiveDensity}` : '';\r\n\r\n // ── Loading ───────────────────────────────────────────────────────────────\r\n if (loading) {\r\n return (\r\n <div className={`eidos-table-container ${className || ''}`}>\r\n <div className=\"eidos-table-loading\">\r\n <Spinner size=\"md\" />\r\n <p>Loading...</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n // ── Density panel (Dropdown content) ──────────────────────────────────────\r\n const densityPanel = (\r\n <div className=\"eidos-table-menu-panel\">\r\n {DENSITY_OPTIONS.map((option) => (\r\n <button\r\n key={option.value}\r\n className={[\r\n 'eidos-table-menu-item',\r\n effectiveDensity === option.value ? 'eidos-table-menu-item--active' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n onClick={() => setInternalDensity(option.value)}\r\n >\r\n <span className=\"eidos-table-menu-item-check\">\r\n {effectiveDensity === option.value && <Check size={14} />}\r\n </span>\r\n <span>{option.label}</span>\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n\r\n // ── Column visibility panel (Dropdown content) ────────────────────────────\r\n const columnVisibilityPanel = (\r\n <div className=\"eidos-table-menu-panel\">\r\n {/* Use orderedColumns so list order mirrors current column order */}\r\n {orderedColumns.map((col) => {\r\n const key = String(col.key);\r\n const isVisible = !hiddenColumnKeys.has(key);\r\n const isLastVisible = visibleColumns.length === 1 && isVisible;\r\n return (\r\n <button\r\n key={key}\r\n className={['eidos-table-menu-item', isVisible ? 'eidos-table-menu-item--active' : '']\r\n .filter(Boolean)\r\n .join(' ')}\r\n disabled={isLastVisible}\r\n onClick={() => {\r\n setHiddenColumnKeys((prev) => {\r\n const next = new Set(prev);\r\n if (next.has(key)) next.delete(key);\r\n else next.add(key);\r\n return next;\r\n });\r\n }}\r\n >\r\n <Checkbox\r\n checked={isVisible}\r\n disabled={isLastVisible}\r\n size=\"sm\"\r\n onChange={() => {\r\n /* click handled by parent button */\r\n }}\r\n />\r\n <span>{col.label}</span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n );\r\n\r\n // ── SortableContext items: visible column keys only ───────────────────────\r\n const sortableItems = visibleColumns.map((c) => String(c.key));\r\n\r\n // ── Main JSX ──────────────────────────────────────────────────────────────\r\n const tableContent = (\r\n <div className={`eidos-table-container ${className || ''}`}>\r\n {/* ── Toolbar ───────────────────────────────────────────────────────── */}\r\n {showToolbar && (\r\n <div className=\"eidos-table-toolbar\">\r\n {/* Left - bulk actions / selection info */}\r\n <div className=\"eidos-table-toolbar-left\">\r\n {selectable && hasSelection && (\r\n <>\r\n <span className=\"eidos-table-selection-count\">{selectedSet.size} selected</span>\r\n\r\n {bulkActions.length > 0 && (\r\n <div className=\"eidos-table-bulk-actions\">\r\n {bulkActions.map((action) => {\r\n const isDisabled =\r\n typeof action.disabled === 'function'\r\n ? action.disabled(selectedItems)\r\n : (action.disabled ?? false);\r\n\r\n if (action.type === 'split-button') {\r\n return (\r\n <SplitButton\r\n key={action.id}\r\n size=\"sm\"\r\n variant={action.variant ?? 'outlined'}\r\n color={action.color ?? 'secondary'}\r\n preIcon={action.icon}\r\n disabled={isDisabled}\r\n label={action.label}\r\n onClick={() => action.onClick(selectedItems)}\r\n options={action.options.map((option) => ({\r\n id: option.id,\r\n label: option.label,\r\n icon: option.icon,\r\n disabled: option.disabled,\r\n onClick: () => option.onClick(selectedItems),\r\n }))}\r\n />\r\n );\r\n }\r\n\r\n return action.label ? (\r\n <Button\r\n key={action.id}\r\n size=\"sm\"\r\n variant={action.variant ?? 'outlined'}\r\n color={action.color ?? 'secondary'}\r\n preIcon={action.icon}\r\n posIcon={action.posIcon}\r\n disabled={isDisabled}\r\n onClick={() => action.onClick(selectedItems)}\r\n >\r\n {action.label}\r\n </Button>\r\n ) : action.icon ? (\r\n <Button\r\n key={action.id}\r\n size=\"sm\"\r\n variant={action.variant ?? 'outlined'}\r\n color={action.color ?? 'secondary'}\r\n icon={action.icon}\r\n disabled={isDisabled}\r\n onClick={() => action.onClick(selectedItems)}\r\n />\r\n ) : null;\r\n })}\r\n </div>\r\n )}\r\n\r\n <button\r\n className=\"eidos-table-clear-selection\"\r\n onClick={clearSelection}\r\n aria-label=\"Clear selection\"\r\n >\r\n <X size={14} />\r\n </button>\r\n </>\r\n )}\r\n </div>\r\n\r\n {/* Right - density, column visibility, export, filter */}\r\n <div className=\"eidos-table-toolbar-right\">\r\n {showDensity && (\r\n <Dropdown\r\n placement=\"bottom\"\r\n align=\"end\"\r\n autoWidth={false}\r\n trigger={\r\n <Button variant=\"text\" size=\"sm\" preIcon={AlignJustify}>\r\n Density\r\n </Button>\r\n }\r\n content={densityPanel}\r\n />\r\n )}\r\n\r\n {showColumnVisibility && (\r\n <Dropdown\r\n placement=\"bottom\"\r\n align=\"end\"\r\n autoWidth={false}\r\n trigger={\r\n <Button variant=\"text\" size=\"sm\" preIcon={Columns3}>\r\n Columns\r\n </Button>\r\n }\r\n content={columnVisibilityPanel}\r\n />\r\n )}\r\n\r\n {showExport && (\r\n <Button\r\n variant=\"text\"\r\n size=\"sm\"\r\n icon={Download}\r\n onClick={handleExportCsv}\r\n tooltip=\"Export CSV\"\r\n />\r\n )}\r\n\r\n {showFilters && onFiltersChange && (\r\n <TableFiltersDropdown\r\n columns={columns}\r\n filters={filters}\r\n onFiltersChange={onFiltersChange}\r\n defaultFilters={defaultFilters}\r\n />\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* ── Table (wrapped for horizontal scroll) ─────────────────────────── */}\r\n <div className=\"eidos-table-scroll\">\r\n <table\r\n className={[\r\n 'eidos-table',\r\n densityClass,\r\n draggableColumns ? 'eidos-table--draggable-columns' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n >\r\n <thead ref={theadRef}>\r\n <tr>\r\n {selectable && (\r\n <th\r\n className={[\r\n 'eidos-table-header-cell',\r\n 'eidos-table-checkbox-cell',\r\n getHeaderPinnedProps('__checkbox__').className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n style={getHeaderPinnedProps('__checkbox__').style}\r\n data-col-key=\"__checkbox__\"\r\n >\r\n <Checkbox\r\n size=\"sm\"\r\n checked={allSelected}\r\n indeterminate={someSelected}\r\n onChange={toggleAll}\r\n aria-label=\"Select all rows\"\r\n />\r\n </th>\r\n )}\r\n\r\n {/* ── Headers: draggable or plain ──────────────────────────── */}\r\n {draggableColumns\r\n ? visibleColumns.map((column) => {\r\n const colKey = String(column.key);\r\n const columnType = column.type || 'data';\r\n const columnWidth =\r\n column.type === 'icon' ? 'var(--component-size-lg)' : column.width;\r\n const isSortable = !!column.sortable;\r\n const isCurrentlySorted = currentSort?.key === colKey;\r\n const sortDirection = isCurrentlySorted\r\n ? (currentSort!.direction as 'asc' | 'desc')\r\n : null;\r\n const alignment = column.align || 'left';\r\n const { style: pinnedStyle, className: pinnedClass } =\r\n getHeaderPinnedProps(colKey);\r\n\r\n return (\r\n <SortableColumnHeader\r\n key={colKey}\r\n id={colKey}\r\n column={column}\r\n isSortable={isSortable}\r\n isCurrentlySorted={!!isCurrentlySorted}\r\n sortDirection={sortDirection}\r\n alignment={alignment}\r\n columnType={columnType}\r\n columnWidth={columnWidth}\r\n pinnedClass={pinnedClass}\r\n stickyStyle={pinnedStyle}\r\n onSortClick={() => handleSort(colKey)}\r\n />\r\n );\r\n })\r\n : visibleColumns.map((column, index) => {\r\n const colKey = String(column.key);\r\n const columnType = column.type || 'data';\r\n const columnWidth =\r\n column.type === 'icon' ? 'var(--component-size-lg)' : column.width;\r\n const isSortable = column.sortable;\r\n const isCurrentlySorted = currentSort?.key === colKey;\r\n const sortDirection = isCurrentlySorted ? currentSort!.direction : null;\r\n const alignment = column.align || 'left';\r\n const alignmentClass = `eidos-table-align-${alignment}`;\r\n const { style: pinnedStyle, className: pinnedClass } =\r\n getHeaderPinnedProps(colKey);\r\n\r\n return (\r\n <th\r\n key={index}\r\n className={[\r\n 'eidos-table-header-cell',\r\n `eidos-table-header-cell-${columnType}`,\r\n isSortable ? 'eidos-table-sortable' : '',\r\n isCurrentlySorted ? 'eidos-table-sorted' : '',\r\n alignmentClass,\r\n pinnedClass,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n style={{ width: columnWidth, ...pinnedStyle }}\r\n data-col-key={colKey}\r\n onClick={() => isSortable && handleSort(colKey)}\r\n >\r\n <div className={`eidos-table-header-content ${alignmentClass}`}>\r\n <span>{column.label}</span>\r\n {isSortable && (\r\n <div className=\"eidos-table-sort-indicator\">\r\n {sortDirection === 'asc' && <ArrowUp size={14} />}\r\n {sortDirection === 'desc' && <ArrowDown size={14} />}\r\n {!sortDirection && <ChevronsUpDown size={14} />}\r\n </div>\r\n )}\r\n </div>\r\n </th>\r\n );\r\n })}\r\n </tr>\r\n </thead>\r\n <tbody>\r\n {displayData.length > 0 ? (\r\n displayData.map((item, rowIndex) => {\r\n const globalIndex = showPagination\r\n ? (currentPage - 1) * currentPageSize + rowIndex\r\n : rowIndex;\r\n const key = getRowKey(item, globalIndex);\r\n const isSelected = selectedSet.has(key);\r\n\r\n return (\r\n <tr\r\n key={key}\r\n className={[\r\n 'eidos-table-row',\r\n onRowClick ? 'eidos-table-clickable' : '',\r\n isSelected ? 'eidos-table-row--selected' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n onClick={() => onRowClick?.(item)}\r\n >\r\n {selectable && (\r\n <td\r\n className={[\r\n 'eidos-table-cell',\r\n 'eidos-table-checkbox-cell',\r\n getCellPinnedProps('__checkbox__').className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n style={getCellPinnedProps('__checkbox__').style}\r\n onClick={(e) => {\r\n e.stopPropagation();\r\n toggleRow(key);\r\n }}\r\n >\r\n {/* Wrap in a span so Checkbox click-events don't\r\n bubble to the <td> and cause a double-toggle.\r\n The <td> onClick handles toggling when the user\r\n clicks the cell margin outside the checkbox. */}\r\n <span onClick={(e) => e.stopPropagation()}>\r\n <Checkbox\r\n size=\"sm\"\r\n checked={isSelected}\r\n onChange={() => toggleRow(key)}\r\n aria-label={`Select row ${globalIndex + 1}`}\r\n />\r\n </span>\r\n </td>\r\n )}\r\n {visibleColumns.map((column, colIndex) => {\r\n const colKey = String(column.key);\r\n const value =\r\n typeof column.key === 'string' && column.key.includes('.')\r\n ? (column.key as string)\r\n .split('.')\r\n .reduce(\r\n (obj: unknown, k: string) => (obj as Record<string, unknown>)?.[k],\r\n item as unknown,\r\n )\r\n : item[column.key as keyof T];\r\n\r\n const columnType = column.type || 'data';\r\n const columnWidth =\r\n column.type === 'icon' ? 'var(--component-size-lg)' : column.width;\r\n const alignment = column.align || 'left';\r\n const alignmentClass = `eidos-table-align-${alignment}`;\r\n const { style: pinnedStyle, className: pinnedClass } =\r\n getCellPinnedProps(colKey);\r\n\r\n return (\r\n <td\r\n key={colIndex}\r\n className={[\r\n 'eidos-table-cell',\r\n `eidos-table-cell-${columnType}`,\r\n alignmentClass,\r\n pinnedClass,\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n style={{ width: columnWidth, ...pinnedStyle }}\r\n // `type: 'action'` cells exist specifically to hold\r\n // interactive controls (a row-actions Menu/button,\r\n // typically) - without this, clicking them bubbles\r\n // straight into `onRowClick` on the <tr> below,\r\n // e.g. opening a details drawer at the same time as\r\n // (or instead of) the action itself. Mirrors the\r\n // selectable checkbox cell's own stopPropagation\r\n // above, for the same reason.\r\n onClick={columnType === 'action' ? (e) => e.stopPropagation() : undefined}\r\n >\r\n {column.render ? column.render(value, item) : String(value ?? '')}\r\n </td>\r\n );\r\n })}\r\n </tr>\r\n );\r\n })\r\n ) : (\r\n <tr className=\"eidos-table-empty-row\">\r\n <td\r\n colSpan={selectable ? visibleColumns.length + 1 : visibleColumns.length}\r\n className=\"eidos-table-cell eidos-table-empty-cell\"\r\n >\r\n {Object.keys(filters).length > 0 ? (\r\n <EmptyState\r\n icon={<SearchX />}\r\n title=\"No results found\"\r\n description=\"Try adjusting your filters or search terms.\"\r\n action={\r\n onFiltersChange ? (\r\n <Button\r\n size=\"sm\"\r\n variant=\"outlined\"\r\n color=\"primary\"\r\n onClick={() => onFiltersChange({})}\r\n >\r\n Clear filters\r\n </Button>\r\n ) : undefined\r\n }\r\n size=\"sm\"\r\n />\r\n ) : (\r\n <EmptyState\r\n icon={<FolderOpen />}\r\n title={emptyMessage}\r\n description=\"There are no records to display.\"\r\n size=\"sm\"\r\n />\r\n )}\r\n </td>\r\n </tr>\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n {/* ── Footer / Pagination ───────────────────────────────────────────── */}\r\n {showFooter && (\r\n <div className=\"eidos-table-footer\">\r\n <div className=\"eidos-table-footer-content\">\r\n {showPagination && data.length > 0 ? (\r\n <Pagination\r\n page={currentPage}\r\n totalPages={totalPages}\r\n onChange={handlePageChange}\r\n totalItems={totalItems ?? data.length}\r\n pageSize={currentPageSize}\r\n onPageSizeChange={handlePageSizeChange}\r\n pageSizeOptions={pageSizeOptions}\r\n size=\"sm\"\r\n />\r\n ) : (\r\n <span className=\"eidos-table-results-info\">\r\n Showing {data.length} of {totalItems ?? data.length} results\r\n </span>\r\n )}\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n\r\n // ── Wrap with DnD context when draggableColumns=true ─────────────────────\r\n if (draggableColumns) {\r\n return (\r\n <DndContext sensors={sensors} onDragEnd={handleDragEnd}>\r\n <SortableContext items={sortableItems} strategy={horizontalListSortingStrategy}>\r\n {tableContent}\r\n </SortableContext>\r\n </DndContext>\r\n );\r\n }\r\n\r\n return tableContent;\r\n};\r\n"],"mappings":"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","names":[]}
@@ -0,0 +1,88 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+ var _chunkTBMVUI7Scjs = require('./chunk-TBMVUI7S.cjs');
4
+
5
+
6
+ var _chunkR5QPUQSIcjs = require('./chunk-R5QPUQSI.cjs');
7
+
8
+ // src/components/Chip/Chip.component.tsx
9
+ var _lucidereact = require('lucide-react');
10
+ var _jsxruntime = require('react/jsx-runtime');
11
+ var Chip = ({
12
+ variant = "filled",
13
+ color = "primary",
14
+ size = "md",
15
+ disabled = false,
16
+ fullWidth = false,
17
+ tooltip,
18
+ className = "",
19
+ preIcon,
20
+ posIcon,
21
+ children,
22
+ onClick,
23
+ onRemove,
24
+ ...chipProps
25
+ }) => {
26
+ const isClickable = !!onClick;
27
+ const isRemovable = !!onRemove;
28
+ const chipClasses = [
29
+ "eidos-chip",
30
+ `eidos-chip--${variant}`,
31
+ `eidos-chip--${color}`,
32
+ `eidos-chip--${size}`,
33
+ disabled && "eidos-chip--disabled",
34
+ isClickable && "eidos-chip--clickable",
35
+ isRemovable && "eidos-chip--removable",
36
+ fullWidth && "eidos-chip--full-width",
37
+ className
38
+ ].filter(Boolean).join(" ");
39
+ const handleClick = () => {
40
+ if (disabled || !onClick) return;
41
+ onClick();
42
+ };
43
+ const handleRemove = (e) => {
44
+ e.stopPropagation();
45
+ if (disabled || !onRemove) return;
46
+ onRemove();
47
+ };
48
+ const ChipElement = isClickable && !isRemovable ? "button" : "div";
49
+ const chipContent = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
50
+ ChipElement,
51
+ {
52
+ className: chipClasses,
53
+ disabled: ChipElement === "button" ? disabled : void 0,
54
+ onClick: isClickable ? handleClick : void 0,
55
+ role: ChipElement === "div" && isClickable ? "button" : void 0,
56
+ tabIndex: ChipElement === "div" && isClickable ? 0 : void 0,
57
+ onKeyDown: ChipElement === "div" && isClickable ? (e) => {
58
+ if ((e.key === "Enter" || e.key === " ") && !disabled) {
59
+ e.preventDefault();
60
+ handleClick();
61
+ }
62
+ } : void 0,
63
+ ...chipProps,
64
+ children: [
65
+ preIcon && _chunkTBMVUI7Scjs.renderIcon.call(void 0, preIcon, "eidos-chip--pre-icon"),
66
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-chip--copy", children }),
67
+ posIcon && _chunkTBMVUI7Scjs.renderIcon.call(void 0, posIcon, "eidos-chip--pos-icon"),
68
+ isRemovable && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
69
+ "button",
70
+ {
71
+ className: "eidos-chip--remove-button",
72
+ onClick: handleRemove,
73
+ disabled,
74
+ "aria-label": "Remove",
75
+ type: "button",
76
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.X, { className: "eidos-chip--remove-icon" })
77
+ }
78
+ )
79
+ ]
80
+ }
81
+ );
82
+ return tooltip ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkR5QPUQSIcjs.Tooltip, { message: tooltip, children: chipContent }) : chipContent;
83
+ };
84
+
85
+
86
+
87
+ exports.Chip = Chip;
88
+ //# sourceMappingURL=chunk-O5ZPSZNY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-O5ZPSZNY.cjs","../src/components/Chip/Chip.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACNA,2CAAkB;AAqDd,+CAAA;AAhDG,IAAM,KAAA,EAA4B,CAAC;AAAA,EACxC,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,KAAA;AAAA,EACX,UAAA,EAAY,KAAA;AAAA,EACZ,OAAA;AAAA,EACA,UAAA,EAAY,EAAA;AAAA,EACZ,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,YAAA,EAAc,CAAC,CAAC,OAAA;AACtB,EAAA,MAAM,YAAA,EAAc,CAAC,CAAC,QAAA;AAGtB,EAAA,MAAM,YAAA,EAAc;AAAA,IAClB,YAAA;AAAA,IACA,CAAA,YAAA,EAAe,OAAO,CAAA,CAAA;AACF,IAAA;AACD,IAAA;AACP,IAAA;AACG,IAAA;AACA,IAAA;AACF,IAAA;AACb,IAAA;AAGM,EAAA;AAEY,EAAA;AACD,IAAA;AACT,IAAA;AACV,EAAA;AAEsB,EAAA;AACF,IAAA;AACD,IAAA;AACR,IAAA;AACX,EAAA;AAGoB,EAAA;AAGlB,EAAA;AAAC,IAAA;AAAA,IAAA;AACY,MAAA;AACD,MAAA;AACD,MAAA;AACH,MAAA;AACI,MAAA;AAER,MAAA;AAEqB,QAAA;AACI,UAAA;AACL,UAAA;AACd,QAAA;AAEF,MAAA;AAEF,MAAA;AAEH,MAAA;AAAW,QAAA;AAEZ,wBAAA;AAEY,QAAA;AAGV,QAAA;AAAC,UAAA;AAAA,UAAA;AACW,YAAA;AACD,YAAA;AACT,YAAA;AACW,YAAA;AACN,YAAA;AAEL,YAAA;AAAuC,UAAA;AACzC,QAAA;AAAA,MAAA;AAAA,IAAA;AAEJ,EAAA;AAGe,EAAA;AACnB;ADV2B;AACA;AACA;AACA","file":"/Users/pedromealha/Documents/Repositories/Personal/eidos-ui/dist/chunk-O5ZPSZNY.cjs","sourcesContent":[null,"import React from 'react';\r\nimport { X } from 'lucide-react';\r\nimport type { ChipProps } from './Chip.types';\r\nimport { Tooltip } from '../Tooltip/Tooltip.component';\r\nimport { renderIcon } from '../../utils';\r\n\r\nexport const Chip: React.FC<ChipProps> = ({\r\n variant = 'filled',\r\n color = 'primary',\r\n size = 'md',\r\n disabled = false,\r\n fullWidth = false,\r\n tooltip,\r\n className = '',\r\n preIcon,\r\n posIcon,\r\n children,\r\n onClick,\r\n onRemove,\r\n ...chipProps\r\n}) => {\r\n const isClickable = !!onClick;\r\n const isRemovable = !!onRemove;\r\n\r\n // Build CSS classes\r\n const chipClasses = [\r\n 'eidos-chip',\r\n `eidos-chip--${variant}`,\r\n `eidos-chip--${color}`,\r\n `eidos-chip--${size}`,\r\n disabled && 'eidos-chip--disabled',\r\n isClickable && 'eidos-chip--clickable',\r\n isRemovable && 'eidos-chip--removable',\r\n fullWidth && 'eidos-chip--full-width',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n const handleClick = () => {\r\n if (disabled || !onClick) return;\r\n onClick();\r\n };\r\n\r\n const handleRemove = (e: React.MouseEvent) => {\r\n e.stopPropagation(); // Prevent chip click when removing\r\n if (disabled || !onRemove) return;\r\n onRemove();\r\n };\r\n\r\n // Use div when removable to avoid nested buttons, button only when clickable without remove\r\n const ChipElement = isClickable && !isRemovable ? 'button' : 'div';\r\n\r\n const chipContent = (\r\n <ChipElement\r\n className={chipClasses}\r\n disabled={ChipElement === 'button' ? disabled : undefined}\r\n onClick={isClickable ? handleClick : undefined}\r\n role={ChipElement === 'div' && isClickable ? 'button' : undefined}\r\n tabIndex={ChipElement === 'div' && isClickable ? 0 : undefined}\r\n onKeyDown={\r\n ChipElement === 'div' && isClickable\r\n ? (e) => {\r\n if ((e.key === 'Enter' || e.key === ' ') && !disabled) {\r\n e.preventDefault();\r\n handleClick();\r\n }\r\n }\r\n : undefined\r\n }\r\n {...chipProps}\r\n >\r\n {preIcon && renderIcon(preIcon, 'eidos-chip--pre-icon')}\r\n\r\n <span className=\"eidos-chip--copy\">{children}</span>\r\n\r\n {posIcon && renderIcon(posIcon, 'eidos-chip--pos-icon')}\r\n\r\n {isRemovable && (\r\n <button\r\n className=\"eidos-chip--remove-button\"\r\n onClick={handleRemove}\r\n disabled={disabled}\r\n aria-label=\"Remove\"\r\n type=\"button\"\r\n >\r\n <X className=\"eidos-chip--remove-icon\" />\r\n </button>\r\n )}\r\n </ChipElement>\r\n );\r\n\r\n return tooltip ? <Tooltip message={tooltip}>{chipContent}</Tooltip> : chipContent;\r\n};\r\n"]}
@@ -0,0 +1,125 @@
1
+ import {
2
+ Dropdown
3
+ } from "./chunk-SXF3TCYA.js";
4
+ import {
5
+ Kbd
6
+ } from "./chunk-73EKJU4G.js";
7
+ import {
8
+ renderIcon
9
+ } from "./chunk-XSGUFMT4.js";
10
+ import {
11
+ Tooltip
12
+ } from "./chunk-H523JFY2.js";
13
+
14
+ // src/components/Menu/Menu.component.tsx
15
+ import { useCallback } from "react";
16
+ import { ChevronRight } from "lucide-react";
17
+ import { jsx, jsxs } from "react/jsx-runtime";
18
+ var MenuPanel = ({ items, className = "", onItemClick }) => {
19
+ const handleItemClick = useCallback(
20
+ (item) => {
21
+ if (item.disabled) return;
22
+ if (item.onClick) {
23
+ item.onClick();
24
+ }
25
+ if (onItemClick) {
26
+ onItemClick(item);
27
+ }
28
+ },
29
+ [onItemClick]
30
+ );
31
+ const renderMenuItem = (item) => {
32
+ switch (item.type) {
33
+ case "item":
34
+ return /* @__PURE__ */ jsxs(
35
+ "li",
36
+ {
37
+ className: [
38
+ "eidos-menu-item",
39
+ item.disabled ? "eidos-menu-item--disabled" : "",
40
+ item.color ? `eidos-menu-item--${item.color}` : ""
41
+ ].filter(Boolean).join(" "),
42
+ onClick: () => handleItemClick(item),
43
+ children: [
44
+ item.icon && renderIcon(item.icon, "eidos-menu-icon"),
45
+ /* @__PURE__ */ jsx("span", { className: `eidos-menu-label`, children: item.label }),
46
+ item.shortcut && /* @__PURE__ */ jsx(Kbd, { size: "sm", className: "eidos-menu-shortcut", children: item.shortcut })
47
+ ]
48
+ },
49
+ item.id
50
+ );
51
+ case "component":
52
+ return /* @__PURE__ */ jsx("li", { className: `eidos-menu-component-item`, children: item.component }, item.id);
53
+ case "separator":
54
+ return /* @__PURE__ */ jsx("li", { className: `eidos-menu-separator` }, item.id);
55
+ case "nested": {
56
+ const triggerElement = /* @__PURE__ */ jsxs("div", { className: `eidos-menu-nested-trigger`, children: [
57
+ item.icon && renderIcon(item.icon, "eidos-menu-icon"),
58
+ /* @__PURE__ */ jsx("span", { className: `eidos-menu-label`, children: item.label }),
59
+ /* @__PURE__ */ jsx(ChevronRight, { className: `eidos-menu-nested-arrow` })
60
+ ] });
61
+ return /* @__PURE__ */ jsx("li", { className: `eidos-menu-nested-item`, children: /* @__PURE__ */ jsx(
62
+ Dropdown,
63
+ {
64
+ trigger: triggerElement,
65
+ content: /* @__PURE__ */ jsx(MenuPanel, { items: item.items, onItemClick }),
66
+ placement: "right",
67
+ isNested: true,
68
+ fullWidth: true
69
+ }
70
+ ) }, item.id);
71
+ }
72
+ default:
73
+ return null;
74
+ }
75
+ };
76
+ return /* @__PURE__ */ jsx("ul", { className: `eidos-menu ${className}`, children: items.map(renderMenuItem) });
77
+ };
78
+ var Menu = ({
79
+ trigger,
80
+ items,
81
+ minWidth,
82
+ maxWidth,
83
+ minHeight,
84
+ maxHeight,
85
+ autoWidth = true,
86
+ triggerRef,
87
+ closeOnItemClick = true,
88
+ tooltip
89
+ }) => {
90
+ const handleItemClick = useCallback(
91
+ (_item) => {
92
+ if (closeOnItemClick) {
93
+ setTimeout(() => {
94
+ const event = new MouseEvent("mousedown", {
95
+ bubbles: true,
96
+ cancelable: true,
97
+ view: window
98
+ });
99
+ document.dispatchEvent(event);
100
+ }, 10);
101
+ }
102
+ },
103
+ [closeOnItemClick]
104
+ );
105
+ const dropdown = /* @__PURE__ */ jsx(
106
+ Dropdown,
107
+ {
108
+ trigger,
109
+ content: /* @__PURE__ */ jsx(MenuPanel, { items, onItemClick: handleItemClick }),
110
+ minWidth,
111
+ maxWidth,
112
+ minHeight,
113
+ maxHeight,
114
+ autoWidth,
115
+ triggerRef
116
+ }
117
+ );
118
+ return tooltip ? /* @__PURE__ */ jsx(Tooltip, { message: tooltip, children: dropdown }) : dropdown;
119
+ };
120
+
121
+ export {
122
+ MenuPanel,
123
+ Menu
124
+ };
125
+ //# sourceMappingURL=chunk-O6B4KB4D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Menu/Menu.component.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\r\nimport { ChevronRight } from 'lucide-react';\r\nimport type { MenuProps, MenuItemType, MenuItem, MenuWrapperProps } from './Menu.types';\r\nimport { Dropdown } from '../Dropdown/Dropdown.component';\r\nimport { Tooltip } from '../Tooltip/Tooltip.component';\r\nimport { Kbd } from '../Kbd/Kbd.component';\r\nimport { renderIcon } from '../../utils';\r\n\r\n/**\r\n * MenuPanel - the bare menu list, without any trigger or dropdown wrapper.\r\n * Exported for use in SplitButton, ContextMenu, and other consumers that need\r\n * to render the menu content inside their own Dropdown / portal.\r\n */\r\nexport const MenuPanel: React.FC<MenuProps> = ({ items, className = '', onItemClick }) => {\r\n // Handle menu item click\r\n const handleItemClick = useCallback(\r\n (item: MenuItem) => {\r\n if (item.disabled) return;\r\n\r\n // Execute the item's onClick handler first\r\n if (item.onClick) {\r\n item.onClick();\r\n }\r\n\r\n // Then call the onItemClick callback (which will close the dropdown)\r\n if (onItemClick) {\r\n onItemClick(item);\r\n }\r\n },\r\n [onItemClick],\r\n );\r\n\r\n // Render individual menu item\r\n const renderMenuItem = (item: MenuItemType): React.ReactNode => {\r\n switch (item.type) {\r\n case 'item':\r\n return (\r\n <li\r\n key={item.id}\r\n className={[\r\n 'eidos-menu-item',\r\n item.disabled ? 'eidos-menu-item--disabled' : '',\r\n item.color ? `eidos-menu-item--${item.color}` : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ')}\r\n onClick={() => handleItemClick(item)}\r\n >\r\n {item.icon && renderIcon(item.icon, 'eidos-menu-icon')}\r\n <span className={`eidos-menu-label`}>{item.label}</span>\r\n {item.shortcut && (\r\n <Kbd size=\"sm\" className=\"eidos-menu-shortcut\">\r\n {item.shortcut}\r\n </Kbd>\r\n )}\r\n </li>\r\n );\r\n\r\n case 'component':\r\n return (\r\n <li key={item.id} className={`eidos-menu-component-item`}>\r\n {item.component}\r\n </li>\r\n );\r\n\r\n case 'separator':\r\n return <li key={item.id} className={`eidos-menu-separator`} />;\r\n\r\n case 'nested': {\r\n const triggerElement = (\r\n <div className={`eidos-menu-nested-trigger`}>\r\n {item.icon && renderIcon(item.icon, 'eidos-menu-icon')}\r\n <span className={`eidos-menu-label`}>{item.label}</span>\r\n <ChevronRight className={`eidos-menu-nested-arrow`} />\r\n </div>\r\n );\r\n\r\n return (\r\n <li key={item.id} className={`eidos-menu-nested-item`}>\r\n <Dropdown\r\n trigger={triggerElement}\r\n content={<MenuPanel items={item.items} onItemClick={onItemClick} />}\r\n placement=\"right\"\r\n isNested={true}\r\n fullWidth\r\n />\r\n </li>\r\n );\r\n }\r\n\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return <ul className={`eidos-menu ${className}`}>{items.map(renderMenuItem)}</ul>;\r\n};\r\n\r\nexport const Menu: React.FC<MenuWrapperProps> = ({\r\n trigger,\r\n items,\r\n minWidth,\r\n maxWidth,\r\n minHeight,\r\n maxHeight,\r\n autoWidth = true,\r\n triggerRef,\r\n closeOnItemClick = true,\r\n tooltip,\r\n}) => {\r\n const handleItemClick = useCallback(\r\n (_item: MenuItem) => {\r\n // Note: item.onClick is already called in MenuPanel's handleItemClick\r\n // Here we only handle closing the dropdown if needed\r\n\r\n if (closeOnItemClick) {\r\n // Use a small delay to ensure the onClick handler completes\r\n setTimeout(() => {\r\n // Create a synthetic click event outside the dropdown to close it\r\n const event = new MouseEvent('mousedown', {\r\n bubbles: true,\r\n cancelable: true,\r\n view: window,\r\n });\r\n document.dispatchEvent(event);\r\n }, 10);\r\n }\r\n },\r\n [closeOnItemClick],\r\n );\r\n\r\n const dropdown = (\r\n <Dropdown\r\n trigger={trigger}\r\n content={<MenuPanel items={items} onItemClick={handleItemClick} />}\r\n minWidth={minWidth}\r\n maxWidth={maxWidth}\r\n minHeight={minHeight}\r\n maxHeight={maxHeight}\r\n autoWidth={autoWidth}\r\n triggerRef={triggerRef}\r\n />\r\n );\r\n\r\n return tooltip ? <Tooltip message={tooltip}>{dropdown}</Tooltip> : dropdown;\r\n};\r\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAgB,mBAAmB;AACnC,SAAS,oBAAoB;AAoCnB,SAYE,KAZF;AAxBH,IAAM,YAAiC,CAAC,EAAE,OAAO,YAAY,IAAI,YAAY,MAAM;AAExF,QAAM,kBAAkB;AAAA,IACtB,CAAC,SAAmB;AAClB,UAAI,KAAK,SAAU;AAGnB,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ;AAAA,MACf;AAGA,UAAI,aAAa;AACf,oBAAY,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAGA,QAAM,iBAAiB,CAAC,SAAwC;AAC9D,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eACE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAW;AAAA,cACT;AAAA,cACA,KAAK,WAAW,8BAA8B;AAAA,cAC9C,KAAK,QAAQ,oBAAoB,KAAK,KAAK,KAAK;AAAA,YAClD,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACX,SAAS,MAAM,gBAAgB,IAAI;AAAA,YAElC;AAAA,mBAAK,QAAQ,WAAW,KAAK,MAAM,iBAAiB;AAAA,cACrD,oBAAC,UAAK,WAAW,oBAAqB,eAAK,OAAM;AAAA,cAChD,KAAK,YACJ,oBAAC,OAAI,MAAK,MAAK,WAAU,uBACtB,eAAK,UACR;AAAA;AAAA;AAAA,UAfG,KAAK;AAAA,QAiBZ;AAAA,MAGJ,KAAK;AACH,eACE,oBAAC,QAAiB,WAAW,6BAC1B,eAAK,aADC,KAAK,EAEd;AAAA,MAGJ,KAAK;AACH,eAAO,oBAAC,QAAiB,WAAW,0BAApB,KAAK,EAAuC;AAAA,MAE9D,KAAK,UAAU;AACb,cAAM,iBACJ,qBAAC,SAAI,WAAW,6BACb;AAAA,eAAK,QAAQ,WAAW,KAAK,MAAM,iBAAiB;AAAA,UACrD,oBAAC,UAAK,WAAW,oBAAqB,eAAK,OAAM;AAAA,UACjD,oBAAC,gBAAa,WAAW,2BAA2B;AAAA,WACtD;AAGF,eACE,oBAAC,QAAiB,WAAW,0BAC3B;AAAA,UAAC;AAAA;AAAA,YACC,SAAS;AAAA,YACT,SAAS,oBAAC,aAAU,OAAO,KAAK,OAAO,aAA0B;AAAA,YACjE,WAAU;AAAA,YACV,UAAU;AAAA,YACV,WAAS;AAAA;AAAA,QACX,KAPO,KAAK,EAQd;AAAA,MAEJ;AAAA,MAEA;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAEA,SAAO,oBAAC,QAAG,WAAW,cAAc,SAAS,IAAK,gBAAM,IAAI,cAAc,GAAE;AAC9E;AAEO,IAAM,OAAmC,CAAC;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA,mBAAmB;AAAA,EACnB;AACF,MAAM;AACJ,QAAM,kBAAkB;AAAA,IACtB,CAAC,UAAoB;AAInB,UAAI,kBAAkB;AAEpB,mBAAW,MAAM;AAEf,gBAAM,QAAQ,IAAI,WAAW,aAAa;AAAA,YACxC,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,MAAM;AAAA,UACR,CAAC;AACD,mBAAS,cAAc,KAAK;AAAA,QAC9B,GAAG,EAAE;AAAA,MACP;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB;AAAA,EACnB;AAEA,QAAM,WACJ;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,SAAS,oBAAC,aAAU,OAAc,aAAa,iBAAiB;AAAA,MAChE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA;AAAA,EACF;AAGF,SAAO,UAAU,oBAAC,WAAQ,SAAS,SAAU,oBAAS,IAAa;AACrE;","names":[]}
@@ -0,0 +1,86 @@
1
+ // src/components/Slider/Slider.component.tsx
2
+ import { forwardRef, useState } from "react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
4
+ var Slider = forwardRef(
5
+ ({
6
+ value,
7
+ defaultValue,
8
+ min,
9
+ max,
10
+ step,
11
+ onChange,
12
+ color = "primary",
13
+ size = "md",
14
+ disabled = false,
15
+ showValue = false,
16
+ showMinMax = false,
17
+ label,
18
+ unit,
19
+ blockedRange,
20
+ className = ""
21
+ }, ref) => {
22
+ const minVal = min ?? 0;
23
+ const maxVal = max ?? 100;
24
+ const clamp = (v) => blockedRange && v > blockedRange.min ? blockedRange.min : v;
25
+ const isControlled = value !== void 0;
26
+ const [localValue, setLocalValue] = useState(clamp(defaultValue ?? minVal));
27
+ const currentValue = isControlled ? clamp(value) : localValue;
28
+ const fillPct = (currentValue - minVal) / (maxVal - minVal) * 100;
29
+ const blockedStartPct = blockedRange ? (blockedRange.min - minVal) / (maxVal - minVal) * 100 : null;
30
+ const sliderStyle = {
31
+ "--s-fill": `${fillPct}%`,
32
+ "--s-color": `var(--${color}-color)`,
33
+ "--s-empty": "var(--gray-200)",
34
+ ...blockedStartPct !== null && { "--s-block": `${blockedStartPct}%` }
35
+ };
36
+ const handleChange = (e) => {
37
+ const newValue = clamp(Number(e.target.value));
38
+ if (!isControlled) setLocalValue(newValue);
39
+ onChange?.(newValue);
40
+ };
41
+ const effectiveMax = blockedRange ? blockedRange.min : maxVal;
42
+ const fmt = (v) => `${v}${unit ?? ""}`;
43
+ const rootClasses = [
44
+ "eidos-slider",
45
+ `eidos-slider--${color}`,
46
+ `eidos-slider--${size}`,
47
+ disabled && "eidos-slider--disabled",
48
+ className
49
+ ].filter(Boolean).join(" ");
50
+ return /* @__PURE__ */ jsxs("div", { className: rootClasses, children: [
51
+ (label || showValue) && /* @__PURE__ */ jsxs("div", { className: "eidos-slider-top", children: [
52
+ label && /* @__PURE__ */ jsx("span", { className: "eidos-slider-label", children: label }),
53
+ showValue && /* @__PURE__ */ jsx("span", { className: "eidos-slider-value", children: fmt(currentValue) })
54
+ ] }),
55
+ /* @__PURE__ */ jsx(
56
+ "input",
57
+ {
58
+ ref,
59
+ type: "range",
60
+ className: "eidos-slider-input",
61
+ min: minVal,
62
+ max: maxVal,
63
+ step: step ?? 1,
64
+ value: currentValue,
65
+ disabled,
66
+ onChange: handleChange,
67
+ "aria-label": label ?? "Slider",
68
+ "aria-valuemin": minVal,
69
+ "aria-valuemax": effectiveMax,
70
+ "aria-valuenow": currentValue,
71
+ style: sliderStyle
72
+ }
73
+ ),
74
+ showMinMax && /* @__PURE__ */ jsxs("div", { className: "eidos-slider-minmax", children: [
75
+ /* @__PURE__ */ jsx("span", { children: fmt(minVal) }),
76
+ /* @__PURE__ */ jsx("span", { children: fmt(maxVal) })
77
+ ] })
78
+ ] });
79
+ }
80
+ );
81
+ Slider.displayName = "Slider";
82
+
83
+ export {
84
+ Slider
85
+ };
86
+ //# sourceMappingURL=chunk-OHUVWPFJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Slider/Slider.component.tsx"],"sourcesContent":["import React, { forwardRef, useState } from 'react';\r\nimport type { SliderProps } from './Slider.types';\r\n\r\nexport const Slider = forwardRef<HTMLInputElement, SliderProps>(\r\n (\r\n {\r\n value,\r\n defaultValue,\r\n min,\r\n max,\r\n step,\r\n onChange,\r\n color = 'primary',\r\n size = 'md',\r\n disabled = false,\r\n showValue = false,\r\n showMinMax = false,\r\n label,\r\n unit,\r\n blockedRange,\r\n className = '',\r\n },\r\n ref,\r\n ) => {\r\n const minVal = min ?? 0;\r\n const maxVal = max ?? 100;\r\n\r\n // Clamp a raw value against the blocked range boundary.\r\n const clamp = (v: number) => (blockedRange && v > blockedRange.min ? blockedRange.min : v);\r\n\r\n const isControlled = value !== undefined;\r\n const [localValue, setLocalValue] = useState<number>(clamp(defaultValue ?? minVal));\r\n const currentValue = isControlled ? clamp(value!) : localValue;\r\n\r\n const fillPct = ((currentValue - minVal) / (maxVal - minVal)) * 100;\r\n const blockedStartPct = blockedRange\r\n ? ((blockedRange.min - minVal) / (maxVal - minVal)) * 100\r\n : null;\r\n\r\n // CSS custom properties drive the track gradient via the\r\n // ::-webkit-slider-runnable-track pseudo-element in Slider.scss.\r\n // --s-block defaults to 100% so the danger segment collapses to zero\r\n // width when there is no blocked range.\r\n const sliderStyle: React.CSSProperties = {\r\n '--s-fill': `${fillPct}%`,\r\n '--s-color': `var(--${color}-color)`,\r\n '--s-empty': 'var(--gray-200)',\r\n ...(blockedStartPct !== null && { '--s-block': `${blockedStartPct}%` }),\r\n } as React.CSSProperties;\r\n\r\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const newValue = clamp(Number(e.target.value));\r\n if (!isControlled) setLocalValue(newValue);\r\n onChange?.(newValue);\r\n };\r\n\r\n // Effective max for ARIA - the blocked zone is not a valid value.\r\n const effectiveMax = blockedRange ? blockedRange.min : maxVal;\r\n\r\n const fmt = (v: number) => `${v}${unit ?? ''}`;\r\n\r\n const rootClasses = [\r\n 'eidos-slider',\r\n `eidos-slider--${color}`,\r\n `eidos-slider--${size}`,\r\n disabled && 'eidos-slider--disabled',\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return (\r\n <div className={rootClasses}>\r\n {(label || showValue) && (\r\n <div className=\"eidos-slider-top\">\r\n {label && <span className=\"eidos-slider-label\">{label}</span>}\r\n {showValue && <span className=\"eidos-slider-value\">{fmt(currentValue)}</span>}\r\n </div>\r\n )}\r\n\r\n <input\r\n ref={ref}\r\n type=\"range\"\r\n className=\"eidos-slider-input\"\r\n min={minVal}\r\n max={maxVal}\r\n step={step ?? 1}\r\n value={currentValue}\r\n disabled={disabled}\r\n onChange={handleChange}\r\n aria-label={label ?? 'Slider'}\r\n aria-valuemin={minVal}\r\n aria-valuemax={effectiveMax}\r\n aria-valuenow={currentValue}\r\n style={sliderStyle}\r\n />\r\n\r\n {showMinMax && (\r\n <div className=\"eidos-slider-minmax\">\r\n <span>{fmt(minVal)}</span>\r\n <span>{fmt(maxVal)}</span>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n },\r\n);\r\n\r\nSlider.displayName = 'Slider';\r\n"],"mappings":";AAAA,SAAgB,YAAY,gBAAgB;AA0ElC,SACY,KADZ;AAvEH,IAAM,SAAS;AAAA,EACpB,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,EACd,GACA,QACG;AACH,UAAM,SAAS,OAAO;AACtB,UAAM,SAAS,OAAO;AAGtB,UAAM,QAAQ,CAAC,MAAe,gBAAgB,IAAI,aAAa,MAAM,aAAa,MAAM;AAExF,UAAM,eAAe,UAAU;AAC/B,UAAM,CAAC,YAAY,aAAa,IAAI,SAAiB,MAAM,gBAAgB,MAAM,CAAC;AAClF,UAAM,eAAe,eAAe,MAAM,KAAM,IAAI;AAEpD,UAAM,WAAY,eAAe,WAAW,SAAS,UAAW;AAChE,UAAM,kBAAkB,gBAClB,aAAa,MAAM,WAAW,SAAS,UAAW,MACpD;AAMJ,UAAM,cAAmC;AAAA,MACvC,YAAY,GAAG,OAAO;AAAA,MACtB,aAAa,SAAS,KAAK;AAAA,MAC3B,aAAa;AAAA,MACb,GAAI,oBAAoB,QAAQ,EAAE,aAAa,GAAG,eAAe,IAAI;AAAA,IACvE;AAEA,UAAM,eAAe,CAAC,MAA2C;AAC/D,YAAM,WAAW,MAAM,OAAO,EAAE,OAAO,KAAK,CAAC;AAC7C,UAAI,CAAC,aAAc,eAAc,QAAQ;AACzC,iBAAW,QAAQ;AAAA,IACrB;AAGA,UAAM,eAAe,eAAe,aAAa,MAAM;AAEvD,UAAM,MAAM,CAAC,MAAc,GAAG,CAAC,GAAG,QAAQ,EAAE;AAE5C,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,iBAAiB,KAAK;AAAA,MACtB,iBAAiB,IAAI;AAAA,MACrB,YAAY;AAAA,MACZ;AAAA,IACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAEX,WACE,qBAAC,SAAI,WAAW,aACZ;AAAA,gBAAS,cACT,qBAAC,SAAI,WAAU,oBACZ;AAAA,iBAAS,oBAAC,UAAK,WAAU,sBAAsB,iBAAM;AAAA,QACrD,aAAa,oBAAC,UAAK,WAAU,sBAAsB,cAAI,YAAY,GAAE;AAAA,SACxE;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,MAAK;AAAA,UACL,WAAU;AAAA,UACV,KAAK;AAAA,UACL,KAAK;AAAA,UACL,MAAM,QAAQ;AAAA,UACd,OAAO;AAAA,UACP;AAAA,UACA,UAAU;AAAA,UACV,cAAY,SAAS;AAAA,UACrB,iBAAe;AAAA,UACf,iBAAe;AAAA,UACf,iBAAe;AAAA,UACf,OAAO;AAAA;AAAA,MACT;AAAA,MAEC,cACC,qBAAC,SAAI,WAAU,uBACb;AAAA,4BAAC,UAAM,cAAI,MAAM,GAAE;AAAA,QACnB,oBAAC,UAAM,cAAI,MAAM,GAAE;AAAA,SACrB;AAAA,OAEJ;AAAA,EAEJ;AACF;AAEA,OAAO,cAAc;","names":[]}
@@ -0,0 +1,117 @@
1
+ import {
2
+ Button
3
+ } from "./chunk-FO5FNTJX.js";
4
+ import {
5
+ renderIcon
6
+ } from "./chunk-XSGUFMT4.js";
7
+
8
+ // src/components/Modal/Modal.component.tsx
9
+ import { useEffect, useCallback, useId, useState } from "react";
10
+ import { createPortal } from "react-dom";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ var Modal = ({
13
+ isOpen,
14
+ onClose,
15
+ title,
16
+ icon,
17
+ type,
18
+ children,
19
+ actions = [],
20
+ closeOnBackdropClick = true,
21
+ closeOnEscape = true,
22
+ size = "md",
23
+ className = ""
24
+ }) => {
25
+ const titleId = useId();
26
+ const bodyId = useId();
27
+ const TRANSITION_MS = 200;
28
+ const [isMounted, setIsMounted] = useState(isOpen);
29
+ const [isVisible, setIsVisible] = useState(isOpen);
30
+ useEffect(() => {
31
+ let raf1 = 0;
32
+ let raf2 = 0;
33
+ let timerId;
34
+ if (isOpen) {
35
+ setIsMounted(true);
36
+ raf1 = requestAnimationFrame(() => {
37
+ raf2 = requestAnimationFrame(() => setIsVisible(true));
38
+ });
39
+ } else {
40
+ setIsVisible(false);
41
+ timerId = setTimeout(() => setIsMounted(false), TRANSITION_MS);
42
+ }
43
+ return () => {
44
+ cancelAnimationFrame(raf1);
45
+ cancelAnimationFrame(raf2);
46
+ clearTimeout(timerId);
47
+ };
48
+ }, [isOpen]);
49
+ const handleEscapeKey = useCallback(
50
+ (event) => {
51
+ if (closeOnEscape && event.key === "Escape" && isOpen) {
52
+ onClose();
53
+ }
54
+ },
55
+ [closeOnEscape, isOpen, onClose]
56
+ );
57
+ const handleBackdropClick = useCallback(
58
+ (event) => {
59
+ if (closeOnBackdropClick && event.target === event.currentTarget) {
60
+ onClose();
61
+ }
62
+ },
63
+ [closeOnBackdropClick, onClose]
64
+ );
65
+ useEffect(() => {
66
+ if (isOpen) {
67
+ document.addEventListener("keydown", handleEscapeKey);
68
+ document.body.style.overflow = "hidden";
69
+ }
70
+ return () => {
71
+ document.removeEventListener("keydown", handleEscapeKey);
72
+ document.body.style.overflow = "";
73
+ };
74
+ }, [isOpen, handleEscapeKey]);
75
+ if (!isMounted) return null;
76
+ const modalContent = /* @__PURE__ */ jsxs("div", { className: `eidos-modal ${isVisible ? "eidos-modal--is-open" : ""} ${className}`, children: [
77
+ /* @__PURE__ */ jsx("div", { className: "eidos-modal-backdrop", onClick: handleBackdropClick, "aria-hidden": "true" }),
78
+ /* @__PURE__ */ jsxs(
79
+ "div",
80
+ {
81
+ role: "dialog",
82
+ "aria-modal": "true",
83
+ "aria-labelledby": title ? titleId : void 0,
84
+ "aria-describedby": bodyId,
85
+ className: `eidos-modal-content eidos-modal-content--${size}`,
86
+ children: [
87
+ title && /* @__PURE__ */ jsx("div", { className: `eidos-modal-header ${type ? `eidos-modal-header--${type}` : ""}`, children: /* @__PURE__ */ jsxs("h4", { id: titleId, children: [
88
+ icon && renderIcon(icon, "eidos-modal-icon"),
89
+ " ",
90
+ title
91
+ ] }) }),
92
+ /* @__PURE__ */ jsx("div", { id: bodyId, className: "eidos-modal-body", children }),
93
+ actions.length > 0 && /* @__PURE__ */ jsx("div", { className: `eidos-modal-footer`, children: actions.map((action) => /* @__PURE__ */ jsx(
94
+ Button,
95
+ {
96
+ variant: action.variant || "outlined",
97
+ size: action.size || "md",
98
+ color: action.color,
99
+ disabled: action.disabled,
100
+ loading: action.loading,
101
+ onClick: action.onClick,
102
+ children: action.label
103
+ },
104
+ action.id
105
+ )) })
106
+ ]
107
+ }
108
+ )
109
+ ] });
110
+ return createPortal(modalContent, document.body);
111
+ };
112
+ Modal.displayName = "Modal";
113
+
114
+ export {
115
+ Modal
116
+ };
117
+ //# sourceMappingURL=chunk-OT3VZLN4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Modal/Modal.component.tsx"],"sourcesContent":["import React, { useEffect, useCallback, useId, useState } from 'react';\r\nimport { createPortal } from 'react-dom';\r\nimport { Button } from '../Button/Button.component';\r\nimport type { ModalProps } from './Modal.types';\r\nimport { renderIcon } from '../../utils';\r\n\r\nexport const Modal: React.FC<ModalProps> = ({\r\n isOpen,\r\n onClose,\r\n title,\r\n icon,\r\n type,\r\n children,\r\n actions = [],\r\n closeOnBackdropClick = true,\r\n closeOnEscape = true,\r\n size = 'md',\r\n className = '',\r\n}) => {\r\n const titleId = useId();\r\n const bodyId = useId();\r\n\r\n // ── Animation state ────────────────────────────────────────────────────────\r\n // isMounted: whether the portal DOM node exists at all.\r\n // isVisible: whether the '--is-open' CSS class is applied (drives the transition).\r\n //\r\n // On open: mount first → one rAF → apply --is-open (browser sees the\r\n // initial faded/scaled-down state before transitioning, so the\r\n // animation fires instead of just painting straight into \"open\").\r\n // On close: remove --is-open (CSS transition plays) → after 200 ms unmount.\r\n // 200 ms matches the CSS `transition: 0.2s` in Modal.scss.\r\n const TRANSITION_MS = 200;\r\n const [isMounted, setIsMounted] = useState(isOpen);\r\n const [isVisible, setIsVisible] = useState(isOpen);\r\n\r\n useEffect(() => {\r\n let raf1 = 0;\r\n let raf2 = 0;\r\n let timerId: ReturnType<typeof setTimeout>;\r\n\r\n if (isOpen) {\r\n setIsMounted(true);\r\n // Double rAF: React 18 automatic batching means setIsMounted(true) may\r\n // not produce a committed browser paint before the first rAF fires.\r\n // The second frame guarantees the modal is rendered in its closed\r\n // (faded/scaled-down) state before the CSS transition begins.\r\n raf1 = requestAnimationFrame(() => {\r\n raf2 = requestAnimationFrame(() => setIsVisible(true));\r\n });\r\n } else {\r\n setIsVisible(false);\r\n timerId = setTimeout(() => setIsMounted(false), TRANSITION_MS);\r\n }\r\n\r\n return () => {\r\n cancelAnimationFrame(raf1);\r\n cancelAnimationFrame(raf2);\r\n clearTimeout(timerId);\r\n };\r\n }, [isOpen]);\r\n\r\n // Handle escape key\r\n const handleEscapeKey = useCallback(\r\n (event: KeyboardEvent) => {\r\n if (closeOnEscape && event.key === 'Escape' && isOpen) {\r\n onClose();\r\n }\r\n },\r\n [closeOnEscape, isOpen, onClose],\r\n );\r\n\r\n // Handle backdrop click\r\n const handleBackdropClick = useCallback(\r\n (event: React.MouseEvent) => {\r\n if (closeOnBackdropClick && event.target === event.currentTarget) {\r\n onClose();\r\n }\r\n },\r\n [closeOnBackdropClick, onClose],\r\n );\r\n\r\n // Add/remove escape key listener (tied to isOpen, not isMounted)\r\n useEffect(() => {\r\n if (isOpen) {\r\n document.addEventListener('keydown', handleEscapeKey);\r\n // Prevent body scroll when modal is open\r\n document.body.style.overflow = 'hidden';\r\n }\r\n\r\n return () => {\r\n document.removeEventListener('keydown', handleEscapeKey);\r\n document.body.style.overflow = '';\r\n };\r\n }, [isOpen, handleEscapeKey]);\r\n\r\n if (!isMounted) return null;\r\n\r\n const modalContent = (\r\n <div className={`eidos-modal ${isVisible ? 'eidos-modal--is-open' : ''} ${className}`}>\r\n <div className=\"eidos-modal-backdrop\" onClick={handleBackdropClick} aria-hidden=\"true\" />\r\n <div\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n aria-labelledby={title ? titleId : undefined}\r\n aria-describedby={bodyId}\r\n className={`eidos-modal-content eidos-modal-content--${size}`}\r\n >\r\n {title && (\r\n <div className={`eidos-modal-header ${type ? `eidos-modal-header--${type}` : ''}`}>\r\n <h4 id={titleId}>\r\n {icon && renderIcon(icon, 'eidos-modal-icon')} {title}\r\n </h4>\r\n </div>\r\n )}\r\n\r\n <div id={bodyId} className=\"eidos-modal-body\">\r\n {children}\r\n </div>\r\n\r\n {actions.length > 0 && (\r\n <div className={`eidos-modal-footer`}>\r\n {actions.map((action) => (\r\n <Button\r\n key={action.id}\r\n variant={action.variant || 'outlined'}\r\n size={action.size || 'md'}\r\n color={action.color}\r\n disabled={action.disabled}\r\n loading={action.loading}\r\n onClick={action.onClick}\r\n >\r\n {action.label}\r\n </Button>\r\n ))}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n\r\n return createPortal(modalContent, document.body);\r\n};\r\n\r\nModal.displayName = 'Modal';\r\n"],"mappings":";;;;;;;;AAAA,SAAgB,WAAW,aAAa,OAAO,gBAAgB;AAC/D,SAAS,oBAAoB;AAkGvB,cAUM,YAVN;AA7FC,IAAM,QAA8B,CAAC;AAAA,EAC1C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AAAA,EACX,uBAAuB;AAAA,EACvB,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,YAAY;AACd,MAAM;AACJ,QAAM,UAAU,MAAM;AACtB,QAAM,SAAS,MAAM;AAWrB,QAAM,gBAAgB;AACtB,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,MAAM;AACjD,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,MAAM;AAEjD,YAAU,MAAM;AACd,QAAI,OAAO;AACX,QAAI,OAAO;AACX,QAAI;AAEJ,QAAI,QAAQ;AACV,mBAAa,IAAI;AAKjB,aAAO,sBAAsB,MAAM;AACjC,eAAO,sBAAsB,MAAM,aAAa,IAAI,CAAC;AAAA,MACvD,CAAC;AAAA,IACH,OAAO;AACL,mBAAa,KAAK;AAClB,gBAAU,WAAW,MAAM,aAAa,KAAK,GAAG,aAAa;AAAA,IAC/D;AAEA,WAAO,MAAM;AACX,2BAAqB,IAAI;AACzB,2BAAqB,IAAI;AACzB,mBAAa,OAAO;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAGX,QAAM,kBAAkB;AAAA,IACtB,CAAC,UAAyB;AACxB,UAAI,iBAAiB,MAAM,QAAQ,YAAY,QAAQ;AACrD,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,CAAC,eAAe,QAAQ,OAAO;AAAA,EACjC;AAGA,QAAM,sBAAsB;AAAA,IAC1B,CAAC,UAA4B;AAC3B,UAAI,wBAAwB,MAAM,WAAW,MAAM,eAAe;AAChE,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,IACA,CAAC,sBAAsB,OAAO;AAAA,EAChC;AAGA,YAAU,MAAM;AACd,QAAI,QAAQ;AACV,eAAS,iBAAiB,WAAW,eAAe;AAEpD,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAEA,WAAO,MAAM;AACX,eAAS,oBAAoB,WAAW,eAAe;AACvD,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,QAAQ,eAAe,CAAC;AAE5B,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,eACJ,qBAAC,SAAI,WAAW,eAAe,YAAY,yBAAyB,EAAE,IAAI,SAAS,IACjF;AAAA,wBAAC,SAAI,WAAU,wBAAuB,SAAS,qBAAqB,eAAY,QAAO;AAAA,IACvF;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,mBAAiB,QAAQ,UAAU;AAAA,QACnC,oBAAkB;AAAA,QAClB,WAAW,4CAA4C,IAAI;AAAA,QAE1D;AAAA,mBACC,oBAAC,SAAI,WAAW,sBAAsB,OAAO,uBAAuB,IAAI,KAAK,EAAE,IAC7E,+BAAC,QAAG,IAAI,SACL;AAAA,oBAAQ,WAAW,MAAM,kBAAkB;AAAA,YAAE;AAAA,YAAE;AAAA,aAClD,GACF;AAAA,UAGF,oBAAC,SAAI,IAAI,QAAQ,WAAU,oBACxB,UACH;AAAA,UAEC,QAAQ,SAAS,KAChB,oBAAC,SAAI,WAAW,sBACb,kBAAQ,IAAI,CAAC,WACZ;AAAA,YAAC;AAAA;AAAA,cAEC,SAAS,OAAO,WAAW;AAAA,cAC3B,MAAM,OAAO,QAAQ;AAAA,cACrB,OAAO,OAAO;AAAA,cACd,UAAU,OAAO;AAAA,cACjB,SAAS,OAAO;AAAA,cAChB,SAAS,OAAO;AAAA,cAEf,iBAAO;AAAA;AAAA,YARH,OAAO;AAAA,UASd,CACD,GACH;AAAA;AAAA;AAAA,IAEJ;AAAA,KACF;AAGF,SAAO,aAAa,cAAc,SAAS,IAAI;AACjD;AAEA,MAAM,cAAc;","names":[]}