eidos-ui 3.2.1 → 3.4.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 (332) hide show
  1. package/README.md +17 -5
  2. package/dist/{Input.types-XrJTI0JC.d.ts → Input.types-CSDMaZNe.d.ts} +10 -0
  3. package/dist/{Input.types-DFZNyJGF.d.cts → Input.types-D7-sWq-q.d.cts} +10 -0
  4. package/dist/{Select.types-CAkT2ACt.d.cts → Select.types-2p-mpaBL.d.cts} +1 -1
  5. package/dist/{Select.types-B4kDpkGB.d.ts → Select.types-BqaD7bmB.d.ts} +1 -1
  6. package/dist/alert/index.cjs +5 -5
  7. package/dist/alert/index.js +4 -4
  8. package/dist/button/index.cjs +4 -4
  9. package/dist/button/index.js +3 -3
  10. package/dist/checkbox/index.cjs +2 -2
  11. package/dist/checkbox/index.js +1 -1
  12. package/dist/chip/index.cjs +4 -4
  13. package/dist/chip/index.js +3 -3
  14. package/dist/{chunk-RYOQYYDO.js → chunk-22EKNTWJ.js} +9 -5
  15. package/dist/chunk-22EKNTWJ.js.map +1 -0
  16. package/dist/{chunk-3E7TKBQI.cjs → chunk-27UANGPW.cjs} +14 -6
  17. package/dist/chunk-27UANGPW.cjs.map +1 -0
  18. package/dist/{chunk-CJGFRPAS.cjs → chunk-3QQKWXMV.cjs} +4 -4
  19. package/dist/chunk-3QQKWXMV.cjs.map +1 -0
  20. package/dist/{chunk-R3WPVTGY.cjs → chunk-3S33BIN2.cjs} +23 -21
  21. package/dist/chunk-3S33BIN2.cjs.map +1 -0
  22. package/dist/{chunk-ZPDETHQ7.js → chunk-3WV6RTXX.js} +3 -3
  23. package/dist/{chunk-ZPDETHQ7.js.map → chunk-3WV6RTXX.js.map} +1 -1
  24. package/dist/chunk-44T4HMFU.js +88 -0
  25. package/dist/chunk-44T4HMFU.js.map +1 -0
  26. package/dist/{chunk-3EPND5M2.cjs → chunk-4LET2PEX.cjs} +12 -12
  27. package/dist/chunk-4LET2PEX.cjs.map +1 -0
  28. package/dist/{chunk-VRQBDTLT.cjs → chunk-5E4DYTZ3.cjs} +48 -37
  29. package/dist/chunk-5E4DYTZ3.cjs.map +1 -0
  30. package/dist/{chunk-EL3YXTOW.cjs → chunk-5V7DXZWT.cjs} +79 -76
  31. package/dist/chunk-5V7DXZWT.cjs.map +1 -0
  32. package/dist/{chunk-2R77XZEP.js → chunk-67EXHO4T.js} +2 -4
  33. package/dist/{chunk-2R77XZEP.js.map → chunk-67EXHO4T.js.map} +1 -1
  34. package/dist/{chunk-HI6WCX4T.cjs → chunk-6LCYO2HG.cjs} +10 -9
  35. package/dist/chunk-6LCYO2HG.cjs.map +1 -0
  36. package/dist/{chunk-ZNWIHUHZ.cjs → chunk-7KVXXHFX.cjs} +9 -3
  37. package/dist/chunk-7KVXXHFX.cjs.map +1 -0
  38. package/dist/{chunk-55J4LEKT.cjs → chunk-AHVDTWVM.cjs} +11 -8
  39. package/dist/chunk-AHVDTWVM.cjs.map +1 -0
  40. package/dist/{chunk-OAPOGYA5.cjs → chunk-AXPEJ5IG.cjs} +7 -4
  41. package/dist/chunk-AXPEJ5IG.cjs.map +1 -0
  42. package/dist/{chunk-BHVHM66Z.js → chunk-BBU7QG7L.js} +4 -4
  43. package/dist/{chunk-T2KB3DJJ.js → chunk-BGBAZMFE.js} +9 -3
  44. package/dist/chunk-BGBAZMFE.js.map +1 -0
  45. package/dist/{chunk-EH42ND5Q.cjs → chunk-BIANFFJL.cjs} +5 -5
  46. package/dist/{chunk-EH42ND5Q.cjs.map → chunk-BIANFFJL.cjs.map} +1 -1
  47. package/dist/{chunk-O2AACVSF.js → chunk-BO4LTIJI.js} +3 -3
  48. package/dist/{chunk-ZGT4LT5Y.cjs → chunk-CBT3TTQR.cjs} +36 -36
  49. package/dist/{chunk-ZGT4LT5Y.cjs.map → chunk-CBT3TTQR.cjs.map} +1 -1
  50. package/dist/{chunk-JRLUZDKA.js → chunk-CEC3GO4R.js} +20 -7
  51. package/dist/chunk-CEC3GO4R.js.map +1 -0
  52. package/dist/{chunk-KNQ6NN6L.js → chunk-CP335H4Q.js} +4 -4
  53. package/dist/{chunk-H6CWTMAH.js → chunk-DGXHR6FV.js} +5 -2
  54. package/dist/chunk-DGXHR6FV.js.map +1 -0
  55. package/dist/{chunk-FALDCW2E.js → chunk-DMOZURHV.js} +2 -2
  56. package/dist/{chunk-NWJ6NETE.js → chunk-EWTMX4DK.js} +8 -8
  57. package/dist/{chunk-3RLGH45H.js → chunk-FDMYDIGI.js} +8 -6
  58. package/dist/chunk-FDMYDIGI.js.map +1 -0
  59. package/dist/{chunk-LVHZBCTA.cjs → chunk-FODRHCRP.cjs} +5 -4
  60. package/dist/chunk-FODRHCRP.cjs.map +1 -0
  61. package/dist/{chunk-QIITXVRG.js → chunk-FPLX5FIK.js} +4 -4
  62. package/dist/{chunk-NEYLNRVG.cjs → chunk-FXMRDNR6.cjs} +21 -16
  63. package/dist/chunk-FXMRDNR6.cjs.map +1 -0
  64. package/dist/{chunk-D2SKXRKP.cjs → chunk-G74DHVHV.cjs} +9 -9
  65. package/dist/{chunk-D2SKXRKP.cjs.map → chunk-G74DHVHV.cjs.map} +1 -1
  66. package/dist/{chunk-O3LG7B2J.cjs → chunk-GMDVW76A.cjs} +13 -5
  67. package/dist/chunk-GMDVW76A.cjs.map +1 -0
  68. package/dist/{chunk-NQ4L6PYW.js → chunk-GOF6A4M4.js} +2 -2
  69. package/dist/{chunk-NQ4L6PYW.js.map → chunk-GOF6A4M4.js.map} +1 -1
  70. package/dist/{chunk-QUDVJUZU.js → chunk-GPK2THIG.js} +7 -6
  71. package/dist/chunk-GPK2THIG.js.map +1 -0
  72. package/dist/{chunk-CJVC3A4O.js → chunk-H2RS6Z6Q.js} +44 -27
  73. package/dist/chunk-H2RS6Z6Q.js.map +1 -0
  74. package/dist/{chunk-UOOGS6N7.cjs → chunk-H5D3ZFBM.cjs} +68 -61
  75. package/dist/chunk-H5D3ZFBM.cjs.map +1 -0
  76. package/dist/{chunk-IYWAZEFI.cjs → chunk-IGFR5TES.cjs} +3 -2
  77. package/dist/chunk-IGFR5TES.cjs.map +1 -0
  78. package/dist/{chunk-PR7CVQ4R.js → chunk-IXVM2XNS.js} +7 -6
  79. package/dist/chunk-IXVM2XNS.js.map +1 -0
  80. package/dist/{chunk-Q6ICDKQZ.cjs → chunk-JKBBHAIC.cjs} +21 -20
  81. package/dist/chunk-JKBBHAIC.cjs.map +1 -0
  82. package/dist/{chunk-QQIALSTX.cjs → chunk-KPMIIGHH.cjs} +27 -17
  83. package/dist/chunk-KPMIIGHH.cjs.map +1 -0
  84. package/dist/{chunk-EBSKRZXI.cjs → chunk-KWDOOMHR.cjs} +7 -7
  85. package/dist/{chunk-EBSKRZXI.cjs.map → chunk-KWDOOMHR.cjs.map} +1 -1
  86. package/dist/{chunk-BC5I2MYB.js → chunk-LH5A2SIX.js} +78 -75
  87. package/dist/{chunk-BC5I2MYB.js.map → chunk-LH5A2SIX.js.map} +1 -1
  88. package/dist/{chunk-2WP27QAN.js → chunk-LIKSLFX6.js} +20 -9
  89. package/dist/chunk-LIKSLFX6.js.map +1 -0
  90. package/dist/{chunk-Z5U4NJTW.cjs → chunk-MLUHM3VG.cjs} +48 -19
  91. package/dist/chunk-MLUHM3VG.cjs.map +1 -0
  92. package/dist/{chunk-M7PF4FKQ.js → chunk-MP7LN5CW.js} +6 -3
  93. package/dist/chunk-MP7LN5CW.js.map +1 -0
  94. package/dist/{chunk-4MZ7HEQC.cjs → chunk-MW4YZVP5.cjs} +96 -97
  95. package/dist/chunk-MW4YZVP5.cjs.map +1 -0
  96. package/dist/{chunk-WFEORBLC.cjs → chunk-N5ZWQJTM.cjs} +11 -10
  97. package/dist/chunk-N5ZWQJTM.cjs.map +1 -0
  98. package/dist/{chunk-OMLXP2CK.cjs → chunk-N77VOYCK.cjs} +7 -7
  99. package/dist/{chunk-OMLXP2CK.cjs.map → chunk-N77VOYCK.cjs.map} +1 -1
  100. package/dist/{chunk-OAK7HFOJ.js → chunk-NACA72XI.js} +21 -16
  101. package/dist/chunk-NACA72XI.js.map +1 -0
  102. package/dist/{chunk-TEVZHN5I.cjs → chunk-NCZUQFKL.cjs} +28 -15
  103. package/dist/chunk-NCZUQFKL.cjs.map +1 -0
  104. package/dist/{chunk-NZO2I5AL.cjs → chunk-NF55JG2V.cjs} +7 -7
  105. package/dist/{chunk-NZO2I5AL.cjs.map → chunk-NF55JG2V.cjs.map} +1 -1
  106. package/dist/{chunk-KBGFDHKD.cjs → chunk-O46UJUZM.cjs} +21 -19
  107. package/dist/chunk-O46UJUZM.cjs.map +1 -0
  108. package/dist/{chunk-25PSIDPC.js → chunk-OIXPYXR6.js} +79 -21
  109. package/dist/chunk-OIXPYXR6.js.map +1 -0
  110. package/dist/chunk-OWWPHXAF.cjs +88 -0
  111. package/dist/chunk-OWWPHXAF.cjs.map +1 -0
  112. package/dist/{chunk-65PC3YDT.cjs → chunk-OZQKWDFH.cjs} +7 -7
  113. package/dist/{chunk-65PC3YDT.cjs.map → chunk-OZQKWDFH.cjs.map} +1 -1
  114. package/dist/{chunk-75VXB3H2.cjs → chunk-P7J6WZTO.cjs} +3 -5
  115. package/dist/chunk-P7J6WZTO.cjs.map +1 -0
  116. package/dist/{chunk-KQJ3IAFT.js → chunk-PG2EII6U.js} +2 -2
  117. package/dist/{chunk-6A2ZKVST.cjs → chunk-RUDXHT76.cjs} +47 -30
  118. package/dist/chunk-RUDXHT76.cjs.map +1 -0
  119. package/dist/{chunk-S4S4LB63.js → chunk-SCLFJHN2.js} +11 -3
  120. package/dist/chunk-SCLFJHN2.js.map +1 -0
  121. package/dist/{chunk-WKDT2XFQ.js → chunk-SFRILDXY.js} +4 -4
  122. package/dist/{chunk-J5RMLZ4P.cjs → chunk-SKBKTNEQ.cjs} +80 -22
  123. package/dist/chunk-SKBKTNEQ.cjs.map +1 -0
  124. package/dist/{chunk-75TDY7XF.cjs → chunk-SKLMBE3Z.cjs} +7 -7
  125. package/dist/{chunk-75TDY7XF.cjs.map → chunk-SKLMBE3Z.cjs.map} +1 -1
  126. package/dist/{chunk-PY2376XI.js → chunk-SVCWSW2F.js} +8 -8
  127. package/dist/chunk-SVCWSW2F.js.map +1 -0
  128. package/dist/{chunk-2RXQMQYW.js → chunk-SXL4DMZ7.js} +27 -17
  129. package/dist/{chunk-2RXQMQYW.js.map → chunk-SXL4DMZ7.js.map} +1 -1
  130. package/dist/{chunk-X3U7SDOZ.js → chunk-TLECMA3B.js} +5 -4
  131. package/dist/{chunk-X3U7SDOZ.js.map → chunk-TLECMA3B.js.map} +1 -1
  132. package/dist/{chunk-FXZJL2AM.cjs → chunk-TWXZKUCG.cjs} +9 -5
  133. package/dist/chunk-TWXZKUCG.cjs.map +1 -0
  134. package/dist/{chunk-YDPEHUMH.js → chunk-TYGVKSL6.js} +4 -3
  135. package/dist/chunk-TYGVKSL6.js.map +1 -0
  136. package/dist/{chunk-I3CSPYHG.cjs → chunk-TYSNOPMQ.cjs} +3 -3
  137. package/dist/{chunk-I3CSPYHG.cjs.map → chunk-TYSNOPMQ.cjs.map} +1 -1
  138. package/dist/{chunk-ZZSPQFMX.js → chunk-U233KQZX.js} +2 -1
  139. package/dist/{chunk-ZZSPQFMX.js.map → chunk-U233KQZX.js.map} +1 -1
  140. package/dist/{chunk-5HUZYY54.js → chunk-UDRAM6JU.js} +13 -5
  141. package/dist/chunk-UDRAM6JU.js.map +1 -0
  142. package/dist/{chunk-TJC7UELT.js → chunk-UGTKZ7HP.js} +30 -23
  143. package/dist/chunk-UGTKZ7HP.js.map +1 -0
  144. package/dist/{chunk-FKXKBJUI.cjs → chunk-VHO6JPRR.cjs} +2 -1
  145. package/dist/chunk-VHO6JPRR.cjs.map +1 -0
  146. package/dist/chunk-VHSTB7GB.cjs +123 -0
  147. package/dist/chunk-VHSTB7GB.cjs.map +1 -0
  148. package/dist/{chunk-ATL7325T.js → chunk-VRNCXYEP.js} +4 -4
  149. package/dist/{chunk-4ZWAJTNH.js → chunk-WGCGSM5P.js} +96 -97
  150. package/dist/chunk-WGCGSM5P.js.map +1 -0
  151. package/dist/chunk-WT4WBHBR.js +123 -0
  152. package/dist/chunk-WT4WBHBR.js.map +1 -0
  153. package/dist/{chunk-L23WWO3D.js → chunk-X6UKU3C3.js} +2 -2
  154. package/dist/{chunk-5WH3JMR5.js → chunk-XK5USBHB.js} +7 -4
  155. package/dist/chunk-XK5USBHB.js.map +1 -0
  156. package/dist/{chunk-ND526PMG.cjs → chunk-XMXL6NVJ.cjs} +11 -11
  157. package/dist/{chunk-ND526PMG.cjs.map → chunk-XMXL6NVJ.cjs.map} +1 -1
  158. package/dist/{chunk-YV57RSPD.js → chunk-XO7WTE6O.js} +47 -18
  159. package/dist/chunk-XO7WTE6O.js.map +1 -0
  160. package/dist/{chunk-3CXULV4G.cjs → chunk-XRVRGRC3.cjs} +2 -2
  161. package/dist/{chunk-3CXULV4G.cjs.map → chunk-XRVRGRC3.cjs.map} +1 -1
  162. package/dist/{chunk-O3I3RBZJ.js → chunk-Y55M34RQ.js} +3 -2
  163. package/dist/chunk-Y55M34RQ.js.map +1 -0
  164. package/dist/{chunk-QZX3A4FX.js → chunk-Y7VSWZWM.js} +7 -5
  165. package/dist/chunk-Y7VSWZWM.js.map +1 -0
  166. package/dist/{chunk-2QEKSRVX.js → chunk-YIBPOLNN.js} +4 -4
  167. package/dist/{chunk-IJ4DXG7D.cjs → chunk-YJNQLH2L.cjs} +5 -2
  168. package/dist/chunk-YJNQLH2L.cjs.map +1 -0
  169. package/dist/{chunk-6CSUUQ5M.cjs → chunk-YUH56CJI.cjs} +6 -6
  170. package/dist/{chunk-6CSUUQ5M.cjs.map → chunk-YUH56CJI.cjs.map} +1 -1
  171. package/dist/color-picker/index.cjs +4 -4
  172. package/dist/color-picker/index.d.cts +8 -0
  173. package/dist/color-picker/index.d.ts +8 -0
  174. package/dist/color-picker/index.js +3 -3
  175. package/dist/combobox/index.cjs +6 -6
  176. package/dist/combobox/index.js +5 -5
  177. package/dist/command-palette/index.cjs +3 -2
  178. package/dist/command-palette/index.cjs.map +1 -1
  179. package/dist/command-palette/index.js +2 -1
  180. package/dist/context-menu/index.cjs +6 -6
  181. package/dist/context-menu/index.js +5 -5
  182. package/dist/conversation/index.cjs +9 -9
  183. package/dist/conversation/index.js +8 -8
  184. package/dist/data-grid/index.cjs +16 -16
  185. package/dist/data-grid/index.d.cts +2 -2
  186. package/dist/data-grid/index.d.ts +2 -2
  187. package/dist/data-grid/index.js +15 -15
  188. package/dist/date-picker/index.cjs +8 -8
  189. package/dist/date-picker/index.d.cts +1 -1
  190. package/dist/date-picker/index.d.ts +1 -1
  191. package/dist/date-picker/index.js +7 -7
  192. package/dist/drawer/index.cjs +5 -5
  193. package/dist/drawer/index.js +4 -4
  194. package/dist/dropdown/index.cjs +3 -3
  195. package/dist/dropdown/index.js +2 -2
  196. package/dist/file-upload/index.cjs +2 -2
  197. package/dist/file-upload/index.js +1 -1
  198. package/dist/header/index.cjs +6 -6
  199. package/dist/header/index.js +5 -5
  200. package/dist/index.cjs +43 -43
  201. package/dist/index.css +205 -148
  202. package/dist/index.d.cts +2 -2
  203. package/dist/index.d.ts +2 -2
  204. package/dist/index.js +42 -42
  205. package/dist/inline-edit/index.cjs +5 -5
  206. package/dist/inline-edit/index.js +4 -4
  207. package/dist/input/index.cjs +4 -4
  208. package/dist/input/index.d.cts +2 -2
  209. package/dist/input/index.d.ts +2 -2
  210. package/dist/input/index.js +3 -3
  211. package/dist/menu/index.cjs +5 -5
  212. package/dist/menu/index.js +4 -4
  213. package/dist/modal/index.cjs +5 -5
  214. package/dist/modal/index.js +4 -4
  215. package/dist/navigation/index.cjs +5 -5
  216. package/dist/navigation/index.js +4 -4
  217. package/dist/number-input/index.cjs +3 -3
  218. package/dist/number-input/index.js +2 -2
  219. package/dist/o-t-p-input/index.cjs +2 -2
  220. package/dist/o-t-p-input/index.js +1 -1
  221. package/dist/page-layout/index.cjs +12 -12
  222. package/dist/page-layout/index.js +11 -11
  223. package/dist/pagination/index.cjs +8 -8
  224. package/dist/pagination/index.js +7 -7
  225. package/dist/popover/index.cjs +3 -2
  226. package/dist/popover/index.cjs.map +1 -1
  227. package/dist/popover/index.js +2 -1
  228. package/dist/radio/index.cjs +2 -2
  229. package/dist/radio/index.js +1 -1
  230. package/dist/segmented-control/index.cjs +4 -4
  231. package/dist/segmented-control/index.js +3 -3
  232. package/dist/select/index.cjs +6 -6
  233. package/dist/select/index.d.cts +3 -3
  234. package/dist/select/index.d.ts +3 -3
  235. package/dist/select/index.js +5 -5
  236. package/dist/skeleton/index.cjs +2 -2
  237. package/dist/skeleton/index.js +1 -1
  238. package/dist/snackbar/index.cjs +5 -5
  239. package/dist/snackbar/index.d.cts +4 -0
  240. package/dist/snackbar/index.d.ts +4 -0
  241. package/dist/snackbar/index.js +4 -4
  242. package/dist/split-button/index.cjs +6 -6
  243. package/dist/split-button/index.js +5 -5
  244. package/dist/table/index.cjs +14 -14
  245. package/dist/table/index.js +13 -13
  246. package/dist/tabs/index.cjs +3 -3
  247. package/dist/tabs/index.js +2 -2
  248. package/dist/tag-input/index.cjs +6 -6
  249. package/dist/tag-input/index.js +5 -5
  250. package/dist/textarea/index.cjs +4 -4
  251. package/dist/textarea/index.js +3 -3
  252. package/dist/theme-editor/index.cjs +11 -11
  253. package/dist/theme-editor/index.js +10 -10
  254. package/dist/theme-provider/index.cjs +3 -3
  255. package/dist/theme-provider/index.js +2 -2
  256. package/dist/toolbar/index.cjs +8 -8
  257. package/dist/toolbar/index.js +7 -7
  258. package/dist/tooltip/index.cjs +3 -2
  259. package/dist/tooltip/index.cjs.map +1 -1
  260. package/dist/tooltip/index.js +2 -1
  261. package/dist/virtual-list/index.cjs +3 -3
  262. package/dist/virtual-list/index.js +2 -2
  263. package/package.json +8 -2
  264. package/dist/chunk-25PSIDPC.js.map +0 -1
  265. package/dist/chunk-2WP27QAN.js.map +0 -1
  266. package/dist/chunk-3E7TKBQI.cjs.map +0 -1
  267. package/dist/chunk-3EPND5M2.cjs.map +0 -1
  268. package/dist/chunk-3RLGH45H.js.map +0 -1
  269. package/dist/chunk-4MZ7HEQC.cjs.map +0 -1
  270. package/dist/chunk-4ZWAJTNH.js.map +0 -1
  271. package/dist/chunk-55J4LEKT.cjs.map +0 -1
  272. package/dist/chunk-5HUZYY54.js.map +0 -1
  273. package/dist/chunk-5WH3JMR5.js.map +0 -1
  274. package/dist/chunk-6A2ZKVST.cjs.map +0 -1
  275. package/dist/chunk-75VXB3H2.cjs.map +0 -1
  276. package/dist/chunk-CJGFRPAS.cjs.map +0 -1
  277. package/dist/chunk-CJVC3A4O.js.map +0 -1
  278. package/dist/chunk-CUJBNRJJ.cjs +0 -38
  279. package/dist/chunk-CUJBNRJJ.cjs.map +0 -1
  280. package/dist/chunk-EAJHEYZM.js +0 -38
  281. package/dist/chunk-EAJHEYZM.js.map +0 -1
  282. package/dist/chunk-EL3YXTOW.cjs.map +0 -1
  283. package/dist/chunk-FKXKBJUI.cjs.map +0 -1
  284. package/dist/chunk-FXZJL2AM.cjs.map +0 -1
  285. package/dist/chunk-H6CWTMAH.js.map +0 -1
  286. package/dist/chunk-HI6WCX4T.cjs.map +0 -1
  287. package/dist/chunk-IJ4DXG7D.cjs.map +0 -1
  288. package/dist/chunk-IYWAZEFI.cjs.map +0 -1
  289. package/dist/chunk-J5RMLZ4P.cjs.map +0 -1
  290. package/dist/chunk-JRLUZDKA.js.map +0 -1
  291. package/dist/chunk-KBGFDHKD.cjs.map +0 -1
  292. package/dist/chunk-L5Q6UDY3.js +0 -69
  293. package/dist/chunk-L5Q6UDY3.js.map +0 -1
  294. package/dist/chunk-LVHZBCTA.cjs.map +0 -1
  295. package/dist/chunk-M7PF4FKQ.js.map +0 -1
  296. package/dist/chunk-NEYLNRVG.cjs.map +0 -1
  297. package/dist/chunk-O3I3RBZJ.js.map +0 -1
  298. package/dist/chunk-O3LG7B2J.cjs.map +0 -1
  299. package/dist/chunk-OAK7HFOJ.js.map +0 -1
  300. package/dist/chunk-OAPOGYA5.cjs.map +0 -1
  301. package/dist/chunk-PR7CVQ4R.js.map +0 -1
  302. package/dist/chunk-PY2376XI.js.map +0 -1
  303. package/dist/chunk-Q6ICDKQZ.cjs.map +0 -1
  304. package/dist/chunk-QQIALSTX.cjs.map +0 -1
  305. package/dist/chunk-QUDVJUZU.js.map +0 -1
  306. package/dist/chunk-QZX3A4FX.js.map +0 -1
  307. package/dist/chunk-R3WPVTGY.cjs.map +0 -1
  308. package/dist/chunk-RYOQYYDO.js.map +0 -1
  309. package/dist/chunk-S4S4LB63.js.map +0 -1
  310. package/dist/chunk-T2KB3DJJ.js.map +0 -1
  311. package/dist/chunk-TEVZHN5I.cjs.map +0 -1
  312. package/dist/chunk-TJC7UELT.js.map +0 -1
  313. package/dist/chunk-UOOGS6N7.cjs.map +0 -1
  314. package/dist/chunk-VRQBDTLT.cjs.map +0 -1
  315. package/dist/chunk-WFEORBLC.cjs.map +0 -1
  316. package/dist/chunk-WWYJNWJY.cjs +0 -69
  317. package/dist/chunk-WWYJNWJY.cjs.map +0 -1
  318. package/dist/chunk-YDPEHUMH.js.map +0 -1
  319. package/dist/chunk-YV57RSPD.js.map +0 -1
  320. package/dist/chunk-Z5U4NJTW.cjs.map +0 -1
  321. package/dist/chunk-ZNWIHUHZ.cjs.map +0 -1
  322. /package/dist/{chunk-BHVHM66Z.js.map → chunk-BBU7QG7L.js.map} +0 -0
  323. /package/dist/{chunk-O2AACVSF.js.map → chunk-BO4LTIJI.js.map} +0 -0
  324. /package/dist/{chunk-KNQ6NN6L.js.map → chunk-CP335H4Q.js.map} +0 -0
  325. /package/dist/{chunk-FALDCW2E.js.map → chunk-DMOZURHV.js.map} +0 -0
  326. /package/dist/{chunk-NWJ6NETE.js.map → chunk-EWTMX4DK.js.map} +0 -0
  327. /package/dist/{chunk-QIITXVRG.js.map → chunk-FPLX5FIK.js.map} +0 -0
  328. /package/dist/{chunk-KQJ3IAFT.js.map → chunk-PG2EII6U.js.map} +0 -0
  329. /package/dist/{chunk-WKDT2XFQ.js.map → chunk-SFRILDXY.js.map} +0 -0
  330. /package/dist/{chunk-ATL7325T.js.map → chunk-VRNCXYEP.js.map} +0 -0
  331. /package/dist/{chunk-L23WWO3D.js.map → chunk-X6UKU3C3.js.map} +0 -0
  332. /package/dist/{chunk-2QEKSRVX.js.map → chunk-YIBPOLNN.js.map} +0 -0
