eidos-ui 3.3.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/README.md +17 -5
  2. package/dist/{Input.types-XrJTI0JC.d.ts → Input.types-CSDMaZNe.d.ts} +10 -0
  3. package/dist/{Input.types-DFZNyJGF.d.cts → Input.types-D7-sWq-q.d.cts} +10 -0
  4. package/dist/{Menu.types-DNIpjSAK.d.ts → Menu.types-BN4g1-3A.d.ts} +9 -0
  5. package/dist/{Menu.types-DwcuCZM7.d.cts → Menu.types-CTnUijv5.d.cts} +9 -0
  6. package/dist/{Select.types-B4kDpkGB.d.ts → Select.types-C2tGy1vj.d.ts} +11 -1
  7. package/dist/{Select.types-CAkT2ACt.d.cts → Select.types-ok-03rLo.d.cts} +11 -1
  8. package/dist/{Table.types-CPj-udMc.d.cts → Table.types-D-9tC0kJ.d.cts} +2 -3
  9. package/dist/{Table.types-CZZ7QWAI.d.ts → Table.types-D8pmgxKA.d.ts} +2 -3
  10. package/dist/{Toolbar.types-RN0klQzu.d.ts → Toolbar.types-CKnQC_TW.d.ts} +1 -1
  11. package/dist/{Toolbar.types-DSk8z2iy.d.cts → Toolbar.types-DUz2mxct.d.cts} +1 -1
  12. package/dist/alert/index.cjs +5 -5
  13. package/dist/alert/index.js +4 -4
  14. package/dist/button/index.cjs +4 -4
  15. package/dist/button/index.js +3 -3
  16. package/dist/checkbox/index.cjs +2 -2
  17. package/dist/checkbox/index.js +1 -1
  18. package/dist/chip/index.cjs +4 -4
  19. package/dist/chip/index.js +3 -3
  20. package/dist/{chunk-ITXDSQT2.js → chunk-24HKKSKX.js} +94 -102
  21. package/dist/chunk-24HKKSKX.js.map +1 -0
  22. package/dist/{chunk-GDQWSCJQ.js → chunk-26SO4LZ5.js} +4 -4
  23. package/dist/{chunk-GPRJYPIG.js → chunk-2JW3WSBF.js} +6 -4
  24. package/dist/chunk-2JW3WSBF.js.map +1 -0
  25. package/dist/{chunk-MHZIBV2C.js → chunk-2PCCGQOH.js} +90 -19
  26. package/dist/chunk-2PCCGQOH.js.map +1 -0
  27. package/dist/{chunk-3EPND5M2.cjs → chunk-2T7ZMMH5.cjs} +72 -19
  28. package/dist/chunk-2T7ZMMH5.cjs.map +1 -0
  29. package/dist/chunk-35LGEPLP.cjs +134 -0
  30. package/dist/chunk-35LGEPLP.cjs.map +1 -0
  31. package/dist/{chunk-R4M6SNUU.cjs → chunk-36JFXFM2.cjs} +48 -37
  32. package/dist/chunk-36JFXFM2.cjs.map +1 -0
  33. package/dist/{chunk-ND526PMG.cjs → chunk-3KBBJZHK.cjs} +11 -11
  34. package/dist/{chunk-ND526PMG.cjs.map → chunk-3KBBJZHK.cjs.map} +1 -1
  35. package/dist/{chunk-EH42ND5Q.cjs → chunk-3RWZC6OW.cjs} +5 -5
  36. package/dist/{chunk-EH42ND5Q.cjs.map → chunk-3RWZC6OW.cjs.map} +1 -1
  37. package/dist/{chunk-G5N3C6AU.cjs → chunk-3ZRFOKDM.cjs} +36 -36
  38. package/dist/{chunk-G5N3C6AU.cjs.map → chunk-3ZRFOKDM.cjs.map} +1 -1
  39. package/dist/{chunk-I5XR2V4A.cjs → chunk-4AO5RKV5.cjs} +87 -96
  40. package/dist/chunk-4AO5RKV5.cjs.map +1 -0
  41. package/dist/{chunk-5HUZYY54.js → chunk-4J25XZDI.js} +23 -13
  42. package/dist/chunk-4J25XZDI.js.map +1 -0
  43. package/dist/{chunk-FXZJL2AM.cjs → chunk-4JSTBA4F.cjs} +12 -6
  44. package/dist/chunk-4JSTBA4F.cjs.map +1 -0
  45. package/dist/{chunk-GG5YGESX.js → chunk-4LNTZPSQ.js} +4 -3
  46. package/dist/chunk-4LNTZPSQ.js.map +1 -0
  47. package/dist/{chunk-3EUTXQDB.js → chunk-5XH2PHT2.js} +31 -24
  48. package/dist/chunk-5XH2PHT2.js.map +1 -0
  49. package/dist/{chunk-OJDYTCMO.cjs → chunk-66UQTF57.cjs} +69 -62
  50. package/dist/chunk-66UQTF57.cjs.map +1 -0
  51. package/dist/{chunk-MCWTQT3M.cjs → chunk-6JHVXWDV.cjs} +125 -54
  52. package/dist/chunk-6JHVXWDV.cjs.map +1 -0
  53. package/dist/chunk-75GFIQRU.js +88 -0
  54. package/dist/chunk-75GFIQRU.js.map +1 -0
  55. package/dist/{chunk-55J4LEKT.cjs → chunk-7BFODYNL.cjs} +11 -8
  56. package/dist/chunk-7BFODYNL.cjs.map +1 -0
  57. package/dist/{chunk-TEVZHN5I.cjs → chunk-7VJCGKVP.cjs} +28 -15
  58. package/dist/chunk-7VJCGKVP.cjs.map +1 -0
  59. package/dist/{chunk-KQJ3IAFT.js → chunk-A3LMUPG3.js} +2 -2
  60. package/dist/{chunk-O2AACVSF.js → chunk-AR2ZOO6L.js} +3 -3
  61. package/dist/{chunk-Z5U4NJTW.cjs → chunk-BEOECPVJ.cjs} +50 -23
  62. package/dist/chunk-BEOECPVJ.cjs.map +1 -0
  63. package/dist/{chunk-E7FGY7BJ.js → chunk-BFKPJ627.js} +5 -4
  64. package/dist/chunk-BFKPJ627.js.map +1 -0
  65. package/dist/{chunk-M7PF4FKQ.js → chunk-D7SQ7LHJ.js} +6 -3
  66. package/dist/chunk-D7SQ7LHJ.js.map +1 -0
  67. package/dist/chunk-DA375AI6.cjs +88 -0
  68. package/dist/chunk-DA375AI6.cjs.map +1 -0
  69. package/dist/{chunk-H6CWTMAH.js → chunk-DGXHR6FV.js} +5 -2
  70. package/dist/chunk-DGXHR6FV.js.map +1 -0
  71. package/dist/{chunk-ZNWIHUHZ.cjs → chunk-DU5JKTHK.cjs} +12 -4
  72. package/dist/chunk-DU5JKTHK.cjs.map +1 -0
  73. package/dist/{chunk-HALVTKW7.js → chunk-FIVMMCGM.js} +72 -81
  74. package/dist/chunk-FIVMMCGM.js.map +1 -0
  75. package/dist/{chunk-RYOQYYDO.js → chunk-GIEDIAPD.js} +12 -6
  76. package/dist/chunk-GIEDIAPD.js.map +1 -0
  77. package/dist/{chunk-NQ4L6PYW.js → chunk-GOF6A4M4.js} +2 -2
  78. package/dist/{chunk-NQ4L6PYW.js.map → chunk-GOF6A4M4.js.map} +1 -1
  79. package/dist/{chunk-L23WWO3D.js → chunk-GPVGGBIR.js} +2 -2
  80. package/dist/{chunk-OAK7HFOJ.js → chunk-GWHZFX2H.js} +21 -16
  81. package/dist/chunk-GWHZFX2H.js.map +1 -0
  82. package/dist/{chunk-HYDNZXPU.js → chunk-H2RS6Z6Q.js} +41 -25
  83. package/dist/{chunk-HYDNZXPU.js.map → chunk-H2RS6Z6Q.js.map} +1 -1
  84. package/dist/{chunk-2QEKSRVX.js → chunk-HEX4IMLO.js} +4 -4
  85. package/dist/{chunk-QJRKXT54.cjs → chunk-HMEREPDB.cjs} +7 -7
  86. package/dist/{chunk-QJRKXT54.cjs.map → chunk-HMEREPDB.cjs.map} +1 -1
  87. package/dist/{chunk-TTO7JXDB.cjs → chunk-HNGFRRVZ.cjs} +3 -3
  88. package/dist/{chunk-TTO7JXDB.cjs.map → chunk-HNGFRRVZ.cjs.map} +1 -1
  89. package/dist/{chunk-CJGFRPAS.cjs → chunk-I6M6CVI2.cjs} +4 -4
  90. package/dist/chunk-I6M6CVI2.cjs.map +1 -0
  91. package/dist/chunk-J76JHN7J.cjs +225 -0
  92. package/dist/chunk-J76JHN7J.cjs.map +1 -0
  93. package/dist/{chunk-YW65NAKH.cjs → chunk-JCKGAAPZ.cjs} +7 -7
  94. package/dist/{chunk-YW65NAKH.cjs.map → chunk-JCKGAAPZ.cjs.map} +1 -1
  95. package/dist/{chunk-6CPCNQKV.js → chunk-JHX6JK3M.js} +79 -75
  96. package/dist/chunk-JHX6JK3M.js.map +1 -0
  97. package/dist/{chunk-YV57RSPD.js → chunk-JNY7TUDS.js} +49 -22
  98. package/dist/chunk-JNY7TUDS.js.map +1 -0
  99. package/dist/{chunk-O3LG7B2J.cjs → chunk-JPYJQ4TF.cjs} +13 -5
  100. package/dist/chunk-JPYJQ4TF.cjs.map +1 -0
  101. package/dist/{chunk-PY2376XI.js → chunk-JT4KVXJK.js} +68 -15
  102. package/dist/chunk-JT4KVXJK.js.map +1 -0
  103. package/dist/{chunk-AOGNTG3W.cjs → chunk-KBQD4JLK.cjs} +5 -4
  104. package/dist/chunk-KBQD4JLK.cjs.map +1 -0
  105. package/dist/{chunk-P2JM22BF.cjs → chunk-KIZVY57H.cjs} +82 -78
  106. package/dist/chunk-KIZVY57H.cjs.map +1 -0
  107. package/dist/{chunk-QQIALSTX.cjs → chunk-KPMIIGHH.cjs} +27 -17
  108. package/dist/chunk-KPMIIGHH.cjs.map +1 -0
  109. package/dist/{chunk-ZXJU3TQD.cjs → chunk-KREHT4AQ.cjs} +11 -10
  110. package/dist/chunk-KREHT4AQ.cjs.map +1 -0
  111. package/dist/{chunk-S4S4LB63.js → chunk-L65MHFMD.js} +11 -3
  112. package/dist/chunk-L65MHFMD.js.map +1 -0
  113. package/dist/{chunk-OGC44JFZ.cjs → chunk-LQXFXXMJ.cjs} +8 -7
  114. package/dist/chunk-LQXFXXMJ.cjs.map +1 -0
  115. package/dist/{chunk-25PSIDPC.js → chunk-MPIVBAMY.js} +79 -21
  116. package/dist/chunk-MPIVBAMY.js.map +1 -0
  117. package/dist/{chunk-7SVDYEKM.js → chunk-MQAOXZD4.js} +28 -14
  118. package/dist/chunk-MQAOXZD4.js.map +1 -0
  119. package/dist/{chunk-6CSUUQ5M.cjs → chunk-NOQF7UQ5.cjs} +6 -6
  120. package/dist/{chunk-6CSUUQ5M.cjs.map → chunk-NOQF7UQ5.cjs.map} +1 -1
  121. package/dist/{chunk-OU7DCYIA.js → chunk-O3QM3BFE.js} +2 -2
  122. package/dist/{chunk-WKDT2XFQ.js → chunk-OOCCSMWM.js} +4 -4
  123. package/dist/chunk-P4XZH3OR.js +225 -0
  124. package/dist/chunk-P4XZH3OR.js.map +1 -0
  125. package/dist/{chunk-ZWAFL2B3.cjs → chunk-PMSENLOA.cjs} +37 -27
  126. package/dist/chunk-PMSENLOA.cjs.map +1 -0
  127. package/dist/{chunk-L5W2XC6M.js → chunk-RHFD2Z5V.js} +8 -8
  128. package/dist/chunk-RHHZRTWM.js +134 -0
  129. package/dist/chunk-RHHZRTWM.js.map +1 -0
  130. package/dist/{chunk-NZO2I5AL.cjs → chunk-RJVHR45I.cjs} +7 -7
  131. package/dist/{chunk-NZO2I5AL.cjs.map → chunk-RJVHR45I.cjs.map} +1 -1
  132. package/dist/{chunk-E6SE552P.cjs → chunk-RUDXHT76.cjs} +41 -25
  133. package/dist/chunk-RUDXHT76.cjs.map +1 -0
  134. package/dist/{chunk-SXGCRHBZ.js → chunk-SDUGYJGW.js} +24 -14
  135. package/dist/chunk-SDUGYJGW.js.map +1 -0
  136. package/dist/{chunk-VPRUHE35.js → chunk-SFFKQQ5Z.js} +4 -4
  137. package/dist/{chunk-2RXQMQYW.js → chunk-SXL4DMZ7.js} +27 -17
  138. package/dist/{chunk-2RXQMQYW.js.map → chunk-SXL4DMZ7.js.map} +1 -1
  139. package/dist/{chunk-OAPOGYA5.cjs → chunk-TC5IC6OP.cjs} +7 -4
  140. package/dist/chunk-TC5IC6OP.cjs.map +1 -0
  141. package/dist/{chunk-T2KB3DJJ.js → chunk-THCTUBX6.js} +12 -4
  142. package/dist/chunk-THCTUBX6.js.map +1 -0
  143. package/dist/{chunk-NEYLNRVG.cjs → chunk-TTLFY76J.cjs} +21 -16
  144. package/dist/chunk-TTLFY76J.cjs.map +1 -0
  145. package/dist/{chunk-ZZSPQFMX.js → chunk-U233KQZX.js} +2 -1
  146. package/dist/{chunk-ZZSPQFMX.js.map → chunk-U233KQZX.js.map} +1 -1
  147. package/dist/{chunk-65PC3YDT.cjs → chunk-V4BZWBZT.cjs} +7 -7
  148. package/dist/{chunk-65PC3YDT.cjs.map → chunk-V4BZWBZT.cjs.map} +1 -1
  149. package/dist/{chunk-FKXKBJUI.cjs → chunk-VHO6JPRR.cjs} +2 -1
  150. package/dist/chunk-VHO6JPRR.cjs.map +1 -0
  151. package/dist/{chunk-3E7TKBQI.cjs → chunk-VQGLVBPL.cjs} +24 -14
  152. package/dist/chunk-VQGLVBPL.cjs.map +1 -0
  153. package/dist/{chunk-27ZWUEPE.js → chunk-WE2SBWZ6.js} +20 -9
  154. package/dist/chunk-WE2SBWZ6.js.map +1 -0
  155. package/dist/{chunk-TQGO5WK6.js → chunk-WNDDS367.js} +7 -6
  156. package/dist/chunk-WNDDS367.js.map +1 -0
  157. package/dist/{chunk-Q5KQVBQP.cjs → chunk-X3BVQBXD.cjs} +18 -16
  158. package/dist/chunk-X3BVQBXD.cjs.map +1 -0
  159. package/dist/{chunk-J5RMLZ4P.cjs → chunk-XERBOFYZ.cjs} +80 -22
  160. package/dist/chunk-XERBOFYZ.cjs.map +1 -0
  161. package/dist/{chunk-3CXULV4G.cjs → chunk-XRVRGRC3.cjs} +2 -2
  162. package/dist/{chunk-3CXULV4G.cjs.map → chunk-XRVRGRC3.cjs.map} +1 -1
  163. package/dist/{chunk-K7T25Y3A.cjs → chunk-XZLSHEHE.cjs} +41 -27
  164. package/dist/chunk-XZLSHEHE.cjs.map +1 -0
  165. package/dist/{chunk-JRLUZDKA.js → chunk-YAKTVIVK.js} +20 -7
  166. package/dist/chunk-YAKTVIVK.js.map +1 -0
  167. package/dist/{chunk-IJ4DXG7D.cjs → chunk-YJNQLH2L.cjs} +5 -2
  168. package/dist/chunk-YJNQLH2L.cjs.map +1 -0
  169. package/dist/{chunk-ZPDETHQ7.js → chunk-YP4HUBKN.js} +3 -3
  170. package/dist/{chunk-ZPDETHQ7.js.map → chunk-YP4HUBKN.js.map} +1 -1
  171. package/dist/{chunk-5WH3JMR5.js → chunk-YXRKBKFB.js} +7 -4
  172. package/dist/chunk-YXRKBKFB.js.map +1 -0
  173. package/dist/{chunk-ACNTH2OQ.cjs → chunk-ZMRINZIO.cjs} +98 -106
  174. package/dist/chunk-ZMRINZIO.cjs.map +1 -0
  175. package/dist/color-picker/index.cjs +4 -4
  176. package/dist/color-picker/index.d.cts +8 -0
  177. package/dist/color-picker/index.d.ts +8 -0
  178. package/dist/color-picker/index.js +3 -3
  179. package/dist/combobox/index.cjs +6 -6
  180. package/dist/combobox/index.js +5 -5
  181. package/dist/command-palette/index.cjs +3 -2
  182. package/dist/command-palette/index.cjs.map +1 -1
  183. package/dist/command-palette/index.js +2 -1
  184. package/dist/context-menu/index.cjs +6 -6
  185. package/dist/context-menu/index.d.cts +1 -1
  186. package/dist/context-menu/index.d.ts +1 -1
  187. package/dist/context-menu/index.js +5 -5
  188. package/dist/conversation/index.cjs +8 -8
  189. package/dist/conversation/index.d.cts +1 -1
  190. package/dist/conversation/index.d.ts +1 -1
  191. package/dist/conversation/index.js +7 -7
  192. package/dist/data-grid/index.cjs +16 -16
  193. package/dist/data-grid/index.d.cts +14 -15
  194. package/dist/data-grid/index.d.ts +14 -15
  195. package/dist/data-grid/index.js +15 -15
  196. package/dist/date-picker/index.cjs +8 -8
  197. package/dist/date-picker/index.d.cts +12 -2
  198. package/dist/date-picker/index.d.ts +12 -2
  199. package/dist/date-picker/index.js +7 -7
  200. package/dist/drawer/index.cjs +5 -5
  201. package/dist/drawer/index.js +4 -4
  202. package/dist/dropdown/index.cjs +3 -3
  203. package/dist/dropdown/index.d.cts +34 -0
  204. package/dist/dropdown/index.d.ts +34 -0
  205. package/dist/dropdown/index.js +2 -2
  206. package/dist/file-upload/index.cjs +2 -2
  207. package/dist/file-upload/index.js +1 -1
  208. package/dist/header/index.cjs +6 -6
  209. package/dist/header/index.js +5 -5
  210. package/dist/index.cjs +42 -42
  211. package/dist/index.css +112 -40
  212. package/dist/index.d.cts +5 -5
  213. package/dist/index.d.ts +5 -5
  214. package/dist/index.js +41 -41
  215. package/dist/inline-edit/index.cjs +5 -5
  216. package/dist/inline-edit/index.js +4 -4
  217. package/dist/input/index.cjs +4 -4
  218. package/dist/input/index.d.cts +2 -2
  219. package/dist/input/index.d.ts +2 -2
  220. package/dist/input/index.js +3 -3
  221. package/dist/menu/index.cjs +5 -5
  222. package/dist/menu/index.d.cts +23 -2
  223. package/dist/menu/index.d.ts +23 -2
  224. package/dist/menu/index.js +4 -4
  225. package/dist/modal/index.cjs +5 -5
  226. package/dist/modal/index.js +4 -4
  227. package/dist/navigation/index.cjs +5 -5
  228. package/dist/navigation/index.js +4 -4
  229. package/dist/number-input/index.cjs +3 -3
  230. package/dist/number-input/index.js +2 -2
  231. package/dist/o-t-p-input/index.cjs +2 -2
  232. package/dist/o-t-p-input/index.js +1 -1
  233. package/dist/page-layout/index.cjs +12 -12
  234. package/dist/page-layout/index.d.cts +2 -2
  235. package/dist/page-layout/index.d.ts +2 -2
  236. package/dist/page-layout/index.js +11 -11
  237. package/dist/pagination/index.cjs +8 -8
  238. package/dist/pagination/index.js +7 -7
  239. package/dist/popover/index.cjs +3 -2
  240. package/dist/popover/index.cjs.map +1 -1
  241. package/dist/popover/index.d.cts +3 -1
  242. package/dist/popover/index.d.ts +3 -1
  243. package/dist/popover/index.js +2 -1
  244. package/dist/radio/index.cjs +2 -2
  245. package/dist/radio/index.js +1 -1
  246. package/dist/segmented-control/index.cjs +4 -4
  247. package/dist/segmented-control/index.js +3 -3
  248. package/dist/select/index.cjs +6 -6
  249. package/dist/select/index.d.cts +3 -3
  250. package/dist/select/index.d.ts +3 -3
  251. package/dist/select/index.js +5 -5
  252. package/dist/snackbar/index.cjs +5 -5
  253. package/dist/snackbar/index.d.cts +4 -0
  254. package/dist/snackbar/index.d.ts +4 -0
  255. package/dist/snackbar/index.js +4 -4
  256. package/dist/split-button/index.cjs +6 -6
  257. package/dist/split-button/index.js +5 -5
  258. package/dist/table/index.cjs +14 -14
  259. package/dist/table/index.d.cts +2 -2
  260. package/dist/table/index.d.ts +2 -2
  261. package/dist/table/index.js +13 -13
  262. package/dist/tabs/index.cjs +3 -3
  263. package/dist/tabs/index.js +2 -2
  264. package/dist/tag-input/index.cjs +6 -6
  265. package/dist/tag-input/index.js +5 -5
  266. package/dist/textarea/index.cjs +4 -4
  267. package/dist/textarea/index.js +3 -3
  268. package/dist/theme-editor/index.cjs +11 -11
  269. package/dist/theme-editor/index.js +10 -10
  270. package/dist/theme-provider/index.cjs +3 -3
  271. package/dist/theme-provider/index.js +2 -2
  272. package/dist/toolbar/index.cjs +8 -8
  273. package/dist/toolbar/index.d.cts +3 -3
  274. package/dist/toolbar/index.d.ts +3 -3
  275. package/dist/toolbar/index.js +7 -7
  276. package/dist/tooltip/index.cjs +3 -2
  277. package/dist/tooltip/index.cjs.map +1 -1
  278. package/dist/tooltip/index.js +2 -1
  279. package/dist/virtual-list/index.cjs +2 -2
  280. package/dist/virtual-list/index.js +1 -1
  281. package/package.json +7 -2
  282. package/dist/chunk-25PSIDPC.js.map +0 -1
  283. package/dist/chunk-27ZWUEPE.js.map +0 -1
  284. package/dist/chunk-3E7TKBQI.cjs.map +0 -1
  285. package/dist/chunk-3EPND5M2.cjs.map +0 -1
  286. package/dist/chunk-3EUTXQDB.js.map +0 -1
  287. package/dist/chunk-55J4LEKT.cjs.map +0 -1
  288. package/dist/chunk-5HUZYY54.js.map +0 -1
  289. package/dist/chunk-5WH3JMR5.js.map +0 -1
  290. package/dist/chunk-6CPCNQKV.js.map +0 -1
  291. package/dist/chunk-7SVDYEKM.js.map +0 -1
  292. package/dist/chunk-ACNTH2OQ.cjs.map +0 -1
  293. package/dist/chunk-AOGNTG3W.cjs.map +0 -1
  294. package/dist/chunk-BNVQ34FD.js +0 -125
  295. package/dist/chunk-BNVQ34FD.js.map +0 -1
  296. package/dist/chunk-CJGFRPAS.cjs.map +0 -1
  297. package/dist/chunk-CUJBNRJJ.cjs +0 -38
  298. package/dist/chunk-CUJBNRJJ.cjs.map +0 -1
  299. package/dist/chunk-E6SE552P.cjs.map +0 -1
  300. package/dist/chunk-E7FGY7BJ.js.map +0 -1
  301. package/dist/chunk-EAJHEYZM.js +0 -38
  302. package/dist/chunk-EAJHEYZM.js.map +0 -1
  303. package/dist/chunk-FKXKBJUI.cjs.map +0 -1
  304. package/dist/chunk-FXZJL2AM.cjs.map +0 -1
  305. package/dist/chunk-GG5YGESX.js.map +0 -1
  306. package/dist/chunk-GPRJYPIG.js.map +0 -1
  307. package/dist/chunk-H6CWTMAH.js.map +0 -1
  308. package/dist/chunk-HALVTKW7.js.map +0 -1
  309. package/dist/chunk-I5XR2V4A.cjs.map +0 -1
  310. package/dist/chunk-IJ4DXG7D.cjs.map +0 -1
  311. package/dist/chunk-ITXDSQT2.js.map +0 -1
  312. package/dist/chunk-J5RMLZ4P.cjs.map +0 -1
  313. package/dist/chunk-JRLUZDKA.js.map +0 -1
  314. package/dist/chunk-K7T25Y3A.cjs.map +0 -1
  315. package/dist/chunk-L5Q6UDY3.js +0 -69
  316. package/dist/chunk-L5Q6UDY3.js.map +0 -1
  317. package/dist/chunk-M7PF4FKQ.js.map +0 -1
  318. package/dist/chunk-MCWTQT3M.cjs.map +0 -1
  319. package/dist/chunk-MHZIBV2C.js.map +0 -1
  320. package/dist/chunk-NEYLNRVG.cjs.map +0 -1
  321. package/dist/chunk-O3LG7B2J.cjs.map +0 -1
  322. package/dist/chunk-OAK7HFOJ.js.map +0 -1
  323. package/dist/chunk-OAPOGYA5.cjs.map +0 -1
  324. package/dist/chunk-OGC44JFZ.cjs.map +0 -1
  325. package/dist/chunk-OJDYTCMO.cjs.map +0 -1
  326. package/dist/chunk-P2JM22BF.cjs.map +0 -1
  327. package/dist/chunk-PY2376XI.js.map +0 -1
  328. package/dist/chunk-Q5KQVBQP.cjs.map +0 -1
  329. package/dist/chunk-QQIALSTX.cjs.map +0 -1
  330. package/dist/chunk-R4M6SNUU.cjs.map +0 -1
  331. package/dist/chunk-RYOQYYDO.js.map +0 -1
  332. package/dist/chunk-S4S4LB63.js.map +0 -1
  333. package/dist/chunk-SXGCRHBZ.js.map +0 -1
  334. package/dist/chunk-T2KB3DJJ.js.map +0 -1
  335. package/dist/chunk-TEVZHN5I.cjs.map +0 -1
  336. package/dist/chunk-TQGO5WK6.js.map +0 -1
  337. package/dist/chunk-VXO2MYYH.cjs +0 -125
  338. package/dist/chunk-VXO2MYYH.cjs.map +0 -1
  339. package/dist/chunk-WWYJNWJY.cjs +0 -69
  340. package/dist/chunk-WWYJNWJY.cjs.map +0 -1
  341. package/dist/chunk-YV57RSPD.js.map +0 -1
  342. package/dist/chunk-Z5U4NJTW.cjs.map +0 -1
  343. package/dist/chunk-ZNWIHUHZ.cjs.map +0 -1
  344. package/dist/chunk-ZWAFL2B3.cjs.map +0 -1
  345. package/dist/chunk-ZXJU3TQD.cjs.map +0 -1
  346. /package/dist/{chunk-GDQWSCJQ.js.map → chunk-26SO4LZ5.js.map} +0 -0
  347. /package/dist/{chunk-KQJ3IAFT.js.map → chunk-A3LMUPG3.js.map} +0 -0
  348. /package/dist/{chunk-O2AACVSF.js.map → chunk-AR2ZOO6L.js.map} +0 -0
  349. /package/dist/{chunk-L23WWO3D.js.map → chunk-GPVGGBIR.js.map} +0 -0
  350. /package/dist/{chunk-2QEKSRVX.js.map → chunk-HEX4IMLO.js.map} +0 -0
  351. /package/dist/{chunk-OU7DCYIA.js.map → chunk-O3QM3BFE.js.map} +0 -0
  352. /package/dist/{chunk-WKDT2XFQ.js.map → chunk-OOCCSMWM.js.map} +0 -0
  353. /package/dist/{chunk-L5W2XC6M.js.map → chunk-RHFD2Z5V.js.map} +0 -0
  354. /package/dist/{chunk-VPRUHE35.js.map → chunk-SFFKQQ5Z.js.map} +0 -0
@@ -1,12 +1,12 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
- var _chunkTEVZHN5Icjs = require('./chunk-TEVZHN5I.cjs');
3
+ var _chunk7VJCGKVPcjs = require('./chunk-7VJCGKVP.cjs');
4
4
 
5
5
 
6
- var _chunkP2JM22BFcjs = require('./chunk-P2JM22BF.cjs');
6
+ var _chunkKIZVY57Hcjs = require('./chunk-KIZVY57H.cjs');
7
7
 
8
8
 
9
- var _chunkCUJBNRJJcjs = require('./chunk-CUJBNRJJ.cjs');
9
+ var _chunk35LGEPLPcjs = require('./chunk-35LGEPLP.cjs');
10
10
 
11
11
  // src/components/Combobox/Combobox.component.tsx
12
12
  var _react = require('react');
@@ -37,7 +37,6 @@ var Combobox = ({
37
37
  const uid = _react.useId.call(void 0, );
38
38
  const containerRef = _react.useRef.call(void 0, null);
39
39
  const comboboxTriggerRef = _react.useRef.call(void 0, null);
40
- const dropdownSpanRef = _react.useRef.call(void 0, null);
41
40
  const inputRef = _react.useRef.call(void 0, null);
42
41
  const optionRefs = _react.useRef.call(void 0, []);
43
42
  const isOpenRef = _react.useRef.call(void 0, false);
@@ -64,7 +63,6 @@ var Combobox = ({
64
63
  _setCommittedValue(v);
65
64
  }, []);
66
65
  const [isOpen, setIsOpen] = _react.useState.call(void 0, false);
67
- const [menuKey, setMenuKey] = _react.useState.call(void 0, 0);
68
66
  const [focusedIndex, setFocusedIndex] = _react.useState.call(void 0, -1);
69
67
  _react.useEffect.call(void 0, () => {
70
68
  if (!isControlled) return;
@@ -113,7 +111,6 @@ var Combobox = ({
113
111
  }, [filteredOptions]);
114
112
  const openDropdown = _react.useCallback.call(void 0, () => {
115
113
  if (isOpenRef.current || disabled) return;
116
- _optionalChain([dropdownSpanRef, 'access', _ => _.current, 'optionalAccess', _2 => _2.click, 'call', _3 => _3()]);
117
114
  isOpenRef.current = true;
118
115
  setIsOpen(true);
119
116
  }, [disabled]);
@@ -122,7 +119,6 @@ var Combobox = ({
122
119
  isOpenRef.current = false;
123
120
  setIsOpen(false);
124
121
  setFocusedIndex(-1);
125
- setMenuKey((prev) => prev + 1);
126
122
  if (revertInput) {
127
123
  const match = options.find((o) => o.value === committedValueRef.current);
128
124
  setInputValue(match ? match.label : allowFreeText ? committedValueRef.current : "");
@@ -134,11 +130,10 @@ var Combobox = ({
134
130
  const handleMouseDown = (e) => {
135
131
  if (!isOpenRef.current) return;
136
132
  if (e.defaultPrevented) return;
137
- if (_optionalChain([containerRef, 'access', _4 => _4.current, 'optionalAccess', _5 => _5.contains, 'call', _6 => _6(e.target)])) return;
133
+ if (_optionalChain([containerRef, 'access', _ => _.current, 'optionalAccess', _2 => _2.contains, 'call', _3 => _3(e.target)])) return;
138
134
  isOpenRef.current = false;
139
135
  setIsOpen(false);
140
136
  setFocusedIndex(-1);
141
- setMenuKey((prev) => prev + 1);
142
137
  const current = inputValueRef.current;
143
138
  const committed = committedValueRef.current;
144
139
  if (!allowFreeText) {
@@ -146,7 +141,7 @@ var Combobox = ({
146
141
  if (match) {
147
142
  if (match.value !== committed) {
148
143
  setCommittedValue(match.value);
149
- _optionalChain([onChange, 'optionalCall', _7 => _7(match.value)]);
144
+ _optionalChain([onChange, 'optionalCall', _4 => _4(match.value)]);
150
145
  setInputValue(match.label);
151
146
  }
152
147
  } else {
@@ -156,7 +151,7 @@ var Combobox = ({
156
151
  } else {
157
152
  if (current !== committed) {
158
153
  setCommittedValue(current);
159
- _optionalChain([onChange, 'optionalCall', _8 => _8(current)]);
154
+ _optionalChain([onChange, 'optionalCall', _5 => _5(current)]);
160
155
  }
161
156
  }
162
157
  };
@@ -170,26 +165,25 @@ var Combobox = ({
170
165
  (e) => {
171
166
  const query = e.target.value;
172
167
  setInputValue(query);
173
- _optionalChain([onSearch, 'optionalCall', _9 => _9(query)]);
168
+ _optionalChain([onSearch, 'optionalCall', _6 => _6(query)]);
174
169
  if (!isOpenRef.current) openDropdown();
175
170
  },
176
171
  [setInputValue, onSearch, openDropdown]
177
172
  );
178
173
  const handleBlur = _react.useCallback.call(void 0, () => {
179
174
  setTimeout(() => {
180
- if (_optionalChain([containerRef, 'access', _10 => _10.current, 'optionalAccess', _11 => _11.contains, 'call', _12 => _12(document.activeElement)])) return;
175
+ if (_optionalChain([containerRef, 'access', _7 => _7.current, 'optionalAccess', _8 => _8.contains, 'call', _9 => _9(document.activeElement)])) return;
181
176
  const current = inputValueRef.current;
182
177
  const committed = committedValueRef.current;
183
178
  isOpenRef.current = false;
184
179
  setIsOpen(false);
185
180
  setFocusedIndex(-1);
186
- setMenuKey((prev) => prev + 1);
187
181
  if (!allowFreeText) {
188
182
  const match = options.find((o) => o.label.toLowerCase() === current.toLowerCase());
189
183
  if (match) {
190
184
  if (match.value !== committed) {
191
185
  setCommittedValue(match.value);
192
- _optionalChain([onChange, 'optionalCall', _13 => _13(match.value)]);
186
+ _optionalChain([onChange, 'optionalCall', _10 => _10(match.value)]);
193
187
  setInputValue(match.label);
194
188
  } else {
195
189
  setInputValue(match.label);
@@ -201,7 +195,7 @@ var Combobox = ({
201
195
  } else {
202
196
  if (current !== committed) {
203
197
  setCommittedValue(current);
204
- _optionalChain([onChange, 'optionalCall', _14 => _14(current)]);
198
+ _optionalChain([onChange, 'optionalCall', _11 => _11(current)]);
205
199
  }
206
200
  }
207
201
  }, 0);
@@ -219,7 +213,7 @@ var Combobox = ({
219
213
  setFocusedIndex((prev) => {
220
214
  const next = prev < filteredOptions.length - 1 ? prev + 1 : 0;
221
215
  setTimeout(
222
- () => _optionalChain([optionRefs, 'access', _15 => _15.current, 'access', _16 => _16[next], 'optionalAccess', _17 => _17.scrollIntoView, 'call', _18 => _18({
216
+ () => _optionalChain([optionRefs, 'access', _12 => _12.current, 'access', _13 => _13[next], 'optionalAccess', _14 => _14.scrollIntoView, 'call', _15 => _15({
223
217
  block: "nearest",
224
218
  behavior: "smooth"
225
219
  })]),
@@ -238,7 +232,7 @@ var Combobox = ({
238
232
  setFocusedIndex((prev) => {
239
233
  const next = prev > 0 ? prev - 1 : filteredOptions.length - 1;
240
234
  setTimeout(
241
- () => _optionalChain([optionRefs, 'access', _19 => _19.current, 'access', _20 => _20[next], 'optionalAccess', _21 => _21.scrollIntoView, 'call', _22 => _22({
235
+ () => _optionalChain([optionRefs, 'access', _16 => _16.current, 'access', _17 => _17[next], 'optionalAccess', _18 => _18.scrollIntoView, 'call', _19 => _19({
242
236
  block: "nearest",
243
237
  behavior: "smooth"
244
238
  })]),
@@ -255,7 +249,7 @@ var Combobox = ({
255
249
  } else if (allowFreeText && inputValue.trim()) {
256
250
  const trimmed = inputValue.trim();
257
251
  setCommittedValue(trimmed);
258
- _optionalChain([onChange, 'optionalCall', _23 => _23(trimmed)]);
252
+ _optionalChain([onChange, 'optionalCall', _20 => _20(trimmed)]);
259
253
  closeDropdown();
260
254
  }
261
255
  break;
@@ -290,17 +284,17 @@ var Combobox = ({
290
284
  if (option.disabled) return;
291
285
  setInputValue(option.label);
292
286
  setCommittedValue(option.value);
293
- _optionalChain([onChange, 'optionalCall', _24 => _24(option.value)]);
287
+ _optionalChain([onChange, 'optionalCall', _21 => _21(option.value)]);
294
288
  closeDropdown();
295
- _optionalChain([inputRef, 'access', _25 => _25.current, 'optionalAccess', _26 => _26.focus, 'call', _27 => _27()]);
289
+ _optionalChain([inputRef, 'access', _22 => _22.current, 'optionalAccess', _23 => _23.focus, 'call', _24 => _24()]);
296
290
  },
297
291
  [onChange, closeDropdown, setInputValue, setCommittedValue]
298
292
  );
299
293
  const handleClearClick = _react.useCallback.call(void 0, () => {
300
294
  setInputValue("");
301
295
  setCommittedValue("");
302
- _optionalChain([onChange, 'optionalCall', _28 => _28("")]);
303
- _optionalChain([inputRef, 'access', _29 => _29.current, 'optionalAccess', _30 => _30.focus, 'call', _31 => _31()]);
296
+ _optionalChain([onChange, 'optionalCall', _25 => _25("")]);
297
+ _optionalChain([inputRef, 'access', _26 => _26.current, 'optionalAccess', _27 => _27.focus, 'call', _28 => _28()]);
304
298
  }, [onChange, setInputValue, setCommittedValue]);
305
299
  const handleChevronClick = _react.useCallback.call(void 0, () => {
306
300
  if (isOpenRef.current) {
@@ -370,83 +364,80 @@ var Combobox = ({
370
364
  const posIconClick = hasClearableValue ? handleClearClick : handleChevronClick;
371
365
  const containerClasses = [
372
366
  "eidos-combobox",
373
- fullWidth && _chunkCUJBNRJJcjs.fullWidthModifier.call(void 0, "eidos-combobox"),
367
+ fullWidth && _chunk35LGEPLPcjs.fullWidthModifier.call(void 0, "eidos-combobox"),
374
368
  error && "eidos-combobox--error",
375
369
  disabled && "eidos-combobox--disabled",
376
370
  className
377
371
  ].filter(Boolean).join(" ");
378
372
  const maxHeightValue = typeof maxHeight === "number" ? `${maxHeight}px` : maxHeight;
379
- return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
380
- "div",
381
- {
382
- ref: containerRef,
383
- className: containerClasses,
384
- "aria-expanded": isOpen,
385
- "aria-haspopup": "listbox",
386
- children: [
387
- /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { ref: comboboxTriggerRef, className: "eidos-combobox-trigger", children: [
388
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
389
- _chunkTEVZHN5Icjs.Input,
390
- {
391
- ref: inputRef,
392
- value: inputValue,
393
- onChange: handleChange,
394
- onFocus: handleFocus,
395
- onBlur: handleBlur,
396
- onKeyDown: handleKeyDown,
397
- placeholder,
398
- disabled,
399
- size,
400
- fullWidth: true,
401
- label,
402
- clearable: false,
403
- isSelect: false,
404
- posIcon,
405
- posIconButton: true,
406
- onPosIconClick: posIconClick,
407
- "aria-autocomplete": "list",
408
- "aria-controls": `${uid}-listbox`,
409
- "aria-activedescendant": focusedIndex >= 0 ? `${uid}-option-${focusedIndex}` : void 0
410
- }
411
- ),
412
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
413
- _chunkP2JM22BFcjs.Dropdown,
414
- {
415
- trigger: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
416
- "span",
417
- {
418
- ref: dropdownSpanRef,
419
- className: "eidos-combobox-dropdown-anchor",
420
- "aria-hidden": "true"
421
- }
422
- ),
423
- content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
424
- "div",
425
- {
426
- id: `${uid}-listbox`,
427
- className: "eidos-combobox-options",
428
- role: "listbox",
429
- "aria-label": _nullishCoalesce(label, () => ( "Options")),
430
- onMouseDown: (e) => e.preventDefault(),
431
- children: dropdownContent
432
- }
433
- ),
434
- triggerRef: comboboxTriggerRef,
435
- maxHeight: maxHeightValue,
436
- autoWidth: true,
437
- closeOnClickOutside: false,
438
- closeOnEscape: false
439
- },
440
- menuKey
441
- )
442
- ] }),
443
- hint && !error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-combobox-hint", children: hint }),
444
- error && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "eidos-combobox-error-message", children: [
445
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.CircleAlert, { className: "eidos-combobox-error-icon" }),
446
- error
447
- ] })
448
- ]
449
- }
373
+ return (
374
+ // No ARIA on this wrapper.
375
+ //
376
+ // It carried `aria-expanded` and `aria-haspopup` while having no role at
377
+ // all, which is invalid - both are only meaningful on an element whose
378
+ // role supports them. They belong on the input, which is the combobox.
379
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { ref: containerRef, className: containerClasses, children: [
380
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { ref: comboboxTriggerRef, className: "eidos-combobox-trigger", children: [
381
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
382
+ _chunk7VJCGKVPcjs.Input,
383
+ {
384
+ ref: inputRef,
385
+ value: inputValue,
386
+ onChange: handleChange,
387
+ onFocus: handleFocus,
388
+ onBlur: handleBlur,
389
+ onKeyDown: handleKeyDown,
390
+ placeholder,
391
+ disabled,
392
+ size,
393
+ fullWidth: true,
394
+ label,
395
+ clearable: false,
396
+ isSelect: false,
397
+ posIcon,
398
+ posIconButton: true,
399
+ onPosIconClick: posIconClick,
400
+ posIconLabel: hasClearableValue ? "Clear selection" : "Show options",
401
+ role: "combobox",
402
+ "aria-expanded": isOpen,
403
+ "aria-invalid": error ? true : void 0,
404
+ "aria-describedby": error ? `${uid}-error` : void 0,
405
+ "aria-autocomplete": "list",
406
+ "aria-controls": isOpen ? `${uid}-listbox` : void 0,
407
+ "aria-activedescendant": focusedIndex >= 0 ? `${uid}-option-${focusedIndex}` : void 0
408
+ }
409
+ ),
410
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
411
+ _chunkKIZVY57Hcjs.Dropdown,
412
+ {
413
+ open: isOpen,
414
+ onOpenChange: setIsOpen,
415
+ trigger: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-combobox-dropdown-anchor", "aria-hidden": "true" }),
416
+ content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
417
+ "div",
418
+ {
419
+ id: `${uid}-listbox`,
420
+ className: "eidos-combobox-options",
421
+ role: "listbox",
422
+ "aria-label": _nullishCoalesce(label, () => ( "Options")),
423
+ onMouseDown: (e) => e.preventDefault(),
424
+ children: dropdownContent
425
+ }
426
+ ),
427
+ triggerRef: comboboxTriggerRef,
428
+ maxHeight: maxHeightValue,
429
+ autoWidth: true,
430
+ closeOnClickOutside: false,
431
+ closeOnEscape: false
432
+ }
433
+ )
434
+ ] }),
435
+ hint && !error && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-combobox-hint", children: hint }),
436
+ error && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { id: `${uid}-error`, className: "eidos-combobox-error-message", children: [
437
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.CircleAlert, { className: "eidos-combobox-error-icon" }),
438
+ error
439
+ ] })
440
+ ] })
450
441
  );
451
442
  };
452
443
  Combobox.displayName = "Combobox";
@@ -454,4 +445,4 @@ Combobox.displayName = "Combobox";
454
445
 
455
446
 
456
447
  exports.Combobox = Combobox;
457
- //# sourceMappingURL=chunk-I5XR2V4A.cjs.map
448
+ //# sourceMappingURL=chunk-4AO5RKV5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-4AO5RKV5.cjs","../src/components/Combobox/Combobox.component.tsx"],"names":["label"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-4AO5RKV5.cjs","sourcesContent":[null,"import React, { useState, useCallback, useRef, useEffect, useMemo, useId } from 'react';\nimport { Check, ChevronDown, X, Loader2, CircleAlert } from 'lucide-react';\nimport { Input } from '../Input/Input.component';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport { fullWidthModifier } from '../../utils';\nimport type { ComboboxProps, ComboboxOption } from './Combobox.types';\nimport './Combobox.scss';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\ntype OptionEntry =\n | { type: 'group'; group: string; key: string }\n | { type: 'option'; option: ComboboxOption; index: number; key: string };\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport const Combobox: React.FC<ComboboxProps> = ({\n options = [],\n value,\n defaultValue,\n onChange,\n onSearch,\n placeholder = 'Search or select…',\n loading = false,\n loadingText = 'Searching…',\n emptyText = 'No results found',\n allowFreeText = false,\n clearable = true,\n disabled = false,\n size = 'md',\n label,\n error,\n hint,\n fullWidth = false,\n className = '',\n maxHeight = '300px',\n renderOption,\n}) => {\n const uid = useId();\n\n // ─── Refs ─────────────────────────────────────────────────────────────────\n\n /** Entire combobox wrapper - used for click-outside detection */\n const containerRef = useRef<HTMLDivElement>(null);\n\n /** The trigger wrapper div - passed to Dropdown as externalTriggerRef for width */\n const comboboxTriggerRef = useRef<HTMLDivElement>(null);\n\n /** The 0-height span that IS the Dropdown trigger element - programmatically clicked to open */\n\n /** Native input element */\n const inputRef = useRef<HTMLInputElement>(null);\n\n /** Focusable option divs for scroll-into-view */\n const optionRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n /**\n * Synchronous open-state flag.\n * React state updates are async; reading this ref inside event handlers\n * gives us the true current value without waiting for a re-render.\n */\n const isOpenRef = useRef(false);\n\n // ─── State ────────────────────────────────────────────────────────────────\n\n const isControlled = value !== undefined;\n\n const getInitialInputValue = (): string => {\n const seed = isControlled ? value : defaultValue;\n if (!seed) return '';\n const match = options.find((o) => o.value === seed);\n return match ? match.label : allowFreeText ? seed : '';\n };\n\n const getInitialCommittedValue = (): string => {\n return isControlled ? (value ?? '') : (defaultValue ?? '');\n };\n\n const [inputValue, _setInputValue] = useState<string>(getInitialInputValue);\n const inputValueRef = useRef<string>(inputValue);\n const setInputValue = useCallback((v: string) => {\n inputValueRef.current = v;\n _setInputValue(v);\n }, []);\n\n const [committedValue, _setCommittedValue] = useState<string>(getInitialCommittedValue);\n const committedValueRef = useRef<string>(committedValue);\n const setCommittedValue = useCallback((v: string) => {\n committedValueRef.current = v;\n _setCommittedValue(v);\n }, []);\n\n const [isOpen, setIsOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n\n // ─── Sync controlled value ────────────────────────────────────────────────\n\n useEffect(() => {\n if (!isControlled) return;\n const v = value ?? '';\n const match = options.find((o) => o.value === v);\n const label = match ? match.label : allowFreeText ? v : '';\n setInputValue(label);\n setCommittedValue(v);\n }, [value, isControlled, options, allowFreeText, setInputValue, setCommittedValue]);\n\n // ─── Derived: filtered options ────────────────────────────────────────────\n\n const filteredOptions = useMemo<ComboboxOption[]>(() => {\n const q = inputValue.toLowerCase();\n if (!q) return options;\n return options.filter((o) => o.label.toLowerCase().includes(q));\n }, [options, inputValue]);\n\n // Reset focused index when the filtered set changes\n useEffect(() => {\n setFocusedIndex(-1);\n }, [filteredOptions]);\n\n // Keep optionRefs array in sync with filteredOptions length\n useEffect(() => {\n optionRefs.current = optionRefs.current.slice(0, filteredOptions.length);\n }, [filteredOptions.length]);\n\n // ─── Derived: option entries (with group headers) ─────────────────────────\n\n const optionEntries = useMemo<OptionEntry[]>(() => {\n const entries: OptionEntry[] = [];\n const hasGroups = filteredOptions.some((o) => o.group);\n\n if (!hasGroups) {\n filteredOptions.forEach((option, index) => {\n entries.push({ type: 'option', option, index, key: option.id });\n });\n return entries;\n }\n\n // Build ordered group map while preserving insertion order\n const groupMap = new Map<string | null, ComboboxOption[]>();\n for (const option of filteredOptions) {\n const g = option.group ?? null;\n if (!groupMap.has(g)) groupMap.set(g, []);\n groupMap.get(g)!.push(option);\n }\n\n let optionIndex = 0;\n for (const [group, opts] of groupMap.entries()) {\n if (group !== null) {\n entries.push({ type: 'group', group, key: `group-${group}` });\n }\n for (const option of opts) {\n entries.push({ type: 'option', option, index: optionIndex++, key: option.id });\n }\n }\n\n return entries;\n }, [filteredOptions]);\n\n // ─── Open / Close helpers ─────────────────────────────────────────────────\n\n /**\n * Open the dropdown by programmatically clicking the 0-height span trigger.\n * The click bubbles to div.eidos-dropdown-trigger → Dropdown.handleTriggerClick → opens.\n *\n * We set isOpenRef AFTER the synthetic click so that the Dropdown's toggle\n * handler fires while isOpenRef is still false (allowing it to open).\n */\n const openDropdown = useCallback(() => {\n if (isOpenRef.current || disabled) return;\n // This used to synthesise a click on a hidden zero-height `span` so it would\n // bubble to the dropdown's trigger wrapper, because the overlay kept its\n // open state private and a click was the only way to change it.\n isOpenRef.current = true;\n setIsOpen(true);\n }, [disabled]);\n\n /**\n * Close the dropdown, optionally reverting `inputValue` to the last committed\n * value. This used to close it by remounting the whole subtree through a\n * changing `key`.\n */\n const closeDropdown = useCallback(\n (revertInput = false) => {\n isOpenRef.current = false;\n setIsOpen(false);\n setFocusedIndex(-1);\n\n if (revertInput) {\n const match = options.find((o) => o.value === committedValueRef.current);\n setInputValue(match ? match.label : allowFreeText ? committedValueRef.current : '');\n }\n },\n [options, allowFreeText, setInputValue],\n );\n\n // ─── Click-outside detection ──────────────────────────────────────────────\n\n useEffect(() => {\n const handleMouseDown = (e: MouseEvent) => {\n if (!isOpenRef.current) return;\n // defaultPrevented is set by the listbox's onMouseDown - means the user\n // clicked an option in the portal, not truly outside the combobox.\n if (e.defaultPrevented) return;\n if (containerRef.current?.contains(e.target as Node)) return;\n\n // Focus leaving to a non-focusable target: validate and close\n isOpenRef.current = false;\n setIsOpen(false);\n setFocusedIndex(-1);\n\n const current = inputValueRef.current;\n const committed = committedValueRef.current;\n\n if (!allowFreeText) {\n const match = options.find((o) => o.label.toLowerCase() === current.toLowerCase());\n if (match) {\n if (match.value !== committed) {\n setCommittedValue(match.value);\n onChange?.(match.value);\n setInputValue(match.label);\n }\n } else {\n const revertMatch = options.find((o) => o.value === committed);\n setInputValue(revertMatch ? revertMatch.label : '');\n }\n } else {\n if (current !== committed) {\n setCommittedValue(current);\n onChange?.(current);\n }\n }\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [allowFreeText, options, onChange, setCommittedValue, setInputValue]);\n\n // ─── Input handlers ───────────────────────────────────────────────────────\n\n const handleFocus = useCallback(() => {\n openDropdown();\n }, [openDropdown]);\n\n const handleChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setInputValue(query);\n onSearch?.(query);\n if (!isOpenRef.current) openDropdown();\n },\n [setInputValue, onSearch, openDropdown],\n );\n\n /**\n * On blur, validate the typed value against options.\n * A 0ms defer ensures a click on a posIcon button (X / chevron) inside the\n * Input completes its onClick before we run close logic, so we can check\n * document.activeElement reliably.\n */\n const handleBlur = useCallback(() => {\n setTimeout(() => {\n // If focus came back inside the container (e.g., posIcon button clicked),\n // don't close or validate yet.\n if (containerRef.current?.contains(document.activeElement)) return;\n\n // Read both refs *inside* the deferred callback, never captured at blur\n // time - that's the whole reason they're kept in sync by the setters.\n // Anything can run in the gap this 0ms defer opens, including the click\n // that caused the blur: a controlled consumer clearing `value` from\n // another control (e.g. DataGrid's \"Clear filters\", which resets every\n // quick filter at once) updates the refs via the sync effect, and stale\n // captured values would then resurrect the label that was just cleared.\n const current = inputValueRef.current;\n const committed = committedValueRef.current;\n\n // Close\n isOpenRef.current = false;\n setIsOpen(false);\n setFocusedIndex(-1);\n\n // Validate\n if (!allowFreeText) {\n const match = options.find((o) => o.label.toLowerCase() === current.toLowerCase());\n if (match) {\n if (match.value !== committed) {\n setCommittedValue(match.value);\n onChange?.(match.value);\n setInputValue(match.label);\n } else {\n // Normalize the display label (fix casing)\n setInputValue(match.label);\n }\n } else {\n // No match - revert to last committed value\n const revertMatch = options.find((o) => o.value === committed);\n setInputValue(revertMatch ? revertMatch.label : '');\n }\n } else {\n // allowFreeText: commit whatever the user typed\n if (current !== committed) {\n setCommittedValue(current);\n onChange?.(current);\n }\n }\n }, 0);\n }, [allowFreeText, options, onChange, setCommittedValue, setInputValue]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpenRef.current) {\n openDropdown();\n setFocusedIndex(0);\n } else {\n setFocusedIndex((prev) => {\n const next = prev < filteredOptions.length - 1 ? prev + 1 : 0;\n setTimeout(\n () =>\n optionRefs.current[next]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n }),\n 0,\n );\n return next;\n });\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpenRef.current) {\n openDropdown();\n setFocusedIndex(filteredOptions.length - 1);\n } else {\n setFocusedIndex((prev) => {\n const next = prev > 0 ? prev - 1 : filteredOptions.length - 1;\n setTimeout(\n () =>\n optionRefs.current[next]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n }),\n 0,\n );\n return next;\n });\n }\n break;\n\n case 'Enter':\n e.preventDefault();\n if (isOpenRef.current && focusedIndex >= 0 && focusedIndex < filteredOptions.length) {\n handleOptionSelect(filteredOptions[focusedIndex]);\n } else if (allowFreeText && inputValue.trim()) {\n const trimmed = inputValue.trim();\n setCommittedValue(trimmed);\n onChange?.(trimmed);\n closeDropdown();\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n if (isOpenRef.current) {\n closeDropdown(true /* revert */);\n }\n break;\n\n default:\n break;\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n disabled,\n filteredOptions,\n focusedIndex,\n allowFreeText,\n inputValue,\n onChange,\n openDropdown,\n closeDropdown,\n setCommittedValue,\n ],\n );\n\n // ─── Option selection ─────────────────────────────────────────────────────\n\n const handleOptionSelect = useCallback(\n (option: ComboboxOption) => {\n if (option.disabled) return;\n setInputValue(option.label);\n setCommittedValue(option.value);\n onChange?.(option.value);\n closeDropdown();\n // Return focus to the input so the user can continue interacting\n inputRef.current?.focus();\n },\n [onChange, closeDropdown, setInputValue, setCommittedValue],\n );\n\n // ─── Clear ────────────────────────────────────────────────────────────────\n\n const handleClearClick = useCallback(() => {\n setInputValue('');\n setCommittedValue('');\n onChange?.('');\n // Re-focus input so the user can immediately start typing again\n inputRef.current?.focus();\n }, [onChange, setInputValue, setCommittedValue]);\n\n // ─── Chevron toggle ───────────────────────────────────────────────────────\n\n const handleChevronClick = useCallback(() => {\n if (isOpenRef.current) {\n closeDropdown();\n } else {\n openDropdown();\n }\n }, [closeDropdown, openDropdown]);\n\n // ─── Render: individual option ────────────────────────────────────────────\n\n const renderOptionItem = useCallback(\n (option: ComboboxOption, index: number): React.ReactNode => {\n const isSelected = option.value === committedValue;\n const isFocused = index === focusedIndex;\n\n const classes = [\n 'eidos-combobox-option',\n isSelected && 'eidos-combobox-option--selected',\n isFocused && 'eidos-combobox-option--focused',\n option.disabled && 'eidos-combobox-option--disabled',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div\n key={option.id}\n ref={(el) => {\n optionRefs.current[index] = el;\n }}\n className={classes}\n onClick={() => handleOptionSelect(option)}\n onMouseEnter={() => !option.disabled && setFocusedIndex(index)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n id={`${uid}-option-${index}`}\n >\n {renderOption ? (\n renderOption(option)\n ) : (\n <>\n <Check\n className={`eidos-combobox-option-icon${\n !isSelected ? ' eidos-combobox-option-icon--hidden' : ''\n }`}\n />\n <span className=\"eidos-combobox-option-label\">{option.label}</span>\n {option.description && (\n <span className=\"eidos-combobox-option-description\">{option.description}</span>\n )}\n </>\n )}\n </div>\n );\n },\n [committedValue, focusedIndex, handleOptionSelect, renderOption, uid],\n );\n\n // ─── Render: dropdown content ─────────────────────────────────────────────\n\n const dropdownContent = useMemo(() => {\n if (loading) {\n return (\n <div className=\"eidos-combobox-loading\">\n <Loader2 className=\"eidos-combobox-loading-icon\" />\n <span>{loadingText}</span>\n </div>\n );\n }\n\n if (filteredOptions.length === 0) {\n return <div className=\"eidos-combobox-empty\">{emptyText}</div>;\n }\n\n return optionEntries.map((entry) => {\n if (entry.type === 'group') {\n return (\n <div key={entry.key} className=\"eidos-combobox-option-group-label\">\n {entry.group}\n </div>\n );\n }\n return renderOptionItem(entry.option, entry.index);\n });\n }, [loading, loadingText, filteredOptions.length, emptyText, optionEntries, renderOptionItem]);\n\n // ─── posIcon / posIconButton wiring ───────────────────────────────────────\n\n const hasClearableValue = clearable && !!inputValue;\n const posIcon = hasClearableValue ? X : ChevronDown;\n const posIconClick = hasClearableValue ? handleClearClick : handleChevronClick;\n\n // ─── CSS classes ──────────────────────────────────────────────────────────\n\n const containerClasses = [\n 'eidos-combobox',\n fullWidth && fullWidthModifier('eidos-combobox'),\n error && 'eidos-combobox--error',\n disabled && 'eidos-combobox--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const maxHeightValue = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n\n // ─── Render ───────────────────────────────────────────────────────────────\n\n return (\n // No ARIA on this wrapper.\n //\n // It carried `aria-expanded` and `aria-haspopup` while having no role at\n // all, which is invalid - both are only meaningful on an element whose\n // role supports them. They belong on the input, which is the combobox.\n <div ref={containerRef} className={containerClasses}>\n <div ref={comboboxTriggerRef} className=\"eidos-combobox-trigger\">\n {/*\n The Input is a direct child of eidos-combobox-trigger.\n It is NOT inside the Dropdown trigger div, so clicking it\n never bubbles to Dropdown.handleTriggerClick and never\n accidentally toggles the dropdown closed mid-edit.\n */}\n <Input\n ref={inputRef}\n value={inputValue}\n onChange={handleChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n size={size}\n fullWidth\n label={label}\n clearable={false} // we render our own clear via posIcon\n isSelect={false}\n posIcon={posIcon}\n posIconButton\n onPosIconClick={posIconClick}\n // The same button does two jobs depending on state, so the name\n // has to follow the icon - \"Clear\" on a chevron would be a lie.\n posIconLabel={hasClearableValue ? 'Clear selection' : 'Show options'}\n // The ARIA 1.2 combobox pattern: the input *is* the combobox.\n role=\"combobox\"\n aria-expanded={isOpen}\n // `Combobox` renders its own error message rather than passing\n // `error` down, so it does not inherit `Input`'s wiring and has to\n // associate the message itself (SC 3.3.1).\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? `${uid}-error` : undefined}\n aria-autocomplete=\"list\"\n // Only while the listbox exists. `aria-controls` pointing at an id\n // that is not in the document is invalid, and that is what shipped\n // - the listbox only renders once the dropdown opens.\n aria-controls={isOpen ? `${uid}-listbox` : undefined}\n aria-activedescendant={focusedIndex >= 0 ? `${uid}-option-${focusedIndex}` : undefined}\n />\n\n {/*\n The Dropdown trigger is a 0-height span placed AFTER the Input\n in the normal document flow. Its getBoundingClientRect sits at\n exactly the bottom edge of the Input, giving the Dropdown correct\n placement without any click-toggle collision with the Input above.\n closeOnClickOutside and closeOnEscape are disabled because we own\n those interactions in our mousedown listener and onKeyDown handler.\n */}\n <Dropdown\n open={isOpen}\n onOpenChange={setIsOpen}\n // Positioning comes from `triggerRef` below; this span is only here\n // because a trigger is required. It used to carry a ref so that\n // `openDropdown` could click it.\n trigger={<span className=\"eidos-combobox-dropdown-anchor\" aria-hidden=\"true\" />}\n content={\n <div\n id={`${uid}-listbox`}\n className=\"eidos-combobox-options\"\n role=\"listbox\"\n aria-label={label ?? 'Options'}\n // Prevent the input from blurring when the user clicks an option,\n // and mark this event so the click-outside handler ignores it.\n onMouseDown={(e) => e.preventDefault()}\n >\n {dropdownContent}\n </div>\n }\n triggerRef={comboboxTriggerRef as React.RefObject<HTMLElement | null>}\n maxHeight={maxHeightValue}\n autoWidth\n closeOnClickOutside={false}\n closeOnEscape={false}\n />\n </div>\n\n {hint && !error && <span className=\"eidos-combobox-hint\">{hint}</span>}\n {error && (\n <span id={`${uid}-error`} className=\"eidos-combobox-error-message\">\n <CircleAlert className=\"eidos-combobox-error-icon\" />\n {error}\n </span>\n )}\n </div>\n );\n};\n\nCombobox.displayName = 'Combobox';\n"]}
@@ -1,5 +1,10 @@
1
+ import {
2
+ useDialogFocus,
3
+ useIsClient
4
+ } from "./chunk-RHHZRTWM.js";
5
+
1
6
  // src/components/Popover/Popover.component.tsx
2
- import { useState, useRef, useCallback, useEffect, useId } from "react";
7
+ import React, { useState, useRef, useCallback, useEffect, useId } from "react";
3
8
  import { createPortal } from "react-dom";
4
9
  import { X } from "lucide-react";
5
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -13,15 +18,18 @@ var Popover = ({
13
18
  closeOnEscape = true,
14
19
  disabled = false,
15
20
  isOpen,
21
+ open: openProp,
16
22
  defaultOpen,
17
23
  onOpenChange,
18
24
  maxWidth = 320,
19
25
  className,
20
26
  contentClassName
21
27
  }) => {
22
- const isControlled = isOpen !== void 0;
28
+ const isClient = useIsClient();
29
+ const controlledOpen = openProp ?? isOpen;
30
+ const isControlled = controlledOpen !== void 0;
23
31
  const [localOpen, setLocalOpen] = useState(defaultOpen ?? false);
24
- const isVisible = isControlled ? isOpen : localOpen;
32
+ const isVisible = isControlled ? controlledOpen : localOpen;
25
33
  const [popoverState, setPopoverState] = useState({
26
34
  isVisible: false,
27
35
  isPositioned: false,
@@ -116,7 +124,7 @@ var Popover = ({
116
124
  isPositioned: true
117
125
  }));
118
126
  }
119
- }, [popoverState.isVisible, popoverState.isPositioned, calculateOptimalPosition]);
127
+ }, [popoverState.isVisible, popoverState.isPositioned, calculateOptimalPosition, isClient]);
120
128
  const handleScroll = useCallback(() => {
121
129
  if (!popoverState.isVisible || !popoverState.isPositioned || isScrollingRef.current) return;
122
130
  isScrollingRef.current = true;
@@ -150,12 +158,10 @@ var Popover = ({
150
158
  }, [popoverState.isVisible, popoverState.isPositioned, calculateOptimalPosition]);
151
159
  useEffect(() => {
152
160
  if (popoverState.isVisible) {
153
- window.addEventListener("scroll", handleScroll, { passive: true });
154
- document.body.addEventListener("scroll", handleScroll, { passive: true });
161
+ document.addEventListener("scroll", handleScroll, { capture: true, passive: true });
155
162
  }
156
163
  return () => {
157
- window.removeEventListener("scroll", handleScroll);
158
- document.body.removeEventListener("scroll", handleScroll);
164
+ document.removeEventListener("scroll", handleScroll, { capture: true });
159
165
  };
160
166
  }, [popoverState.isVisible, handleScroll]);
161
167
  const handleClickOutside = useCallback(
@@ -199,6 +205,9 @@ var Popover = ({
199
205
  }
200
206
  };
201
207
  }, []);
208
+ useDialogFocus(popoverState.isVisible && popoverState.isPositioned, contentRef, {
209
+ trapTab: false
210
+ });
202
211
  return /* @__PURE__ */ jsxs(Fragment, { children: [
203
212
  /* @__PURE__ */ jsx(
204
213
  "div",
@@ -206,12 +215,13 @@ var Popover = ({
206
215
  ref: triggerRef,
207
216
  className: ["eidos-popover-trigger", className].filter(Boolean).join(" "),
208
217
  onClick: toggle,
209
- "aria-expanded": popoverState.isVisible,
210
- "aria-haspopup": "dialog",
211
- children: trigger
218
+ children: React.isValidElement(trigger) ? React.cloneElement(trigger, {
219
+ "aria-expanded": popoverState.isVisible,
220
+ "aria-haspopup": "dialog"
221
+ }) : trigger
212
222
  }
213
223
  ),
214
- popoverState.isVisible && createPortal(
224
+ isClient && popoverState.isVisible && createPortal(
215
225
  /* @__PURE__ */ jsxs(
216
226
  "div",
217
227
  {
@@ -258,4 +268,4 @@ Popover.displayName = "Popover";
258
268
  export {
259
269
  Popover
260
270
  };
261
- //# sourceMappingURL=chunk-5HUZYY54.js.map
271
+ //# sourceMappingURL=chunk-4J25XZDI.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, useIsClient } 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 open: openProp,\n defaultOpen,\n onOpenChange,\n maxWidth = 320,\n className,\n contentClassName,\n}) => {\n // `isOpen`/`defaultOpen` make the portal reachable on the first render,\n // which cannot happen on a server - see `useIsClient`.\n const isClient = useIsClient();\n\n // ── Controlled / uncontrolled bridge ──────────────────────────────────────\n //\n // `open` is the canonical name, matching `Dropdown` and `CommandPalette`.\n // `isOpen` is the original spelling, kept working rather than renamed out\n // from under anyone.\n const controlledOpen = openProp ?? isOpen;\n const isControlled = controlledOpen !== undefined;\n const [localOpen, setLocalOpen] = useState(defaultOpen ?? false);\n const isVisible = isControlled ? controlledOpen! : 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 // `isClient` for the same reason as `Dropdown`: with `defaultOpen` the\n // portal arrives one render after this effect first runs, and without it in\n // the deps the panel is never measured and never becomes visible.\n }, [popoverState.isVisible, popoverState.isPositioned, calculateOptimalPosition, isClient]);\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 // Capture phase on `document` - see the note in `Dropdown`. `scroll` does\n // not bubble, so listeners on `window`/`document.body` miss every\n // ancestor scroll container and the portaled panel detaches from its\n // trigger.\n document.addEventListener('scroll', handleScroll, { capture: true, passive: true });\n }\n\n return () => {\n document.removeEventListener('scroll', handleScroll, { capture: true });\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 {isClient &&\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":";;;;;;AAAA,OAAO,SAAS,UAAU,QAAQ,aAAa,WAAW,aAAa;AACvE,SAAS,oBAAoB;AAC7B,SAAS,SAAS;AA8Sd,mBAeE,KAwCQ,YAvDV;AA1SG,IAAM,UAAkC,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW,qBAAqB;AAAA,EAChC,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX;AAAA,EACA,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,MAAM;AAGJ,QAAM,WAAW,YAAY;AAO7B,QAAM,iBAAiB,YAAY;AACnC,QAAM,eAAe,mBAAmB;AACxC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,eAAe,KAAK;AAC/D,QAAM,YAAY,eAAe,iBAAkB;AAGnD,QAAM,CAAC,cAAc,eAAe,IAAI,SAAuB;AAAA,IAC7D,WAAW;AAAA,IACX,cAAc;AAAA,IACd,UAAU,EAAE,KAAK,GAAG,MAAM,GAAG,WAAW,mBAAmB;AAAA,EAC7D,CAAC;AAQD,QAAM,UAAU,MAAM;AAGtB,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,aAAa,OAAuB,IAAI;AAC9C,QAAM,aAAa,OAAkD,MAAS;AAC9E,QAAM,oBAAoB,OAA2B,MAAS;AAC9D,QAAM,iBAAiB,OAAO,KAAK;AAGnC,QAAM,OAAO,YAAY,MAAM;AAC7B,QAAI,SAAU;AACd,QAAI,CAAC,aAAc,cAAa,IAAI;AACpC,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAC,UAAU,cAAc,YAAY,CAAC;AAEzC,QAAM,QAAQ,YAAY,MAAM;AAC9B,QAAI,CAAC,aAAc,cAAa,KAAK;AACrC,mBAAe,KAAK;AAAA,EACtB,GAAG,CAAC,cAAc,YAAY,CAAC;AAE/B,QAAM,SAAS,YAAY,MAAM;AAC/B,QAAI,WAAW;AACb,YAAM;AAAA,IACR,OAAO;AACL,WAAK;AAAA,IACP;AAAA,EACF,GAAG,CAAC,WAAW,MAAM,KAAK,CAAC;AAG3B,QAAM,2BAA2B;AAAA,IAC/B,CAAC,aAAsB,gBAAyB;AAC9C,YAAM,gBAAgB,OAAO;AAC7B,YAAM,iBAAiB,OAAO;AAC9B,YAAM,MAAM;AAEZ,UAAI,YAA8B;AAClC,UAAI,MAAM;AACV,UAAI,OAAO;AAEX,cAAQ,oBAAoB;AAAA,QAC1B,KAAK;AACH,gBAAM,YAAY,MAAM,YAAY,SAAS;AAC7C,iBAAO,YAAY,OAAO,YAAY,QAAQ,IAAI,YAAY,QAAQ;AACtE;AAAA,QACF,KAAK;AACH,gBAAM,YAAY,SAAS;AAC3B,iBAAO,YAAY,OAAO,YAAY,QAAQ,IAAI,YAAY,QAAQ;AACtE;AAAA,QACF,KAAK;AACH,gBAAM,YAAY,MAAM,YAAY,SAAS,IAAI,YAAY,SAAS;AACtE,iBAAO,YAAY,OAAO,YAAY,QAAQ;AAC9C;AAAA,QACF,KAAK;AACH,gBAAM,YAAY,MAAM,YAAY,SAAS,IAAI,YAAY,SAAS;AACtE,iBAAO,YAAY,QAAQ;AAC3B;AAAA,MACJ;AAGA,UAAI,cAAc,SAAS,MAAM,KAAK;AACpC,oBAAY;AACZ,cAAM,YAAY,SAAS;AAC3B,eAAO,YAAY,OAAO,YAAY,QAAQ,IAAI,YAAY,QAAQ;AAAA,MACxE,WAAW,cAAc,YAAY,MAAM,YAAY,SAAS,iBAAiB,KAAK;AACpF,oBAAY;AACZ,cAAM,YAAY,MAAM,YAAY,SAAS;AAC7C,eAAO,YAAY,OAAO,YAAY,QAAQ,IAAI,YAAY,QAAQ;AAAA,MACxE,WAAW,cAAc,UAAU,OAAO,KAAK;AAC7C,oBAAY;AACZ,cAAM,YAAY,MAAM,YAAY,SAAS,IAAI,YAAY,SAAS;AACtE,eAAO,YAAY,QAAQ;AAAA,MAC7B,WAAW,cAAc,WAAW,OAAO,YAAY,QAAQ,gBAAgB,KAAK;AAClF,oBAAY;AACZ,cAAM,YAAY,MAAM,YAAY,SAAS,IAAI,YAAY,SAAS;AACtE,eAAO,YAAY,OAAO,YAAY,QAAQ;AAAA,MAChD;AAGA,YAAM,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,iBAAiB,YAAY,SAAS,GAAG,CAAC;AAC5E,aAAO,KAAK,IAAI,KAAK,KAAK,IAAI,MAAM,gBAAgB,YAAY,QAAQ,GAAG,CAAC;AAE5E,aAAO,EAAE,KAAK,MAAM,UAAU;AAAA,IAChC;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAGA,YAAU,MAAM;AACd,QAAI,WAAW;AACb,sBAAgB,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,MAAM,cAAc,MAAM,EAAE;AAAA,IAC/E,OAAO;AACL,sBAAgB,CAAC,UAAU,EAAE,GAAG,MAAM,WAAW,OAAO,cAAc,MAAM,EAAE;AAAA,IAChF;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAGd,YAAU,MAAM;AACd,QACE,aAAa,aACb,CAAC,aAAa,gBACd,WAAW,WACX,WAAW,SACX;AACA,YAAM,cAAc,WAAW,QAAQ,sBAAsB;AAC7D,YAAM,cAAc,WAAW,QAAQ,sBAAsB;AAE7D,YAAM,EAAE,KAAK,MAAM,UAAU,IAAI,yBAAyB,aAAa,WAAW;AAElF,sBAAgB,CAAC,UAAU;AAAA,QACzB,GAAG;AAAA,QACH,UAAU,EAAE,KAAK,MAAM,UAAU;AAAA,QACjC,cAAc;AAAA,MAChB,EAAE;AAAA,IACJ;AAAA,EAIF,GAAG,CAAC,aAAa,WAAW,aAAa,cAAc,0BAA0B,QAAQ,CAAC;AAG1F,QAAM,eAAe,YAAY,MAAM;AACrC,QAAI,CAAC,aAAa,aAAa,CAAC,aAAa,gBAAgB,eAAe,QAAS;AAErF,mBAAe,UAAU;AAEzB,sBAAkB,UAAU,sBAAsB,MAAM;AACtD,UAAI,WAAW,WAAW,WAAW,SAAS;AAC5C,cAAM,cAAc,WAAW,QAAQ,sBAAsB;AAC7D,cAAM,cAAc,WAAW,QAAQ,sBAAsB;AAE7D,cAAM,EAAE,KAAK,MAAM,UAAU,IAAI,yBAAyB,aAAa,WAAW;AAElF,wBAAgB,CAAC,UAAU;AAAA,UACzB,GAAG;AAAA,UACH,UAAU,EAAE,KAAK,MAAM,UAAU;AAAA,QACnC,EAAE;AAAA,MACJ;AAEA,qBAAe,UAAU;AAAA,IAC3B,CAAC;AAAA,EACH,GAAG,CAAC,aAAa,WAAW,aAAa,cAAc,wBAAwB,CAAC;AAGhF,YAAU,MAAM;AACd,UAAM,eAAe,MAAM;AACzB,UACE,aAAa,aACb,aAAa,gBACb,WAAW,WACX,WAAW,SACX;AACA,cAAM,cAAc,WAAW,QAAQ,sBAAsB;AAC7D,cAAM,cAAc,WAAW,QAAQ,sBAAsB;AAE7D,cAAM,EAAE,KAAK,MAAM,UAAU,IAAI,yBAAyB,aAAa,WAAW;AAElF,wBAAgB,CAAC,UAAU;AAAA,UACzB,GAAG;AAAA,UACH,UAAU,EAAE,KAAK,MAAM,UAAU;AAAA,QACnC,EAAE;AAAA,MACJ;AAAA,IACF;AAEA,WAAO,iBAAiB,UAAU,YAAY;AAC9C,WAAO,MAAM,OAAO,oBAAoB,UAAU,YAAY;AAAA,EAChE,GAAG,CAAC,aAAa,WAAW,aAAa,cAAc,wBAAwB,CAAC;AAGhF,YAAU,MAAM;AACd,QAAI,aAAa,WAAW;AAK1B,eAAS,iBAAiB,UAAU,cAAc,EAAE,SAAS,MAAM,SAAS,KAAK,CAAC;AAAA,IACpF;AAEA,WAAO,MAAM;AACX,eAAS,oBAAoB,UAAU,cAAc,EAAE,SAAS,KAAK,CAAC;AAAA,IACxE;AAAA,EACF,GAAG,CAAC,aAAa,WAAW,YAAY,CAAC;AAGzC,QAAM,qBAAqB;AAAA,IACzB,CAAC,UAAsB;AACrB,UAAI,CAAC,uBAAuB,CAAC,aAAa,UAAW;AAErD,YAAM,SAAS,MAAM;AAErB,UAAI,WAAW,SAAS,SAAS,MAAM,KAAK,WAAW,SAAS,SAAS,MAAM,GAAG;AAChF;AAAA,MACF;AAEA,YAAM;AAAA,IACR;AAAA,IACA,CAAC,qBAAqB,aAAa,WAAW,KAAK;AAAA,EACrD;AAGA,QAAM,kBAAkB;AAAA,IACtB,CAAC,UAAyB;AACxB,UAAI,iBAAiB,MAAM,QAAQ,YAAY,aAAa,WAAW;AACrE,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,eAAe,aAAa,WAAW,KAAK;AAAA,EAC/C;AAGA,YAAU,MAAM;AACd,QAAI,aAAa,WAAW;AAC1B,eAAS,iBAAiB,aAAa,kBAAkB;AACzD,eAAS,iBAAiB,WAAW,eAAe;AAAA,IACtD;AAEA,WAAO,MAAM;AACX,eAAS,oBAAoB,aAAa,kBAAkB;AAC5D,eAAS,oBAAoB,WAAW,eAAe;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,aAAa,WAAW,oBAAoB,eAAe,CAAC;AAGhE,YAAU,MAAM;AACd,UAAM,YAAY,WAAW;AAC7B,UAAM,mBAAmB,kBAAkB;AAC3C,WAAO,MAAM;AACX,UAAI,WAAW;AACb,qBAAa,SAAS;AAAA,MACxB;AACA,UAAI,kBAAkB;AACpB,6BAAqB,gBAAgB;AAAA,MACvC;AAAA,IACF;AAAA,EACF,GAAG,CAAC,CAAC;AAcL,iBAAe,aAAa,aAAa,aAAa,cAAc,YAAY;AAAA,IAC9E,SAAS;AAAA,EACX,CAAC;AAGD,SACE,iCAeE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,KAAK;AAAA,QACL,WAAW,CAAC,yBAAyB,SAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,QACxE,SAAS;AAAA,QAER,gBAAM,eAAe,OAAO,IACzB,MAAM,aAAa,SAAwD;AAAA,UACzE,iBAAiB,aAAa;AAAA,UAC9B,iBAAiB;AAAA,QACnB,CAAC,IACD;AAAA;AAAA,IACN;AAAA,IAGC,YACC,aAAa,aACb;AAAA,MACE;AAAA,QAAC;AAAA;AAAA,UACC,KAAK;AAAA,UACL,MAAK;AAAA,UACL,cAAW;AAAA,UACX,mBAAiB,QAAQ,UAAU;AAAA,UAGnC,cAAY,QAAQ,SAAY;AAAA,UAChC,WAAW;AAAA,YACT;AAAA,YACA,0BAA0B,aAAa,SAAS,SAAS;AAAA,YACzD,aAAa,eAAe,mCAAmC;AAAA,YAC/D;AAAA,UACF,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,UACX,OAAO;AAAA,YACL,KAAK,aAAa,SAAS;AAAA,YAC3B,MAAM,aAAa,SAAS;AAAA,YAC5B;AAAA,UACF;AAAA,UAEE;AAAA,sBAAS,oBACT,qBAAC,SAAI,WAAU,wBACZ;AAAA,uBACC,oBAAC,UAAK,IAAI,SAAS,WAAU,uBAC1B,iBACH;AAAA,cAED,mBACC;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,SAAS;AAAA,kBACT,cAAW;AAAA,kBAEX,8BAAC,KAAE,eAAY,QAAO;AAAA;AAAA,cACxB;AAAA,eAEJ;AAAA,YAEF,oBAAC,SAAI,WAAU,sBAAsB,UAAS;AAAA;AAAA;AAAA,MAChD;AAAA,MACA,SAAS;AAAA,IACX;AAAA,KACJ;AAEJ;AAEA,QAAQ,cAAc;","names":[]}
@@ -1,9 +1,11 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkWWYJNWJYcjs = require('./chunk-WWYJNWJY.cjs');
3
+ var _chunkDA375AI6cjs = require('./chunk-DA375AI6.cjs');
4
4
 
5
5
 
6
- var _chunkCUJBNRJJcjs = require('./chunk-CUJBNRJJ.cjs');
6
+
7
+
8
+ var _chunk35LGEPLPcjs = require('./chunk-35LGEPLP.cjs');
7
9
 
8
10
  // src/components/Modal/Modal.component.tsx
9
11
  var _react = require('react');
@@ -24,6 +26,8 @@ var Modal = ({
24
26
  }) => {
25
27
  const titleId = _react.useId.call(void 0, );
26
28
  const bodyId = _react.useId.call(void 0, );
29
+ const dialogRef = _react.useRef.call(void 0, null);
30
+ const isClient = _chunk35LGEPLPcjs.useIsClient.call(void 0, );
27
31
  const TRANSITION_MS = 200;
28
32
  const [isMounted, setIsMounted] = _react.useState.call(void 0, isOpen);
29
33
  const [isVisible, setIsVisible] = _react.useState.call(void 0, isOpen);
@@ -72,12 +76,14 @@ var Modal = ({
72
76
  document.body.style.overflow = "";
73
77
  };
74
78
  }, [isOpen, handleEscapeKey]);
75
- if (!isMounted) return null;
79
+ _chunk35LGEPLPcjs.useDialogFocus.call(void 0, isClient && isOpen && isVisible, dialogRef);
80
+ if (!isClient || !isMounted) return null;
76
81
  const modalContent = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: `eidos-modal ${isVisible ? "eidos-modal--is-open" : ""} ${className}`, children: [
77
82
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-modal-backdrop", onClick: handleBackdropClick, "aria-hidden": "true" }),
78
83
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
79
84
  "div",
80
85
  {
86
+ ref: dialogRef,
81
87
  role: "dialog",
82
88
  "aria-modal": "true",
83
89
  "aria-labelledby": title ? titleId : void 0,
@@ -85,13 +91,13 @@ var Modal = ({
85
91
  className: `eidos-modal-content eidos-modal-content--${size}`,
86
92
  children: [
87
93
  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"),
94
+ icon && _chunk35LGEPLPcjs.renderIcon.call(void 0, icon, "eidos-modal-icon"),
89
95
  " ",
90
96
  title
91
97
  ] }) }),
92
98
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { id: bodyId, className: "eidos-modal-body", children }),
93
99
  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,
100
+ _chunkDA375AI6cjs.Button,
95
101
  {
96
102
  variant: action.variant || "outlined",
97
103
  size: action.size || "md",
@@ -114,4 +120,4 @@ Modal.displayName = "Modal";
114
120
 
115
121
 
116
122
  exports.Modal = Modal;
117
- //# sourceMappingURL=chunk-FXZJL2AM.cjs.map
123
+ //# sourceMappingURL=chunk-4JSTBA4F.cjs.map