@@ -1,9 +1,10 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkWWYJNWJYcjs = require('./chunk-WWYJNWJY.cjs');
3
+ var _chunkOWWPHXAFcjs = require('./chunk-OWWPHXAF.cjs');
4
4
 
5
5
 
6
- var _chunkCUJBNRJJcjs = require('./chunk-CUJBNRJJ.cjs');
6
+
7
+ var _chunkVHSTB7GBcjs = require('./chunk-VHSTB7GB.cjs');
7
8
 
8
9
  // src/components/Modal/Modal.component.tsx
9
10
  var _react = require('react');
@@ -24,6 +25,7 @@ var Modal = ({
24
25
  }) => {
25
26
  const titleId = _react.useId.call(void 0, );
26
27
  const bodyId = _react.useId.call(void 0, );
28
+ const dialogRef = _react.useRef.call(void 0, null);
27
29
  const TRANSITION_MS = 200;
28
30
  const [isMounted, setIsMounted] = _react.useState.call(void 0, isOpen);
29
31
  const [isVisible, setIsVisible] = _react.useState.call(void 0, isOpen);
@@ -72,12 +74,14 @@ var Modal = ({
72
74
  document.body.style.overflow = "";
73
75
  };
74
76
  }, [isOpen, handleEscapeKey]);
77
+ _chunkVHSTB7GBcjs.useDialogFocus.call(void 0, isOpen && isVisible, dialogRef);
75
78
  if (!isMounted) return null;
76
79
  const modalContent = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: `eidos-modal ${isVisible ? "eidos-modal--is-open" : ""} ${className}`, children: [
77
80
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-modal-backdrop", onClick: handleBackdropClick, "aria-hidden": "true" }),
78
81
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
79
82
  "div",
80
83
  {
84
+ ref: dialogRef,
81
85
  role: "dialog",
82
86
  "aria-modal": "true",
83
87
  "aria-labelledby": title ? titleId : void 0,
@@ -85,13 +89,13 @@ var Modal = ({
85
89
  className: `eidos-modal-content eidos-modal-content--${size}`,
86
90
  children: [
87
91
  title && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: `eidos-modal-header ${type ? `eidos-modal-header--${type}` : ""}`, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "h4", { id: titleId, children: [
88
- icon && _chunkCUJBNRJJcjs.renderIcon.call(void 0, icon, "eidos-modal-icon"),
92
+ icon && _chunkVHSTB7GBcjs.renderIcon.call(void 0, icon, "eidos-modal-icon"),
89
93
  " ",
90
94
  title
91
95
  ] }) }),
92
96
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { id: bodyId, className: "eidos-modal-body", children }),
93
97
  actions.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: `eidos-modal-footer`, children: actions.map((action) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
94
- _chunkWWYJNWJYcjs.Button,
98
+ _chunkOWWPHXAFcjs.Button,
95
99
  {
96
100
  variant: action.variant || "outlined",
97
101
  size: action.size || "md",
@@ -114,4 +118,4 @@ Modal.displayName = "Modal";
114
118
 
115
119
 
116
120
  exports.Modal = Modal;
117
- //# sourceMappingURL=chunk-FXZJL2AM.cjs.map
121
+ //# sourceMappingURL=chunk-TWXZKUCG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-TWXZKUCG.cjs","../src/components/Modal/Modal.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-TWXZKUCG.cjs","sourcesContent":[null,"import React, { useEffect, useCallback, useId, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Button } from '../Button/Button.component';\nimport type { ModalProps } from './Modal.types';\nimport { renderIcon, useDialogFocus } from '../../utils';\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n icon,\n type,\n children,\n actions = [],\n closeOnBackdropClick = true,\n closeOnEscape = true,\n size = 'md',\n className = '',\n}) => {\n const titleId = useId();\n const bodyId = useId();\n const dialogRef = useRef<HTMLDivElement>(null);\n\n // ── Animation state ────────────────────────────────────────────────────────\n // isMounted: whether the portal DOM node exists at all.\n // isVisible: whether the '--is-open' CSS class is applied (drives the transition).\n //\n // On open: mount first → one rAF → apply --is-open (browser sees the\n // initial faded/scaled-down state before transitioning, so the\n // animation fires instead of just painting straight into \"open\").\n // On close: remove --is-open (CSS transition plays) → after 200 ms unmount.\n // 200 ms matches the CSS `transition: 0.2s` in Modal.scss.\n const TRANSITION_MS = 200;\n const [isMounted, setIsMounted] = useState(isOpen);\n const [isVisible, setIsVisible] = useState(isOpen);\n\n useEffect(() => {\n let raf1 = 0;\n let raf2 = 0;\n let timerId: ReturnType<typeof setTimeout>;\n\n if (isOpen) {\n setIsMounted(true);\n // Double rAF: React 18 automatic batching means setIsMounted(true) may\n // not produce a committed browser paint before the first rAF fires.\n // The second frame guarantees the modal is rendered in its closed\n // (faded/scaled-down) state before the CSS transition begins.\n raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsVisible(true));\n });\n } else {\n setIsVisible(false);\n timerId = setTimeout(() => setIsMounted(false), TRANSITION_MS);\n }\n\n return () => {\n cancelAnimationFrame(raf1);\n cancelAnimationFrame(raf2);\n clearTimeout(timerId);\n };\n }, [isOpen]);\n\n // Handle escape key\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n if (closeOnEscape && event.key === 'Escape' && isOpen) {\n onClose();\n }\n },\n [closeOnEscape, isOpen, onClose],\n );\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(\n (event: React.MouseEvent) => {\n if (closeOnBackdropClick && event.target === event.currentTarget) {\n onClose();\n }\n },\n [closeOnBackdropClick, onClose],\n );\n\n // Add/remove escape key listener (tied to isOpen, not isMounted)\n useEffect(() => {\n if (isOpen) {\n document.addEventListener('keydown', handleEscapeKey);\n // Prevent body scroll when modal is open\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n document.body.style.overflow = '';\n };\n }, [isOpen, handleEscapeKey]);\n\n // Keyed to `isVisible`, not `isOpen` and not `isMounted`.\n //\n // `isOpen` alone is too early: `isMounted` is set in the effect above, one\n // render later, so the dialog element does not exist yet and the trap would\n // run against a null ref.\n //\n // `isMounted` is *also* too early, and fails more quietly. `.eidos-modal`\n // starts at `visibility: hidden` and only becomes visible with\n // `--is-open`, which is two animation frames later - so at mount there is\n // nothing focusable to find and `.focus()` on the dialog itself is a no-op.\n // Focus silently stayed on the trigger.\n useDialogFocus(isOpen && isVisible, dialogRef);\n\n if (!isMounted) return null;\n\n const modalContent = (\n <div className={`eidos-modal ${isVisible ? 'eidos-modal--is-open' : ''} ${className}`}>\n <div className=\"eidos-modal-backdrop\" onClick={handleBackdropClick} aria-hidden=\"true\" />\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={bodyId}\n className={`eidos-modal-content eidos-modal-content--${size}`}\n >\n {title && (\n <div className={`eidos-modal-header ${type ? `eidos-modal-header--${type}` : ''}`}>\n <h4 id={titleId}>\n {icon && renderIcon(icon, 'eidos-modal-icon')} {title}\n </h4>\n </div>\n )}\n\n <div id={bodyId} className=\"eidos-modal-body\">\n {children}\n </div>\n\n {actions.length > 0 && (\n <div className={`eidos-modal-footer`}>\n {actions.map((action) => (\n <Button\n key={action.id}\n variant={action.variant || 'outlined'}\n size={action.size || 'md'}\n color={action.color}\n disabled={action.disabled}\n loading={action.loading}\n onClick={action.onClick}\n >\n {action.label}\n </Button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n\n return createPortal(modalContent, document.body);\n};\n\nModal.displayName = 'Modal';\n"]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Dropdown
3
- } from "./chunk-2R77XZEP.js";
3
+ } from "./chunk-67EXHO4T.js";
4
4
 
5
5
  // src/components/ColorPicker/ColorPicker.component.tsx
6
6
  import { useState, useRef, useEffect, useCallback } from "react";
@@ -205,6 +205,7 @@ var ColorPicker = ({
205
205
  size = "md",
206
206
  inline = false,
207
207
  label,
208
+ ariaLabel,
208
209
  className = ""
209
210
  }) => {
210
211
  const initialHex = value ?? defaultValue ?? "#6366f1";
@@ -504,7 +505,7 @@ var ColorPicker = ({
504
505
  type: "button",
505
506
  className: "eidos-color-picker-trigger",
506
507
  disabled,
507
- "aria-label": label ?? "Open colour picker",
508
+ "aria-label": label ?? ariaLabel ?? "Open colour picker",
508
509
  children: [
509
510
  /* @__PURE__ */ jsx(
510
511
  "span",
@@ -531,4 +532,4 @@ ColorPicker.displayName = "ColorPicker";
531
532
  export {
532
533
  ColorPicker
533
534
  };
534
- //# sourceMappingURL=chunk-YDPEHUMH.js.map
535
+ //# sourceMappingURL=chunk-TYGVKSL6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ColorPicker/ColorPicker.component.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { Copy, Check } from 'lucide-react';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport type {\n ColorPickerProps,\n HSVColor,\n RGBColor,\n HSLColor,\n ColorFormat,\n} from './ColorPicker.types';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_SWATCHES: string[] = [\n '#ef4444',\n '#f97316',\n '#f59e0b',\n '#10b981',\n '#06b6d4',\n '#6366f1',\n '#8b5cf6',\n '#ec4899',\n '#64748b',\n '#1e293b',\n];\n\n// ============================================================================\n// Pure colour-utility functions\n// ============================================================================\n\nfunction hsvToRgb(h: number, s: number, v: number): RGBColor {\n // h: 0–360, s: 0–100, v: 0–100 → r,g,b: 0–255\n const sn = s / 100;\n const vn = v / 100;\n const c = vn * sn;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = vn - c;\n\n let r: number, g: number, b: number;\n if (h < 60) {\n r = c;\n g = x;\n b = 0;\n } else if (h < 120) {\n r = x;\n g = c;\n b = 0;\n } else if (h < 180) {\n r = 0;\n g = c;\n b = x;\n } else if (h < 240) {\n r = 0;\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n g = 0;\n b = c;\n } else {\n r = c;\n g = 0;\n b = x;\n }\n\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n };\n}\n\nfunction rgbToHsv(r: number, g: number, b: number): HSVColor {\n // r,g,b: 0–255 → h: 0–360, s: 0–100, v: 0–100\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const delta = max - min;\n\n const v = max * 100;\n const s = max === 0 ? 0 : (delta / max) * 100;\n\n let h = 0;\n if (delta !== 0) {\n if (max === rn) h = ((gn - bn) / delta) % 6;\n else if (max === gn) h = (bn - rn) / delta + 2;\n else h = (rn - gn) / delta + 4;\n h = h * 60;\n if (h < 0) h += 360;\n }\n\n // Deliberately NOT rounded. HSV is this component's internal state, and\n // rounding s/v to whole percent makes the hex -> HSV -> hex round trip lossy:\n // `#5c5de8` came back as `#5d5de8`, so a controlled `value` displayed a\n // different colour than the one passed in, and any interaction committed the\n // drifted value. `hsvToRgb` already rounds to whole channels at the end, so\n // precision is only needed in between. Every consumer of these floats (the\n // hue gradient, the thumb offsets, the hue slider) accepts them.\n return { h, s, v };\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n const ch = (n: number) =>\n Math.round(Math.max(0, Math.min(255, n)))\n .toString(16)\n .padStart(2, '0');\n return `#${ch(r)}${ch(g)}${ch(b)}`;\n}\n\nfunction hexToRgb(hex: string): RGBColor | null {\n const c = hex.trim().replace(/^#/, '');\n let r: number, g: number, b: number;\n\n if (c.length === 3) {\n r = parseInt(c[0] + c[0], 16);\n g = parseInt(c[1] + c[1], 16);\n b = parseInt(c[2] + c[2], 16);\n } else if (c.length === 6) {\n r = parseInt(c.slice(0, 2), 16);\n g = parseInt(c.slice(2, 4), 16);\n b = parseInt(c.slice(4, 6), 16);\n } else {\n return null;\n }\n\n if (isNaN(r) || isNaN(g) || isNaN(b)) return null;\n return { r, g, b };\n}\n\nfunction rgbToHsl(r: number, g: number, b: number): HSLColor {\n // r,g,b: 0–255 → h: 0–360, s: 0–100, l: 0–100\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const delta = max - min;\n const l = (max + min) / 2;\n\n let h = 0;\n let s = 0;\n\n if (delta !== 0) {\n s = delta / (1 - Math.abs(2 * l - 1));\n if (max === rn) h = ((gn - bn) / delta) % 6;\n else if (max === gn) h = (bn - rn) / delta + 2;\n else h = (rn - gn) / delta + 4;\n h = h * 60;\n if (h < 0) h += 360;\n }\n\n return { h: Math.round(h), s: Math.round(s * 100), l: Math.round(l * 100) };\n}\n\nfunction hslToRgb(h: number, s: number, l: number): RGBColor {\n // h: 0–360, s: 0–100, l: 0–100 → r,g,b: 0–255\n const sn = s / 100;\n const ln = l / 100;\n const c = (1 - Math.abs(2 * ln - 1)) * sn;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = ln - c / 2;\n\n let r: number, g: number, b: number;\n if (h < 60) {\n r = c;\n g = x;\n b = 0;\n } else if (h < 120) {\n r = x;\n g = c;\n b = 0;\n } else if (h < 180) {\n r = 0;\n g = c;\n b = x;\n } else if (h < 240) {\n r = 0;\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n g = 0;\n b = c;\n } else {\n r = c;\n g = 0;\n b = x;\n }\n\n return {\n r: Math.round((r + m) * 255),\n g: Math.round((g + m) * 255),\n b: Math.round((b + m) * 255),\n };\n}\n\n// ============================================================================\n// Format helpers\n// ============================================================================\n\nfunction colorToText(hsv: HSVColor, alpha: number, fmt: ColorFormat): string {\n const rgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n\n switch (fmt) {\n case 'hex':\n return rgbToHex(rgb.r, rgb.g, rgb.b);\n case 'rgb':\n return alpha < 1\n ? `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha.toFixed(2)})`\n : `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;\n case 'hsl': {\n const hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);\n return alpha < 1\n ? `hsla(${hsl.h}, ${hsl.s}%, ${hsl.l}%, ${alpha.toFixed(2)})`\n : `hsl(${hsl.h}, ${hsl.s}%, ${hsl.l}%)`;\n }\n }\n}\n\nfunction parseColorText(text: string): RGBColor | null {\n const t = text.trim();\n\n // Try hex (with or without leading #)\n const hexCandidate = t.startsWith('#') ? t : /^[0-9a-f]{3,6}$/i.test(t) ? `#${t}` : null;\n if (hexCandidate) return hexToRgb(hexCandidate);\n\n // Try rgb() / rgba()\n const rgbMatch = t.match(/rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)/i);\n if (rgbMatch) {\n return {\n r: parseInt(rgbMatch[1], 10),\n g: parseInt(rgbMatch[2], 10),\n b: parseInt(rgbMatch[3], 10),\n };\n }\n\n // Try hsl() / hsla()\n const hslMatch = t.match(/hsla?\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?/i);\n if (hslMatch) {\n return hslToRgb(\n parseInt(hslMatch[1], 10),\n parseInt(hslMatch[2], 10),\n parseInt(hslMatch[3], 10),\n );\n }\n\n return null;\n}\n\n/** Parse a hex string to HSVColor, falling back to red on failure. */\nfunction hexToHsv(hex: string): HSVColor {\n const rgb = hexToRgb(hex);\n return rgb ? rgbToHsv(rgb.r, rgb.g, rgb.b) : { h: 0, s: 100, v: 100 };\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport const ColorPicker: React.FC<ColorPickerProps> = ({\n value,\n defaultValue,\n onChange,\n format = 'hex',\n showAlpha = false,\n showSwatches = true,\n swatches = DEFAULT_SWATCHES,\n disabled = false,\n size = 'md',\n inline = false,\n label,\n ariaLabel,\n className = '',\n}) => {\n // ── Initial hex (only used on first render by useState) ──────────────────\n const initialHex = value ?? defaultValue ?? '#6366f1';\n\n // ── State ─────────────────────────────────────────────────────────────────\n const [hsv, setHsv] = useState<HSVColor>(() => hexToHsv(initialHex));\n const [alpha, setAlpha] = useState<number>(1);\n const [activeFormat, setActiveFormat] = useState<ColorFormat>(format);\n const [inputText, setInputText] = useState<string>(() =>\n colorToText(hexToHsv(initialHex), 1, format),\n );\n const [copied, setCopied] = useState(false);\n\n // ── Refs - give event handlers always-fresh values without stale closures ──\n const hsvRef = useRef<HSVColor>(hsv);\n hsvRef.current = hsv;\n\n const alphaRef = useRef<number>(alpha);\n alphaRef.current = alpha;\n\n const activeFormatRef = useRef<ColorFormat>(activeFormat);\n activeFormatRef.current = activeFormat;\n\n // onChange is stored in a ref so applyColor never becomes stale\n const onChangeRef = useRef<ColorPickerProps['onChange']>(onChange);\n onChangeRef.current = onChange;\n\n const inputFocusedRef = useRef(false);\n const canvasRef = useRef<HTMLDivElement>(null);\n\n // Refs for in-flight drag listeners - cleaned up on mouseup and on unmount\n const dragHandlersRef = useRef<{\n move: (e: MouseEvent) => void;\n up: () => void;\n } | null>(null);\n\n const copiedTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // ── Derived ───────────────────────────────────────────────────────────────\n const currentRgb = hsvToRgb(hsv.h, hsv.s, hsv.v);\n const currentHex = rgbToHex(currentRgb.r, currentRgb.g, currentRgb.b);\n\n // ── Sync from controlled `value` prop ─────────────────────────────────────\n // Runs only when `value` changes. We normalize both sides to the same\n // hex format before comparing so that round-trip conversions don't trigger\n // spurious updates (which would overwrite the preserved hue when s/v = 0).\n useEffect(() => {\n if (value === undefined) return;\n const rgb = hexToRgb(value);\n if (!rgb) return;\n const newHsv = rgbToHsv(rgb.r, rgb.g, rgb.b);\n const newNormalised = rgbToHex(\n ...(Object.values(hsvToRgb(newHsv.h, newHsv.s, newHsv.v)) as [number, number, number]),\n );\n // currentHex is captured from this render - guards against echo loops\n // when the parent echoes back our own onChange emission\n if (newNormalised === currentHex) return;\n setHsv(newHsv);\n if (!inputFocusedRef.current) {\n setInputText(colorToText(newHsv, alphaRef.current, activeFormatRef.current));\n }\n }, [value, currentHex]);\n\n // ── Cleanup drag listeners and timers on unmount ──────────────────────────\n useEffect(() => {\n return () => {\n if (dragHandlersRef.current) {\n document.removeEventListener('mousemove', dragHandlersRef.current.move);\n document.removeEventListener('mouseup', dragHandlersRef.current.up);\n }\n if (copiedTimerRef.current) clearTimeout(copiedTimerRef.current);\n };\n }, []);\n\n // ── Core: apply a new HSV + alpha, emit onChange ───────────────────────────\n // Stable (empty dep array) - reads live values exclusively via refs.\n const applyColor = useCallback((newHsv: HSVColor, newAlpha: number) => {\n setHsv(newHsv);\n setAlpha(newAlpha);\n\n if (!inputFocusedRef.current) {\n setInputText(colorToText(newHsv, newAlpha, activeFormatRef.current));\n }\n\n const rgb = hsvToRgb(newHsv.h, newHsv.s, newHsv.v);\n const hex = rgbToHex(rgb.r, rgb.g, rgb.b);\n onChangeRef.current?.(hex);\n }, []);\n\n // ── 2-D saturation / brightness canvas ────────────────────────────────────\n const handleCanvasMouseDown = useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n e.preventDefault();\n\n const pick = (clientX: number, clientY: number) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const rect = canvas.getBoundingClientRect();\n const s = Math.max(0, Math.min(100, ((clientX - rect.left) / rect.width) * 100));\n const v = Math.max(0, Math.min(100, 100 - ((clientY - rect.top) / rect.height) * 100));\n applyColor({ h: hsvRef.current.h, s, v }, alphaRef.current);\n };\n\n pick(e.clientX, e.clientY);\n\n const handleMouseMove = (me: MouseEvent) => pick(me.clientX, me.clientY);\n const handleMouseUp = () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n dragHandlersRef.current = null;\n };\n\n dragHandlersRef.current = { move: handleMouseMove, up: handleMouseUp };\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n },\n [disabled, applyColor],\n );\n\n // ── Hue slider ────────────────────────────────────────────────────────────\n const handleHueChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n applyColor({ ...hsvRef.current, h: Number(e.target.value) }, alphaRef.current);\n },\n [applyColor],\n );\n\n // ── Alpha slider ──────────────────────────────────────────────────────────\n const handleAlphaChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n applyColor(hsvRef.current, Number(e.target.value) / 100);\n },\n [applyColor],\n );\n\n // ── Format toggle ─────────────────────────────────────────────────────────\n const handleFormatChange = useCallback((fmt: ColorFormat) => {\n setActiveFormat(fmt);\n setInputText(colorToText(hsvRef.current, alphaRef.current, fmt));\n }, []);\n\n // ── Text-input commit (Enter / blur) ──────────────────────────────────────\n const handleInputCommit = useCallback(() => {\n const rgb = parseColorText(inputText);\n if (!rgb) {\n // Invalid - reset to the current valid colour\n setInputText(colorToText(hsvRef.current, alphaRef.current, activeFormatRef.current));\n return;\n }\n const newHsv = rgbToHsv(rgb.r, rgb.g, rgb.b);\n applyColor(newHsv, alphaRef.current);\n // Always normalise the text after a commit (even if the input still has focus)\n setInputText(colorToText(newHsv, alphaRef.current, activeFormatRef.current));\n }, [inputText, applyColor]);\n\n // ── Swatch click ──────────────────────────────────────────────────────────\n const handleSwatchClick = useCallback(\n (hex: string) => {\n const rgb = hexToRgb(hex);\n if (!rgb) return;\n applyColor(rgbToHsv(rgb.r, rgb.g, rgb.b), alphaRef.current);\n },\n [applyColor],\n );\n\n // ── Copy to clipboard ─────────────────────────────────────────────────────\n const handleCopy = useCallback(() => {\n const text = colorToText(hsvRef.current, alphaRef.current, activeFormatRef.current);\n navigator.clipboard\n .writeText(text)\n .then(() => {\n setCopied(true);\n if (copiedTimerRef.current) clearTimeout(copiedTimerRef.current);\n copiedTimerRef.current = setTimeout(() => setCopied(false), 2000);\n })\n .catch(() => {\n // Clipboard access denied - silently ignore\n });\n }, []);\n\n // ── Alpha-slider background gradient ─────────────────────────────────────\n // We use a transparent-to-current-colour gradient layered over a checkerboard\n // so the alpha slider always shows the correct colour transition.\n const transparentColor = `rgba(${currentRgb.r}, ${currentRgb.g}, ${currentRgb.b}, 0)`;\n\n const alphaTrackBg = {\n backgroundImage: [\n `linear-gradient(to right, ${transparentColor}, ${currentHex})`,\n 'linear-gradient(45deg, #e2e8f0 25%, transparent 25%)',\n 'linear-gradient(-45deg, #e2e8f0 25%, transparent 25%)',\n 'linear-gradient(45deg, transparent 75%, #e2e8f0 75%)',\n 'linear-gradient(-45deg, transparent 75%, #e2e8f0 75%)',\n ].join(', '),\n backgroundSize: '100%, 8px 8px, 8px 8px, 8px 8px, 8px 8px',\n backgroundPosition: '0 0, 0 0, 0 4px, 4px -4px, -4px 0',\n };\n\n // ── Picker panel (shared between inline and popover modes) ────────────────\n //\n // The size modifier has to live on the panel itself, not only on the root:\n // in popover mode the panel is portaled to document.body by Dropdown, so\n // anything inside it that sized itself off a `.eidos-color-picker--{size}`\n // ancestor matched nothing and collapsed. That is what removed the\n // saturation/brightness canvas entirely from every non-inline picker.\n const panel = (\n <div\n className={`eidos-color-picker-panel eidos-color-picker-panel--${size}${\n inline ? ' eidos-color-picker-panel--inline' : ''\n }`}\n >\n {/* 2-D sat / brightness canvas */}\n <div\n ref={canvasRef}\n className=\"eidos-color-picker-canvas\"\n style={{\n background: [\n 'linear-gradient(to top, #000, transparent)',\n `linear-gradient(to right, #fff, hsl(${hsv.h}, 100%, 50%))`,\n ].join(', '),\n }}\n onMouseDown={handleCanvasMouseDown}\n role=\"presentation\"\n >\n <div\n className=\"eidos-color-picker-thumb\"\n style={{\n // Rounded for display only - hsv.s/v are unrounded floats so the\n // hex round trip stays lossless (see rgbToHsv).\n left: `${hsv.s.toFixed(2)}%`,\n top: `${(100 - hsv.v).toFixed(2)}%`,\n background: currentHex,\n }}\n />\n </div>\n\n {/* Sliders */}\n <div className=\"eidos-color-picker-sliders\">\n {/* Hue */}\n <input\n type=\"range\"\n className=\"eidos-color-picker-hue\"\n min={0}\n max={360}\n step={1}\n value={hsv.h}\n disabled={disabled}\n onChange={handleHueChange}\n aria-label=\"Hue\"\n />\n\n {/* Alpha */}\n {showAlpha && (\n <div className=\"eidos-color-picker-alpha-wrapper\">\n <div className=\"eidos-color-picker-alpha-bg\" style={alphaTrackBg} />\n <input\n type=\"range\"\n className=\"eidos-color-picker-alpha\"\n min={0}\n max={100}\n step={1}\n value={Math.round(alpha * 100)}\n disabled={disabled}\n onChange={handleAlphaChange}\n aria-label=\"Opacity\"\n />\n </div>\n )}\n </div>\n\n {/* Text input + format toggles + copy */}\n <div className=\"eidos-color-picker-inputs\">\n <div className=\"eidos-color-picker-format-btns\" role=\"group\" aria-label=\"Colour format\">\n {(['hex', 'rgb', 'hsl'] as ColorFormat[]).map((fmt) => (\n <button\n key={fmt}\n type=\"button\"\n className={[\n 'eidos-color-picker-format-btn',\n activeFormat === fmt && 'eidos-color-picker-format-btn--active',\n ]\n .filter(Boolean)\n .join(' ')}\n onClick={() => handleFormatChange(fmt)}\n disabled={disabled}\n aria-pressed={activeFormat === fmt}\n >\n {fmt.toUpperCase()}\n </button>\n ))}\n </div>\n\n <input\n type=\"text\"\n className=\"eidos-color-picker-input\"\n value={inputText}\n disabled={disabled}\n spellCheck={false}\n aria-label=\"Colour value\"\n onChange={(e) => setInputText(e.target.value)}\n onFocus={() => {\n inputFocusedRef.current = true;\n }}\n onBlur={() => {\n inputFocusedRef.current = false;\n handleInputCommit();\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleInputCommit();\n if (e.key === 'Escape') {\n setInputText(colorToText(hsvRef.current, alphaRef.current, activeFormatRef.current));\n }\n }}\n />\n\n <button\n type=\"button\"\n className={['eidos-color-picker-copy', copied && 'eidos-color-picker-copy--copied']\n .filter(Boolean)\n .join(' ')}\n onClick={handleCopy}\n disabled={disabled}\n aria-label=\"Copy colour value\"\n title=\"Copy colour value\"\n >\n {copied ? <Check size={14} /> : <Copy size={14} />}\n </button>\n </div>\n\n {/* Swatches */}\n {showSwatches && (\n <div className=\"eidos-color-picker-swatches\" role=\"group\" aria-label=\"Colour presets\">\n {swatches.map((swatchHex) => (\n <button\n key={swatchHex}\n type=\"button\"\n className={[\n 'eidos-color-picker-swatch',\n currentHex === swatchHex && 'eidos-color-picker-swatch--active',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{ background: swatchHex }}\n onClick={() => handleSwatchClick(swatchHex)}\n disabled={disabled}\n aria-label={`Select ${swatchHex}`}\n title={swatchHex}\n />\n ))}\n </div>\n )}\n </div>\n );\n\n // ── Root element classes ───────────────────────────────────────────────────\n const rootClasses = [\n 'eidos-color-picker',\n `eidos-color-picker--${size}`,\n disabled && 'eidos-color-picker--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // ── Inline mode ───────────────────────────────────────────────────────────\n if (inline) {\n return (\n <div className={rootClasses}>\n {label && <span className=\"eidos-color-picker-label\">{label}</span>}\n {panel}\n </div>\n );\n }\n\n // ── Popover (trigger + Dropdown) ──────────────────────────────────────────\n return (\n <div className={rootClasses}>\n {label && <span className=\"eidos-color-picker-label\">{label}</span>}\n <Dropdown\n trigger={\n <button\n type=\"button\"\n className=\"eidos-color-picker-trigger\"\n disabled={disabled}\n aria-label={label ?? ariaLabel ?? 'Open colour picker'}\n >\n <span\n className=\"eidos-color-picker-trigger-swatch\"\n style={{ background: currentHex }}\n />\n <span className=\"eidos-color-picker-trigger-value\">{currentHex}</span>\n </button>\n }\n content={panel}\n placement=\"bottom\"\n autoWidth={false}\n minWidth={260}\n disabled={disabled}\n />\n </div>\n );\n};\n\nColorPicker.displayName = 'ColorPicker';\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkD2SKXRKPcjs = require('./chunk-D2SKXRKP.cjs');
3
+ var _chunkG74DHVHVcjs = require('./chunk-G74DHVHV.cjs');
4
4
 
5
5
  // src/components/ContextMenu/ContextMenu.component.tsx
6
6
  var _react = require('react');
@@ -92,7 +92,7 @@ var ContextMenu = ({
92
92
  top: position.y,
93
93
  left: position.x
94
94
  },
95
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkD2SKXRKPcjs.MenuPanel, { items, onItemClick: handleItemClick })
95
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkG74DHVHVcjs.MenuPanel, { items, onItemClick: handleItemClick })
96
96
  }
97
97
  ),
98
98
  document.body
@@ -103,4 +103,4 @@ var ContextMenu = ({
103
103
 
104
104
 
105
105
  exports.ContextMenu = ContextMenu;
106
- //# sourceMappingURL=chunk-I3CSPYHG.cjs.map
106
+ //# sourceMappingURL=chunk-TYSNOPMQ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-I3CSPYHG.cjs","../src/components/ContextMenu/ContextMenu.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,8BAAgE;AAChE,qCAA6B;AAkHzB,+CAAA;AAnFG,IAAM,YAAA,EAA0C,CAAC;AAAA,EACtD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,EAAA,EAAI,6BAAA,KAAc,CAAA;AAC1C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,EAAA,EAAI,6BAAA,EAAyB,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAE,CAAC,CAAA;AACrE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,EAAA,EAAI,6BAAA,KAAc,CAAA;AACtD,EAAA,MAAM,QAAA,EAAU,2BAAA,IAA2B,CAAA;AAE3C,EAAA,MAAM,MAAA,EAAQ,gCAAA,CAAY,EAAA,GAAM;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,CAAC,CAAA;AAGL,EAAA,8BAAA,CAAU,EAAA,GAAM;AACd,IAAA,GAAA,CAAI,CAAC,OAAA,GAAU,CAAC,OAAA,CAAQ,OAAA,EAAS,MAAA;AAEjC,IAAA,MAAM,KAAA,EAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,MAAM,EAAE,KAAA,EAAO,OAAO,EAAA,EAAI,IAAA,CAAK,qBAAA,CAAsB,CAAA;AACrD,IAAA,MAAM,GAAA,EAAK,MAAA,CAAO,UAAA;AAClB,IAAA,MAAM,GAAA,EAAK,MAAA,CAAO,WAAA;AAClB,IAAA,MAAM,IAAA,EAAM,CAAA;AAEZ,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,MAAA,EAAQ,GAAG,CAAA;AACtD,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAEvD,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAA,EAAA;AACD,IAAA;AACD,IAAA;AACG,EAAA;AAGL,EAAA;AACD,IAAA;AAEP,IAAA;AACQ,MAAA;AACJ,QAAA;AACR,MAAA;AACF,IAAA;AAES,IAAA;AACI,IAAA;AACG,EAAA;AAGF,EAAA;AACD,IAAA;AAEP,IAAA;AACU,MAAA;AAChB,IAAA;AAEM,IAAA;AAEG,IAAA;AACF,IAAA;AACM,IAAA;AACF,MAAA;AACF,MAAA;AACT,IAAA;AACgB,EAAA;AAEZ,EAAA;AACU,IAAA;AACG,IAAA;AACC,IAAA;AACJ,IAAA;AACE,IAAA;AACG,IAAA;AACrB,EAAA;AAEM,EAAA;AACiB,IAAA;AACb,MAAA;AACR,IAAA;AACM,IAAA;AACR,EAAA;AAGE,EAAA;AACE,oBAAA;AAAC,MAAA;AAAA,MAAA;AACa,QAAA;AACG,QAAA;AAEd,QAAA;AAAA,MAAA;AACH,IAAA;AAGE,IAAA;AACE,sBAAA;AAAC,QAAA;AAAA,QAAA;AACM,UAAA;AACM,UAAA;AACT,YAAA;AACA,YAAA;AAEQ,UAAA;AAEH,UAAA;AACA,YAAA;AACC,YAAA;AACR,UAAA;AAEA,UAAA;AAAuD,QAAA;AACzD,MAAA;AACS,MAAA;AACX,IAAA;AACJ,EAAA;AAEJ;AD3CuB;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-I3CSPYHG.cjs","sourcesContent":[null,"import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuPanel } from '../Menu';\nimport type { MenuItem } from '../Menu';\nimport type { ContextMenuProps } from './ContextMenu.types';\n\ninterface MenuPosition {\n x: number;\n y: number;\n}\n\n/**\n * ContextMenu - wraps any content and attaches a right-click (or long-press)\n * triggered menu positioned at the cursor.\n *\n * The browser's native context menu is suppressed when `disabled` is false.\n * The menu closes on: click outside, item selection, Escape, and scroll.\n *\n * @example\n * ```tsx\n * <ContextMenu\n * items={[\n * { type: 'item', id: 'copy', label: 'Copy', icon: Copy, onClick: () => copy() },\n * { type: 'item', id: 'cut', label: 'Cut', icon: Scissors, onClick: () => cut() },\n * { type: 'separator', id: 'sep1' },\n * { type: 'item', id: 'delete', label: 'Delete', icon: Trash2, onClick: () => remove(), disabled: true },\n * ]}\n * >\n * <div className=\"canvas-area\">...</div>\n * </ContextMenu>\n * ```\n */\nexport const ContextMenu: React.FC<ContextMenuProps> = ({\n items,\n children,\n disabled = false,\n className = '',\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState<MenuPosition>({ x: 0, y: 0 });\n const [isPositioned, setIsPositioned] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setIsPositioned(false);\n }, []);\n\n // Measure the menu panel after it renders and clamp to viewport edges.\n useEffect(() => {\n if (!isOpen || !menuRef.current) return;\n\n const menu = menuRef.current;\n const { width, height } = menu.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const GAP = 4; // px clearance from viewport edge\n\n const clampedX = Math.min(position.x, vw - width - GAP);\n const clampedY = Math.min(position.y, vh - height - GAP);\n\n menu.style.left = `${Math.max(GAP, clampedX)}px`;\n menu.style.top = `${Math.max(GAP, clampedY)}px`;\n setIsPositioned(true);\n }, [isOpen, position]);\n\n // Close on click outside.\n useEffect(() => {\n if (!isOpen) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n close();\n }\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [isOpen, close]);\n\n // Close on Escape or scroll.\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close();\n };\n\n const handleScroll = () => close();\n\n document.addEventListener('keydown', handleKeyDown);\n window.addEventListener('scroll', handleScroll, true); // capture: catches nested scrollers\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('scroll', handleScroll, true);\n };\n }, [isOpen, close]);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n e.stopPropagation();\n setIsOpen(true);\n setIsPositioned(false);\n setPosition({ x: e.clientX, y: e.clientY });\n };\n\n const handleItemClick = useCallback(\n (_item: MenuItem) => {\n close();\n },\n [close],\n );\n\n return (\n <>\n <div\n className={['eidos-context-menu-target', className].filter(Boolean).join(' ')}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n\n {isOpen &&\n createPortal(\n <div\n ref={menuRef}\n className={[\n 'eidos-context-menu-panel',\n isPositioned && 'eidos-context-menu-panel--positioned',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n top: position.y,\n left: position.x,\n }}\n >\n <MenuPanel items={items} onItemClick={handleItemClick} />\n </div>,\n document.body,\n )}\n </>\n );\n};\n"]}
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-TYSNOPMQ.cjs","../src/components/ContextMenu/ContextMenu.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,8BAAgE;AAChE,qCAA6B;AAkHzB,+CAAA;AAnFG,IAAM,YAAA,EAA0C,CAAC;AAAA,EACtD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,EAAA,EAAI,6BAAA,KAAc,CAAA;AAC1C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,EAAA,EAAI,6BAAA,EAAyB,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAE,CAAC,CAAA;AACrE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,EAAA,EAAI,6BAAA,KAAc,CAAA;AACtD,EAAA,MAAM,QAAA,EAAU,2BAAA,IAA2B,CAAA;AAE3C,EAAA,MAAM,MAAA,EAAQ,gCAAA,CAAY,EAAA,GAAM;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,CAAC,CAAA;AAGL,EAAA,8BAAA,CAAU,EAAA,GAAM;AACd,IAAA,GAAA,CAAI,CAAC,OAAA,GAAU,CAAC,OAAA,CAAQ,OAAA,EAAS,MAAA;AAEjC,IAAA,MAAM,KAAA,EAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,MAAM,EAAE,KAAA,EAAO,OAAO,EAAA,EAAI,IAAA,CAAK,qBAAA,CAAsB,CAAA;AACrD,IAAA,MAAM,GAAA,EAAK,MAAA,CAAO,UAAA;AAClB,IAAA,MAAM,GAAA,EAAK,MAAA,CAAO,WAAA;AAClB,IAAA,MAAM,IAAA,EAAM,CAAA;AAEZ,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,MAAA,EAAQ,GAAG,CAAA;AACtD,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAEvD,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAA,EAAA;AACD,IAAA;AACD,IAAA;AACG,EAAA;AAGL,EAAA;AACD,IAAA;AAEP,IAAA;AACQ,MAAA;AACJ,QAAA;AACR,MAAA;AACF,IAAA;AAES,IAAA;AACI,IAAA;AACG,EAAA;AAGF,EAAA;AACD,IAAA;AAEP,IAAA;AACU,MAAA;AAChB,IAAA;AAEM,IAAA;AAEG,IAAA;AACF,IAAA;AACM,IAAA;AACF,MAAA;AACF,MAAA;AACT,IAAA;AACgB,EAAA;AAEZ,EAAA;AACU,IAAA;AACG,IAAA;AACC,IAAA;AACJ,IAAA;AACE,IAAA;AACG,IAAA;AACrB,EAAA;AAEM,EAAA;AACiB,IAAA;AACb,MAAA;AACR,IAAA;AACM,IAAA;AACR,EAAA;AAGE,EAAA;AACE,oBAAA;AAAC,MAAA;AAAA,MAAA;AACa,QAAA;AACG,QAAA;AAEd,QAAA;AAAA,MAAA;AACH,IAAA;AAGE,IAAA;AACE,sBAAA;AAAC,QAAA;AAAA,QAAA;AACM,UAAA;AACM,UAAA;AACT,YAAA;AACA,YAAA;AAEQ,UAAA;AAEH,UAAA;AACA,YAAA;AACC,YAAA;AACR,UAAA;AAEA,UAAA;AAAuD,QAAA;AACzD,MAAA;AACS,MAAA;AACX,IAAA;AACJ,EAAA;AAEJ;AD3CuB;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-TYSNOPMQ.cjs","sourcesContent":[null,"import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuPanel } from '../Menu';\nimport type { MenuItem } from '../Menu';\nimport type { ContextMenuProps } from './ContextMenu.types';\n\ninterface MenuPosition {\n x: number;\n y: number;\n}\n\n/**\n * ContextMenu - wraps any content and attaches a right-click (or long-press)\n * triggered menu positioned at the cursor.\n *\n * The browser's native context menu is suppressed when `disabled` is false.\n * The menu closes on: click outside, item selection, Escape, and scroll.\n *\n * @example\n * ```tsx\n * <ContextMenu\n * items={[\n * { type: 'item', id: 'copy', label: 'Copy', icon: Copy, onClick: () => copy() },\n * { type: 'item', id: 'cut', label: 'Cut', icon: Scissors, onClick: () => cut() },\n * { type: 'separator', id: 'sep1' },\n * { type: 'item', id: 'delete', label: 'Delete', icon: Trash2, onClick: () => remove(), disabled: true },\n * ]}\n * >\n * <div className=\"canvas-area\">...</div>\n * </ContextMenu>\n * ```\n */\nexport const ContextMenu: React.FC<ContextMenuProps> = ({\n items,\n children,\n disabled = false,\n className = '',\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState<MenuPosition>({ x: 0, y: 0 });\n const [isPositioned, setIsPositioned] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setIsPositioned(false);\n }, []);\n\n // Measure the menu panel after it renders and clamp to viewport edges.\n useEffect(() => {\n if (!isOpen || !menuRef.current) return;\n\n const menu = menuRef.current;\n const { width, height } = menu.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const GAP = 4; // px clearance from viewport edge\n\n const clampedX = Math.min(position.x, vw - width - GAP);\n const clampedY = Math.min(position.y, vh - height - GAP);\n\n menu.style.left = `${Math.max(GAP, clampedX)}px`;\n menu.style.top = `${Math.max(GAP, clampedY)}px`;\n setIsPositioned(true);\n }, [isOpen, position]);\n\n // Close on click outside.\n useEffect(() => {\n if (!isOpen) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n close();\n }\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [isOpen, close]);\n\n // Close on Escape or scroll.\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close();\n };\n\n const handleScroll = () => close();\n\n document.addEventListener('keydown', handleKeyDown);\n window.addEventListener('scroll', handleScroll, true); // capture: catches nested scrollers\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('scroll', handleScroll, true);\n };\n }, [isOpen, close]);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n e.stopPropagation();\n setIsOpen(true);\n setIsPositioned(false);\n setPosition({ x: e.clientX, y: e.clientY });\n };\n\n const handleItemClick = useCallback(\n (_item: MenuItem) => {\n close();\n },\n [close],\n );\n\n return (\n <>\n <div\n className={['eidos-context-menu-target', className].filter(Boolean).join(' ')}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n\n {isOpen &&\n createPortal(\n <div\n ref={menuRef}\n className={[\n 'eidos-context-menu-panel',\n isPositioned && 'eidos-context-menu-panel--positioned',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n top: position.y,\n left: position.x,\n }}\n >\n <MenuPanel items={items} onItemClick={handleItemClick} />\n </div>,\n document.body,\n )}\n </>\n );\n};\n"]}
@@ -144,6 +144,7 @@ var OTPInput = ({
144
144
  {
145
145
  className: "eidos-otp-slots",
146
146
  role: "group",
147
+ "aria-invalid": error ? true : void 0,
147
148
  "aria-labelledby": label ? labelId : void 0,
148
149
  "aria-describedby": describedBy,
149
150
  children: Array.from({ length }, (_v, index) => /* @__PURE__ */ jsx("div", { className: slotClasses(index), children: /* @__PURE__ */ jsx(
@@ -180,4 +181,4 @@ OTPInput.displayName = "OTPInput";
180
181
  export {
181
182
  OTPInput
182
183
  };
183
- //# sourceMappingURL=chunk-ZZSPQFMX.js.map
184
+ //# sourceMappingURL=chunk-U233KQZX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/OTPInput/OTPInput.component.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef, useId } from 'react';\nimport { CircleAlert } from 'lucide-react';\nimport type { OTPInputProps } from './OTPInput.types';\nimport './OTPInput.scss';\n\nexport const OTPInput: React.FC<OTPInputProps> = ({\n length = 6,\n value,\n defaultValue = '',\n onChange,\n onComplete,\n type = 'numeric',\n mask = false,\n size = 'md',\n disabled = false,\n error,\n label,\n hint,\n autoFocus = false,\n className = '',\n}) => {\n const generatedId = useId();\n const labelId = `otp-label-${generatedId}`;\n const hintId = `otp-hint-${generatedId}`;\n const errorId = `otp-error-${generatedId}`;\n\n const isControlled = value !== undefined;\n\n // Split a string into an array of `length` single characters, padding with ''\n const splitToSlots = (src: string): string[] => Array.from({ length }, (_v, i) => src[i] ?? '');\n\n const [slots, setSlots] = useState<string[]>(() =>\n splitToSlots(isControlled ? (value ?? '') : defaultValue),\n );\n\n // A ref that always mirrors the latest slots value so that event handlers\n // never operate on stale closure state during rapid sequential keystrokes.\n const slotsRef = useRef<string[]>(slots);\n\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n\n // Array of refs - one per slot input\n const inputRefs = useRef<Array<HTMLInputElement | null>>([]);\n\n // Sync internal slots when the controlled `value` prop changes\n useEffect(() => {\n if (isControlled) {\n const synced = splitToSlots(value ?? '');\n slotsRef.current = synced;\n setSlots(synced);\n }\n // splitToSlots is stable within a render; length is in deps\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, length, isControlled]);\n\n // AutoFocus: focus first empty slot on mount\n useEffect(() => {\n if (!autoFocus) return;\n const firstEmptyIdx = slots.findIndex((s) => s === '');\n const targetIdx = firstEmptyIdx === -1 ? 0 : firstEmptyIdx;\n inputRefs.current[targetIdx]?.focus();\n // Intentionally runs only on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ── Core state update ──────────────────────────────────────────────────────\n\n /**\n * Apply a new slots array, propagate onChange, and fire onComplete if every\n * slot is filled. In controlled mode we do NOT call setSlots - the parent\n * drives state via the `value` prop.\n */\n const commitChange = (newSlots: string[]) => {\n // Keep the ref in sync BEFORE state update so the next synchronous\n // handler (rapid typing) reads the correct value from the ref.\n slotsRef.current = newSlots;\n if (!isControlled) setSlots(newSlots);\n const fullValue = newSlots.join('');\n onChange?.(fullValue);\n if (newSlots.every((s) => s !== '')) {\n onComplete?.(fullValue);\n }\n };\n\n // ── Event handlers ─────────────────────────────────────────────────────────\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>, index: number) => {\n const rawValue = e.target.value;\n // When maxLength=1 is enforced, rawValue is 0–1 chars.\n // When the browser transiently allows 2 chars (typed over existing), we\n // take the last character - that's always the newly entered one.\n const char = rawValue.slice(-1);\n\n if (!char) return; // Deletes are handled by onKeyDown\n\n // Guard: numeric mode rejects non-digit characters\n if (type === 'numeric' && !/^\\d$/.test(char)) return;\n\n // Read from slotsRef (not the stale `slots` closure) so rapid keystrokes\n // don't overwrite each other when React hasn't re-rendered yet.\n const newSlots = [...slotsRef.current];\n newSlots[index] = char;\n commitChange(newSlots);\n\n // Advance focus to the next slot\n if (index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>, index: number) => {\n // ── Numeric mode: block non-digit, non-control key presses ──────────────\n if (type === 'numeric') {\n const controlKeys = [\n 'Backspace',\n 'Delete',\n 'Tab',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n ];\n const isDigit = /^\\d$/.test(e.key);\n const isControlKey = e.ctrlKey || e.metaKey;\n if (!isDigit && !controlKeys.includes(e.key) && !isControlKey) {\n e.preventDefault();\n return;\n }\n }\n\n // ── Backspace ────────────────────────────────────────────────────────────\n if (e.key === 'Backspace') {\n e.preventDefault(); // Prevent the browser from also firing onChange\n if (slotsRef.current[index] !== '') {\n // Clear the current slot\n const newSlots = [...slotsRef.current];\n newSlots[index] = '';\n commitChange(newSlots);\n } else if (index > 0) {\n // Move focus to the previous slot and clear it\n const newSlots = [...slotsRef.current];\n newSlots[index - 1] = '';\n commitChange(newSlots);\n inputRefs.current[index - 1]?.focus();\n }\n return;\n }\n\n // ── Arrow navigation ─────────────────────────────────────────────────────\n if (e.key === 'ArrowLeft' && index > 0) {\n e.preventDefault();\n inputRefs.current[index - 1]?.focus();\n return;\n }\n if (e.key === 'ArrowRight' && index < length - 1) {\n e.preventDefault();\n inputRefs.current[index + 1]?.focus();\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>, index: number) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData('text/plain');\n // Strip non-digits in numeric mode\n const filtered = type === 'numeric' ? pasted.replace(/\\D/g, '') : pasted;\n if (!filtered) return;\n\n const newSlots = [...slotsRef.current];\n let charsPlaced = 0;\n for (let i = index; i < length && charsPlaced < filtered.length; i++) {\n newSlots[i] = filtered[charsPlaced];\n charsPlaced++;\n }\n commitChange(newSlots);\n\n // Focus the slot after the last pasted character\n const nextFocusIdx = Math.min(index + charsPlaced, length - 1);\n inputRefs.current[nextFocusIdx]?.focus();\n };\n\n // ── CSS class builders ─────────────────────────────────────────────────────\n\n const containerClasses = [\n 'eidos-otp',\n `eidos-otp--${size}`,\n disabled && 'eidos-otp--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const slotClasses = (index: number) =>\n [\n 'eidos-otp-slot',\n // Show \"filled\" accent only when there's no error overriding the colour\n slots[index] !== '' && !error && 'eidos-otp-slot--filled',\n focusedIndex === index && 'eidos-otp-slot--focused',\n error && 'eidos-otp-slot--error',\n disabled && 'eidos-otp-slot--disabled',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Accessible description: prefer error, fall back to hint\n const describedBy = error ? errorId : hint ? hintId : undefined;\n\n return (\n <div className={containerClasses}>\n {label && (\n <label id={labelId} className=\"eidos-otp-label\">\n {label}\n </label>\n )}\n\n <div\n className=\"eidos-otp-slots\"\n role=\"group\"\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={describedBy}\n >\n {Array.from({ length }, (_v, index) => (\n <div key={index} className={slotClasses(index)}>\n <input\n ref={(el) => {\n inputRefs.current[index] = el;\n }}\n type={mask ? 'password' : 'text'}\n inputMode={type === 'numeric' ? 'numeric' : 'text'}\n maxLength={2}\n value={slots[index]}\n disabled={disabled}\n aria-label={`Digit ${index + 1} of ${length}`}\n autoComplete={index === 0 ? 'one-time-code' : 'off'}\n onChange={(e) => handleChange(e, index)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n onPaste={(e) => handlePaste(e, index)}\n onFocus={() => setFocusedIndex(index)}\n onBlur={() => setFocusedIndex(null)}\n />\n </div>\n ))}\n </div>\n\n {hint && !error && (\n <span id={hintId} className=\"eidos-otp-hint\">\n {hint}\n </span>\n )}\n\n {error && (\n <span id={errorId} className=\"eidos-otp-error-message\" role=\"alert\">\n <CircleAlert aria-hidden=\"true\" />\n {error}\n </span>\n )}\n </div>\n );\n};\n\nOTPInput.displayName = 'OTPInput';\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/components/OTPInput/OTPInput.component.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef, useId } from 'react';\nimport { CircleAlert } from 'lucide-react';\nimport type { OTPInputProps } from './OTPInput.types';\nimport './OTPInput.scss';\n\nexport const OTPInput: React.FC<OTPInputProps> = ({\n length = 6,\n value,\n defaultValue = '',\n onChange,\n onComplete,\n type = 'numeric',\n mask = false,\n size = 'md',\n disabled = false,\n error,\n label,\n hint,\n autoFocus = false,\n className = '',\n}) => {\n const generatedId = useId();\n const labelId = `otp-label-${generatedId}`;\n const hintId = `otp-hint-${generatedId}`;\n const errorId = `otp-error-${generatedId}`;\n\n const isControlled = value !== undefined;\n\n // Split a string into an array of `length` single characters, padding with ''\n const splitToSlots = (src: string): string[] => Array.from({ length }, (_v, i) => src[i] ?? '');\n\n const [slots, setSlots] = useState<string[]>(() =>\n splitToSlots(isControlled ? (value ?? '') : defaultValue),\n );\n\n // A ref that always mirrors the latest slots value so that event handlers\n // never operate on stale closure state during rapid sequential keystrokes.\n const slotsRef = useRef<string[]>(slots);\n\n const [focusedIndex, setFocusedIndex] = useState<number | null>(null);\n\n // Array of refs - one per slot input\n const inputRefs = useRef<Array<HTMLInputElement | null>>([]);\n\n // Sync internal slots when the controlled `value` prop changes\n useEffect(() => {\n if (isControlled) {\n const synced = splitToSlots(value ?? '');\n slotsRef.current = synced;\n setSlots(synced);\n }\n // splitToSlots is stable within a render; length is in deps\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, length, isControlled]);\n\n // AutoFocus: focus first empty slot on mount\n useEffect(() => {\n if (!autoFocus) return;\n const firstEmptyIdx = slots.findIndex((s) => s === '');\n const targetIdx = firstEmptyIdx === -1 ? 0 : firstEmptyIdx;\n inputRefs.current[targetIdx]?.focus();\n // Intentionally runs only on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ── Core state update ──────────────────────────────────────────────────────\n\n /**\n * Apply a new slots array, propagate onChange, and fire onComplete if every\n * slot is filled. In controlled mode we do NOT call setSlots - the parent\n * drives state via the `value` prop.\n */\n const commitChange = (newSlots: string[]) => {\n // Keep the ref in sync BEFORE state update so the next synchronous\n // handler (rapid typing) reads the correct value from the ref.\n slotsRef.current = newSlots;\n if (!isControlled) setSlots(newSlots);\n const fullValue = newSlots.join('');\n onChange?.(fullValue);\n if (newSlots.every((s) => s !== '')) {\n onComplete?.(fullValue);\n }\n };\n\n // ── Event handlers ─────────────────────────────────────────────────────────\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>, index: number) => {\n const rawValue = e.target.value;\n // When maxLength=1 is enforced, rawValue is 0–1 chars.\n // When the browser transiently allows 2 chars (typed over existing), we\n // take the last character - that's always the newly entered one.\n const char = rawValue.slice(-1);\n\n if (!char) return; // Deletes are handled by onKeyDown\n\n // Guard: numeric mode rejects non-digit characters\n if (type === 'numeric' && !/^\\d$/.test(char)) return;\n\n // Read from slotsRef (not the stale `slots` closure) so rapid keystrokes\n // don't overwrite each other when React hasn't re-rendered yet.\n const newSlots = [...slotsRef.current];\n newSlots[index] = char;\n commitChange(newSlots);\n\n // Advance focus to the next slot\n if (index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>, index: number) => {\n // ── Numeric mode: block non-digit, non-control key presses ──────────────\n if (type === 'numeric') {\n const controlKeys = [\n 'Backspace',\n 'Delete',\n 'Tab',\n 'Escape',\n 'ArrowLeft',\n 'ArrowRight',\n 'Home',\n 'End',\n ];\n const isDigit = /^\\d$/.test(e.key);\n const isControlKey = e.ctrlKey || e.metaKey;\n if (!isDigit && !controlKeys.includes(e.key) && !isControlKey) {\n e.preventDefault();\n return;\n }\n }\n\n // ── Backspace ────────────────────────────────────────────────────────────\n if (e.key === 'Backspace') {\n e.preventDefault(); // Prevent the browser from also firing onChange\n if (slotsRef.current[index] !== '') {\n // Clear the current slot\n const newSlots = [...slotsRef.current];\n newSlots[index] = '';\n commitChange(newSlots);\n } else if (index > 0) {\n // Move focus to the previous slot and clear it\n const newSlots = [...slotsRef.current];\n newSlots[index - 1] = '';\n commitChange(newSlots);\n inputRefs.current[index - 1]?.focus();\n }\n return;\n }\n\n // ── Arrow navigation ─────────────────────────────────────────────────────\n if (e.key === 'ArrowLeft' && index > 0) {\n e.preventDefault();\n inputRefs.current[index - 1]?.focus();\n return;\n }\n if (e.key === 'ArrowRight' && index < length - 1) {\n e.preventDefault();\n inputRefs.current[index + 1]?.focus();\n }\n };\n\n const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>, index: number) => {\n e.preventDefault();\n const pasted = e.clipboardData.getData('text/plain');\n // Strip non-digits in numeric mode\n const filtered = type === 'numeric' ? pasted.replace(/\\D/g, '') : pasted;\n if (!filtered) return;\n\n const newSlots = [...slotsRef.current];\n let charsPlaced = 0;\n for (let i = index; i < length && charsPlaced < filtered.length; i++) {\n newSlots[i] = filtered[charsPlaced];\n charsPlaced++;\n }\n commitChange(newSlots);\n\n // Focus the slot after the last pasted character\n const nextFocusIdx = Math.min(index + charsPlaced, length - 1);\n inputRefs.current[nextFocusIdx]?.focus();\n };\n\n // ── CSS class builders ─────────────────────────────────────────────────────\n\n const containerClasses = [\n 'eidos-otp',\n `eidos-otp--${size}`,\n disabled && 'eidos-otp--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const slotClasses = (index: number) =>\n [\n 'eidos-otp-slot',\n // Show \"filled\" accent only when there's no error overriding the colour\n slots[index] !== '' && !error && 'eidos-otp-slot--filled',\n focusedIndex === index && 'eidos-otp-slot--focused',\n error && 'eidos-otp-slot--error',\n disabled && 'eidos-otp-slot--disabled',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Accessible description: prefer error, fall back to hint\n const describedBy = error ? errorId : hint ? hintId : undefined;\n\n return (\n <div className={containerClasses}>\n {label && (\n <label id={labelId} className=\"eidos-otp-label\">\n {label}\n </label>\n )}\n\n <div\n className=\"eidos-otp-slots\"\n role=\"group\"\n aria-invalid={error ? true : undefined}\n aria-labelledby={label ? labelId : undefined}\n aria-describedby={describedBy}\n >\n {Array.from({ length }, (_v, index) => (\n <div key={index} className={slotClasses(index)}>\n <input\n ref={(el) => {\n inputRefs.current[index] = el;\n }}\n type={mask ? 'password' : 'text'}\n inputMode={type === 'numeric' ? 'numeric' : 'text'}\n maxLength={2}\n value={slots[index]}\n disabled={disabled}\n aria-label={`Digit ${index + 1} of ${length}`}\n autoComplete={index === 0 ? 'one-time-code' : 'off'}\n onChange={(e) => handleChange(e, index)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n onPaste={(e) => handlePaste(e, index)}\n onFocus={() => setFocusedIndex(index)}\n onBlur={() => setFocusedIndex(null)}\n />\n </div>\n ))}\n </div>\n\n {hint && !error && (\n <span id={hintId} className=\"eidos-otp-hint\">\n {hint}\n </span>\n )}\n\n {error && (\n <span id={errorId} className=\"eidos-otp-error-message\" role=\"alert\">\n <CircleAlert aria-hidden=\"true\" />\n {error}\n </span>\n )}\n </div>\n );\n};\n\nOTPInput.displayName = 'OTPInput';\n"],"mappings":"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","names":[]}
@@ -1,5 +1,9 @@
1
+ import {
2
+ useDialogFocus
3
+ } from "./chunk-WT4WBHBR.js";
4
+
1
5
  // src/components/Popover/Popover.component.tsx
2
- import { useState, useRef, useCallback, useEffect, useId } from "react";
6
+ import React, { useState, useRef, useCallback, useEffect, useId } from "react";
3
7
  import { createPortal } from "react-dom";
4
8
  import { X } from "lucide-react";
5
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -199,6 +203,9 @@ var Popover = ({
199
203
  }
200
204
  };
201
205
  }, []);
206
+ useDialogFocus(popoverState.isVisible && popoverState.isPositioned, contentRef, {
207
+ trapTab: false
208
+ });
202
209
  return /* @__PURE__ */ jsxs(Fragment, { children: [
203
210
  /* @__PURE__ */ jsx(
204
211
  "div",
@@ -206,9 +213,10 @@ var Popover = ({
206
213
  ref: triggerRef,
207
214
  className: ["eidos-popover-trigger", className].filter(Boolean).join(" "),
208
215
  onClick: toggle,
209
- "aria-expanded": popoverState.isVisible,
210
- "aria-haspopup": "dialog",
211
- children: trigger
216
+ children: React.isValidElement(trigger) ? React.cloneElement(trigger, {
217
+ "aria-expanded": popoverState.isVisible,
218
+ "aria-haspopup": "dialog"
219
+ }) : trigger
212
220
  }
213
221
  ),
214
222
  popoverState.isVisible && createPortal(
@@ -258,4 +266,4 @@ Popover.displayName = "Popover";
258
266
  export {
259
267
  Popover
260
268
  };
261
- //# sourceMappingURL=chunk-5HUZYY54.js.map
269
+ //# sourceMappingURL=chunk-UDRAM6JU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Popover/Popover.component.tsx"],"sourcesContent":["import React, { useState, useRef, useCallback, useEffect, useId } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport type { PopoverProps, PopoverState, PopoverPlacement } from './Popover.types';\nimport { useDialogFocus } from '../../utils';\n\nexport const Popover: React.FC<PopoverProps> = ({\n trigger,\n children,\n title,\n placement: preferredPlacement = 'bottom',\n showCloseButton = false,\n closeOnClickOutside = true,\n closeOnEscape = true,\n disabled = false,\n isOpen,\n defaultOpen,\n onOpenChange,\n maxWidth = 320,\n className,\n contentClassName,\n}) => {\n // ── Controlled / uncontrolled bridge ──────────────────────────────────────\n const isControlled = isOpen !== undefined;\n const [localOpen, setLocalOpen] = useState(defaultOpen ?? false);\n const isVisible = isControlled ? isOpen! : localOpen;\n\n // ── Positioning state ─────────────────────────────────────────────────────\n const [popoverState, setPopoverState] = useState<PopoverState>({\n isVisible: false,\n isPositioned: false,\n position: { top: 0, left: 0, placement: preferredPlacement },\n });\n\n // Names the dialog by pointing at the rendered title, the same way `Modal`\n // and `Drawer` do. This was an `aria-label={title ?? 'Popover'}`, which\n // both duplicated the visible text into a second, invisible copy and hard\n // limited `title` to a string - `aria-label` takes only a string, so a\n // `ReactNode` title would have been stringified to \"[object Object]\" and\n // silently destroyed the accessible name.\n const titleId = useId();\n\n // ── Refs ──────────────────────────────────────────────────────────────────\n const triggerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const animationFrameRef = useRef<number | undefined>(undefined);\n const isScrollingRef = useRef(false);\n\n // ── Open / close helpers ──────────────────────────────────────────────────\n const open = useCallback(() => {\n if (disabled) return;\n if (!isControlled) setLocalOpen(true);\n onOpenChange?.(true);\n }, [disabled, isControlled, onOpenChange]);\n\n const close = useCallback(() => {\n if (!isControlled) setLocalOpen(false);\n onOpenChange?.(false);\n }, [isControlled, onOpenChange]);\n\n const toggle = useCallback(() => {\n if (isVisible) {\n close();\n } else {\n open();\n }\n }, [isVisible, open, close]);\n\n // ── Positioning calculation ───────────────────────────────────────────────\n const calculateOptimalPosition = useCallback(\n (triggerRect: DOMRect, contentRect: DOMRect) => {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 8;\n\n let placement: PopoverPlacement = preferredPlacement;\n let top = 0;\n let left = 0;\n\n switch (preferredPlacement) {\n case 'top':\n top = triggerRect.top - contentRect.height - gap;\n left = triggerRect.left + triggerRect.width / 2 - contentRect.width / 2;\n break;\n case 'bottom':\n top = triggerRect.bottom + gap;\n left = triggerRect.left + triggerRect.width / 2 - contentRect.width / 2;\n break;\n case 'left':\n top = triggerRect.top + triggerRect.height / 2 - contentRect.height / 2;\n left = triggerRect.left - contentRect.width - gap;\n break;\n case 'right':\n top = triggerRect.top + triggerRect.height / 2 - contentRect.height / 2;\n left = triggerRect.right + gap;\n break;\n }\n\n // Flip if it doesn't fit in the preferred direction\n if (placement === 'top' && top < gap) {\n placement = 'bottom';\n top = triggerRect.bottom + gap;\n left = triggerRect.left + triggerRect.width / 2 - contentRect.width / 2;\n } else if (placement === 'bottom' && top + contentRect.height > viewportHeight - gap) {\n placement = 'top';\n top = triggerRect.top - contentRect.height - gap;\n left = triggerRect.left + triggerRect.width / 2 - contentRect.width / 2;\n } else if (placement === 'left' && left < gap) {\n placement = 'right';\n top = triggerRect.top + triggerRect.height / 2 - contentRect.height / 2;\n left = triggerRect.right + gap;\n } else if (placement === 'right' && left + contentRect.width > viewportWidth - gap) {\n placement = 'left';\n top = triggerRect.top + triggerRect.height / 2 - contentRect.height / 2;\n left = triggerRect.left - contentRect.width - gap;\n }\n\n // Clamp to viewport\n top = Math.max(gap, Math.min(top, viewportHeight - contentRect.height - gap));\n left = Math.max(gap, Math.min(left, viewportWidth - contentRect.width - gap));\n\n return { top, left, placement };\n },\n [preferredPlacement],\n );\n\n // ── Sync isVisible → popoverState ─────────────────────────────────────────\n useEffect(() => {\n if (isVisible) {\n setPopoverState((prev) => ({ ...prev, isVisible: true, isPositioned: false }));\n } else {\n setPopoverState((prev) => ({ ...prev, isVisible: false, isPositioned: false }));\n }\n }, [isVisible]);\n\n // ── Two-pass positioning (Pass 2: measure then commit) ────────────────────\n useEffect(() => {\n if (\n popoverState.isVisible &&\n !popoverState.isPositioned &&\n contentRef.current &&\n triggerRef.current\n ) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setPopoverState((prev) => ({\n ...prev,\n position: { top, left, placement },\n isPositioned: true,\n }));\n }\n }, [popoverState.isVisible, popoverState.isPositioned, calculateOptimalPosition]);\n\n // ── Scroll repositioning ─────────────────────────────────────────────────\n const handleScroll = useCallback(() => {\n if (!popoverState.isVisible || !popoverState.isPositioned || isScrollingRef.current) return;\n\n isScrollingRef.current = true;\n\n animationFrameRef.current = requestAnimationFrame(() => {\n if (triggerRef.current && contentRef.current) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setPopoverState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n\n isScrollingRef.current = false;\n });\n }, [popoverState.isVisible, popoverState.isPositioned, calculateOptimalPosition]);\n\n // ── Resize repositioning ──────────────────────────────────────────────────\n useEffect(() => {\n const handleResize = () => {\n if (\n popoverState.isVisible &&\n popoverState.isPositioned &&\n contentRef.current &&\n triggerRef.current\n ) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setPopoverState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [popoverState.isVisible, popoverState.isPositioned, calculateOptimalPosition]);\n\n // ── Scroll listener registration ─────────────────────────────────────────\n useEffect(() => {\n if (popoverState.isVisible) {\n window.addEventListener('scroll', handleScroll, { passive: true });\n document.body.addEventListener('scroll', handleScroll, { passive: true });\n }\n\n return () => {\n window.removeEventListener('scroll', handleScroll);\n document.body.removeEventListener('scroll', handleScroll);\n };\n }, [popoverState.isVisible, handleScroll]);\n\n // ── Click-outside handler ─────────────────────────────────────────────────\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (!closeOnClickOutside || !popoverState.isVisible) return;\n\n const target = event.target as Node;\n\n if (contentRef.current?.contains(target) || triggerRef.current?.contains(target)) {\n return;\n }\n\n close();\n },\n [closeOnClickOutside, popoverState.isVisible, close],\n );\n\n // ── Escape key handler ────────────────────────────────────────────────────\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n if (closeOnEscape && event.key === 'Escape' && popoverState.isVisible) {\n close();\n }\n },\n [closeOnEscape, popoverState.isVisible, close],\n );\n\n // ── Register global event listeners ──────────────────────────────────────\n useEffect(() => {\n if (popoverState.isVisible) {\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [popoverState.isVisible, handleClickOutside, handleEscapeKey]);\n\n // ── Cleanup on unmount ────────────────────────────────────────────────────\n useEffect(() => {\n const timeoutId = timeoutRef.current;\n const animationFrameId = animationFrameRef.current;\n return () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n if (animationFrameId) {\n cancelAnimationFrame(animationFrameId);\n }\n };\n }, []);\n\n // Non-modal focus handling: move focus into the panel and return it to the\n // trigger on close, but leave Tab free.\n //\n // `trapTab: false` because this dialog is honestly `aria-modal=\"false\"` -\n // the rest of the page stays available, so confining Tab would strand the\n // user. Moving focus in is still required: the panel is portaled to\n // `document.body`, so Tab from the trigger continues into whatever follows\n // it in the page and the panel's own controls cannot be reached at all.\n //\n // Keyed to `isPositioned`, not `isVisible`: the panel renders off-screen\n // for one frame while its placement is measured, and focusing it in that\n // state scrolls the page to wherever it was parked.\n useDialogFocus(popoverState.isVisible && popoverState.isPositioned, contentRef, {\n trapTab: false,\n });\n\n // ── Render ────────────────────────────────────────────────────────────────\n return (\n <>\n {/* Trigger wrapper.\n \n The wrapper carries no ARIA. It had `aria-expanded` and\n `aria-haspopup` while having no role, which is invalid - both need\n a role that supports them, and adding `role=\"button\"` here would be\n worse still, since the trigger inside is usually a real button\n (that is the `nested-interactive` shape already fixed on\n `Dropdown`).\n \n Instead the state is cloned onto the trigger element, which is the\n thing a user actually activates. Guarded by `isValidElement`\n because `trigger` is typed as `ReactNode` and may be a bare string,\n in which case there is nothing to annotate and the wrapper stays\n exactly as it was. */}\n <div\n ref={triggerRef}\n className={['eidos-popover-trigger', className].filter(Boolean).join(' ')}\n onClick={toggle}\n >\n {React.isValidElement(trigger)\n ? React.cloneElement(trigger as React.ReactElement<Record<string, unknown>>, {\n 'aria-expanded': popoverState.isVisible,\n 'aria-haspopup': 'dialog',\n })\n : trigger}\n </div>\n\n {/* Portal: floating panel */}\n {popoverState.isVisible &&\n createPortal(\n <div\n ref={contentRef}\n role=\"dialog\"\n aria-modal=\"false\"\n aria-labelledby={title ? titleId : undefined}\n // Only the untitled case still needs a literal label - there is\n // no visible text to point at.\n aria-label={title ? undefined : 'Popover'}\n className={[\n 'eidos-popover-content',\n `eidos-popover-content--${popoverState.position.placement}`,\n popoverState.isPositioned ? 'eidos-popover-content--visible' : '',\n contentClassName,\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n top: popoverState.position.top,\n left: popoverState.position.left,\n maxWidth: maxWidth,\n }}\n >\n {(title || showCloseButton) && (\n <div className=\"eidos-popover-header\">\n {title && (\n <span id={titleId} className=\"eidos-popover-title\">\n {title}\n </span>\n )}\n {showCloseButton && (\n <button\n type=\"button\"\n className=\"eidos-popover-close\"\n onClick={close}\n aria-label=\"Close popover\"\n >\n <X aria-hidden=\"true\" />\n </button>\n )}\n </div>\n )}\n <div className=\"eidos-popover-body\">{children}</div>\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nPopover.displayName = 'Popover';\n"],"mappings":"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","names":[]}
@@ -11,28 +11,28 @@ import {
11
11
  useSensors,
12
12
  useSortable,
13
13
  verticalListSortingStrategy
14
- } from "./chunk-3RLGH45H.js";
14
+ } from "./chunk-FDMYDIGI.js";
15
15
  import {
16
16
  SplitButton
17
- } from "./chunk-QIITXVRG.js";
17
+ } from "./chunk-FPLX5FIK.js";
18
18
  import {
19
19
  Pagination
20
- } from "./chunk-QUDVJUZU.js";
20
+ } from "./chunk-GPK2THIG.js";
21
21
  import {
22
22
  SegmentedControl
23
- } from "./chunk-S4S4LB63.js";
23
+ } from "./chunk-SCLFJHN2.js";
24
24
  import {
25
25
  Select
26
- } from "./chunk-X3U7SDOZ.js";
26
+ } from "./chunk-TLECMA3B.js";
27
27
  import {
28
28
  Checkbox
29
- } from "./chunk-H6CWTMAH.js";
29
+ } from "./chunk-DGXHR6FV.js";
30
30
  import {
31
31
  Combobox
32
- } from "./chunk-BC5I2MYB.js";
32
+ } from "./chunk-LH5A2SIX.js";
33
33
  import {
34
34
  Input
35
- } from "./chunk-JRLUZDKA.js";
35
+ } from "./chunk-CEC3GO4R.js";
36
36
  import {
37
37
  Spinner
38
38
  } from "./chunk-6ZAT5CGB.js";
@@ -41,17 +41,17 @@ import {
41
41
  } from "./chunk-3TUCQAYL.js";
42
42
  import {
43
43
  Menu
44
- } from "./chunk-KNQ6NN6L.js";
44
+ } from "./chunk-CP335H4Q.js";
45
45
  import {
46
46
  Dropdown
47
- } from "./chunk-2R77XZEP.js";
47
+ } from "./chunk-67EXHO4T.js";
48
48
  import {
49
49
  Button
50
- } from "./chunk-L5Q6UDY3.js";
50
+ } from "./chunk-44T4HMFU.js";
51
51
  import {
52
52
  devWarn,
53
53
  renderIcon
54
- } from "./chunk-EAJHEYZM.js";
54
+ } from "./chunk-WT4WBHBR.js";
55
55
 
56
56
  // src/components/DataGrid/DataGrid.component.tsx
57
57
  import React, { useState, useEffect, useRef, useCallback, useMemo, useLayoutEffect } from "react";
@@ -105,8 +105,7 @@ function SortableTableRow({
105
105
  transition: transition ?? void 0,
106
106
  opacity: isDragging ? 0.4 : 1
107
107
  },
108
- ...attributes,
109
- children: children(listeners ?? {}, isDragging)
108
+ children: children({ ...attributes, ...listeners ?? {} }, isDragging)
110
109
  }
111
110
  );
112
111
  }
@@ -851,7 +850,8 @@ function DataGridInner({
851
850
  checked: Boolean(value),
852
851
  onChange: () => {
853
852
  },
854
- size: "sm"
853
+ size: "sm",
854
+ "aria-label": `${col.header}, row ${rowIndex + 1}`
855
855
  }
856
856
  );
857
857
  case "select": {
@@ -884,7 +884,8 @@ function DataGridInner({
884
884
  onChange: (e) => setEditValue(e.target.value),
885
885
  autoFocus: true,
886
886
  fullWidth: true,
887
- clearable: false
887
+ clearable: false,
888
+ "aria-label": col.header
888
889
  }
889
890
  );
890
891
  case "date":
@@ -898,7 +899,8 @@ function DataGridInner({
898
899
  onChange: (e) => setEditValue(e.target.value),
899
900
  autoFocus: true,
900
901
  fullWidth: true,
901
- clearable: false
902
+ clearable: false,
903
+ "aria-label": col.header
902
904
  }
903
905
  );
904
906
  case "select": {
@@ -914,7 +916,7 @@ function DataGridInner({
914
916
  value: String(value ?? ""),
915
917
  autoOpen: true,
916
918
  fullWidth: true,
917
- inputProps: { variant, size },
919
+ inputProps: { variant, size, "aria-label": col.header },
918
920
  onChange: (v) => {
919
921
  const selected = Array.isArray(v) ? v[0] ?? "" : v;
920
922
  const newData = localDataRef.current.map(
@@ -939,7 +941,8 @@ function DataGridInner({
939
941
  onChange: (e) => setEditValue(e.target.value),
940
942
  autoFocus: true,
941
943
  fullWidth: true,
942
- clearable: false
944
+ clearable: false,
945
+ "aria-label": col.header
943
946
  }
944
947
  );
945
948
  }
@@ -1326,7 +1329,8 @@ function DataGridInner({
1326
1329
  {
1327
1330
  checked: isRowSelected,
1328
1331
  onChange: () => toggleRow(rowKeyValue),
1329
- size: "sm"
1332
+ size: "sm",
1333
+ "aria-label": `Select row ${localIndex + 1}`
1330
1334
  }
1331
1335
  ),
1332
1336
  showRowNumbers && /* @__PURE__ */ jsxs("span", { className: "eidos-datagrid-card-row-number", children: [
@@ -1432,7 +1436,8 @@ function DataGridInner({
1432
1436
  checked: allSelected,
1433
1437
  indeterminate: someSelected,
1434
1438
  onChange: toggleAll,
1435
- size: "sm"
1439
+ size: "sm",
1440
+ "aria-label": "Select all rows"
1436
1441
  }
1437
1442
  )
1438
1443
  }
@@ -1534,6 +1539,7 @@ function DataGridInner({
1534
1539
  isDragging && "eidos-datagrid-drag-handle--dragging"
1535
1540
  ].filter(Boolean).join(" "),
1536
1541
  title: "Drag to reorder",
1542
+ "aria-label": `Reorder row ${localIndex + 1}`,
1537
1543
  children: /* @__PURE__ */ jsx(GripVertical, { size: 14 })
1538
1544
  }
1539
1545
  )
@@ -1580,7 +1586,8 @@ function DataGridInner({
1580
1586
  {
1581
1587
  checked: isRowSelected,
1582
1588
  onChange: () => toggleRow(rowKeyValue),
1583
- size: "sm"
1589
+ size: "sm",
1590
+ "aria-label": `Select row ${localIndex + 1}`
1584
1591
  }
1585
1592
  )
1586
1593
  }
@@ -1718,4 +1725,4 @@ var DataGrid = Object.assign(DataGridInner, { displayName: "DataGrid" });
1718
1725
  export {
1719
1726
  DataGrid
1720
1727
  };
1721
- //# sourceMappingURL=chunk-TJC7UELT.js.map
1728
+ //# sourceMappingURL=chunk-UGTKZ7HP.js.map