eidos-ui 3.6.3 → 3.8.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 (408) hide show
  1. package/README.md +11 -0
  2. package/dist/{Avatar.types-BY-C09Ke.d.cts → Avatar.types-DkRznn-7.d.cts} +6 -1
  3. package/dist/{Avatar.types-BY-C09Ke.d.ts → Avatar.types-DkRznn-7.d.ts} +6 -1
  4. package/dist/{Breadcrumb.types-DaykU-C8.d.cts → Breadcrumb.types-C3uADbKU.d.cts} +4 -1
  5. package/dist/{Breadcrumb.types-DaykU-C8.d.ts → Breadcrumb.types-C3uADbKU.d.ts} +4 -1
  6. package/dist/Button.types-BCIK8Qlk.d.ts +59 -0
  7. package/dist/Button.types-DkgWjFsk.d.cts +59 -0
  8. package/dist/Chip.types-BM-UZOCv.d.ts +33 -0
  9. package/dist/Chip.types-_1bhyKz4.d.cts +33 -0
  10. package/dist/{Header.types-Ce5Cj301.d.cts → Header.types-a6p0-ZHx.d.cts} +24 -8
  11. package/dist/{Header.types-0XovUp0T.d.ts → Header.types-zbhURbg7.d.ts} +24 -8
  12. package/dist/{Input.types-D7-sWq-q.d.cts → Input.types--K0t_3L2.d.cts} +1 -1
  13. package/dist/{Input.types-CSDMaZNe.d.ts → Input.types--UjucBDd.d.ts} +1 -1
  14. package/dist/{Menu.types-CTnUijv5.d.cts → Menu.types-D6VoK9T9.d.cts} +1 -1
  15. package/dist/{Menu.types-BN4g1-3A.d.ts → Menu.types-tUEhXn52.d.ts} +1 -1
  16. package/dist/{Navigation.types-By5HfPTi.d.ts → Navigation.types-CJRzo9Zo.d.ts} +1 -1
  17. package/dist/{Navigation.types-_MrYqqUI.d.cts → Navigation.types-D95oHZEJ.d.cts} +1 -1
  18. package/dist/{SegmentedControl.types-cjLwwBAm.d.ts → SegmentedControl.types-CHtjABQM.d.ts} +1 -1
  19. package/dist/{SegmentedControl.types-BofrEYyd.d.cts → SegmentedControl.types-D_gHYL9X.d.cts} +1 -1
  20. package/dist/{Select.types-ok-03rLo.d.cts → Select.types-8CGZBgT-.d.cts} +2 -2
  21. package/dist/{Select.types-C2tGy1vj.d.ts → Select.types-CAVh9Gvd.d.ts} +2 -2
  22. package/dist/{Table.types-D8pmgxKA.d.ts → Table.types-BFDE-hhF.d.ts} +2 -2
  23. package/dist/{Table.types-D-9tC0kJ.d.cts → Table.types-Tai7_MTz.d.cts} +2 -2
  24. package/dist/{Toolbar.types-CKnQC_TW.d.ts → Toolbar.types-BqBrPVww.d.ts} +8 -6
  25. package/dist/{Toolbar.types-DUz2mxct.d.cts → Toolbar.types-GCUgzuKW.d.cts} +8 -6
  26. package/dist/alert/index.cjs +8 -5
  27. package/dist/alert/index.cjs.map +1 -1
  28. package/dist/alert/index.d.cts +1 -1
  29. package/dist/alert/index.d.ts +1 -1
  30. package/dist/alert/index.js +7 -4
  31. package/dist/avatar/index.d.cts +2 -2
  32. package/dist/avatar/index.d.ts +2 -2
  33. package/dist/breadcrumb/index.cjs +4 -2
  34. package/dist/breadcrumb/index.cjs.map +1 -1
  35. package/dist/breadcrumb/index.d.cts +2 -2
  36. package/dist/breadcrumb/index.d.ts +2 -2
  37. package/dist/breadcrumb/index.js +3 -1
  38. package/dist/button/index.cjs +7 -4
  39. package/dist/button/index.cjs.map +1 -1
  40. package/dist/button/index.d.cts +5 -5
  41. package/dist/button/index.d.ts +5 -5
  42. package/dist/button/index.js +6 -3
  43. package/dist/button-group/index.d.cts +2 -2
  44. package/dist/button-group/index.d.ts +2 -2
  45. package/dist/chip/index.cjs +7 -4
  46. package/dist/chip/index.cjs.map +1 -1
  47. package/dist/chip/index.d.cts +5 -23
  48. package/dist/chip/index.d.ts +5 -23
  49. package/dist/chip/index.js +6 -3
  50. package/dist/{chunk-DRXPTACG.js → chunk-26PRBZA6.js} +6 -2
  51. package/dist/chunk-26PRBZA6.js.map +1 -0
  52. package/dist/chunk-2IXCEKLI.js +82 -0
  53. package/dist/chunk-2IXCEKLI.js.map +1 -0
  54. package/dist/{chunk-GWHZFX2H.js → chunk-2TIMJD4K.js} +29 -6
  55. package/dist/chunk-2TIMJD4K.js.map +1 -0
  56. package/dist/{chunk-RHFD2Z5V.js → chunk-3TF2GZSG.js} +7 -7
  57. package/dist/{chunk-TC5IC6OP.cjs → chunk-3VXUOAIJ.cjs} +3 -3
  58. package/dist/{chunk-TC5IC6OP.cjs.map → chunk-3VXUOAIJ.cjs.map} +1 -1
  59. package/dist/{chunk-JHX6JK3M.js → chunk-3X6QVHTD.js} +2 -2
  60. package/dist/{chunk-7VJCGKVP.cjs → chunk-4HZIXRAJ.cjs} +11 -11
  61. package/dist/{chunk-7VJCGKVP.cjs.map → chunk-4HZIXRAJ.cjs.map} +1 -1
  62. package/dist/{chunk-MQAOXZD4.js → chunk-4S57PE43.js} +4 -4
  63. package/dist/{chunk-JT4KVXJK.js → chunk-4V2XYUQL.js} +2 -2
  64. package/dist/{chunk-PMSENLOA.cjs → chunk-544RAXWO.cjs} +19 -19
  65. package/dist/{chunk-PMSENLOA.cjs.map → chunk-544RAXWO.cjs.map} +1 -1
  66. package/dist/{chunk-4JSTBA4F.cjs → chunk-6CW5QSYV.cjs} +7 -7
  67. package/dist/{chunk-4JSTBA4F.cjs.map → chunk-6CW5QSYV.cjs.map} +1 -1
  68. package/dist/{chunk-AR2ZOO6L.js → chunk-6FXFKMJ5.js} +3 -3
  69. package/dist/{chunk-KREHT4AQ.cjs → chunk-6IB27I5K.cjs} +8 -8
  70. package/dist/{chunk-KREHT4AQ.cjs.map → chunk-6IB27I5K.cjs.map} +1 -1
  71. package/dist/{chunk-LGDODZHI.js → chunk-6LTZV6HN.js} +4 -4
  72. package/dist/{chunk-YP4HUBKN.js → chunk-6NAOAKII.js} +2 -2
  73. package/dist/chunk-75Q5OS7L.cjs +10 -0
  74. package/dist/chunk-75Q5OS7L.cjs.map +1 -0
  75. package/dist/{chunk-LQXFXXMJ.cjs → chunk-7FV2X62W.cjs} +7 -7
  76. package/dist/{chunk-LQXFXXMJ.cjs.map → chunk-7FV2X62W.cjs.map} +1 -1
  77. package/dist/{chunk-2T7ZMMH5.cjs → chunk-7NUVLVSL.cjs} +5 -5
  78. package/dist/{chunk-2T7ZMMH5.cjs.map → chunk-7NUVLVSL.cjs.map} +1 -1
  79. package/dist/chunk-ACH7SYQ2.js +47 -0
  80. package/dist/chunk-ACH7SYQ2.js.map +1 -0
  81. package/dist/{chunk-HNGFRRVZ.cjs → chunk-AUNDBUHM.cjs} +3 -3
  82. package/dist/{chunk-HNGFRRVZ.cjs.map → chunk-AUNDBUHM.cjs.map} +1 -1
  83. package/dist/{chunk-XZLSHEHE.cjs → chunk-B2OHBIAL.cjs} +10 -10
  84. package/dist/{chunk-XZLSHEHE.cjs.map → chunk-B2OHBIAL.cjs.map} +1 -1
  85. package/dist/chunk-BDH2MXJW.js +46 -0
  86. package/dist/chunk-BDH2MXJW.js.map +1 -0
  87. package/dist/{chunk-D7SQ7LHJ.js → chunk-BO3KK3ZQ.js} +2 -2
  88. package/dist/{chunk-NOQF7UQ5.cjs → chunk-CFVUUMQA.cjs} +6 -6
  89. package/dist/{chunk-NOQF7UQ5.cjs.map → chunk-CFVUUMQA.cjs.map} +1 -1
  90. package/dist/chunk-CJT7L764.cjs +21 -0
  91. package/dist/chunk-CJT7L764.cjs.map +1 -0
  92. package/dist/{chunk-5XH2PHT2.js → chunk-CNTG7OOO.js} +14 -14
  93. package/dist/{chunk-I6M6CVI2.cjs → chunk-DG3O5NV4.cjs} +3 -3
  94. package/dist/{chunk-I6M6CVI2.cjs.map → chunk-DG3O5NV4.cjs.map} +1 -1
  95. package/dist/{chunk-WNDDS367.js → chunk-DPTTDHZ5.js} +3 -3
  96. package/dist/{chunk-35LGEPLP.cjs → chunk-ENMDOQQO.cjs} +29 -14
  97. package/dist/chunk-ENMDOQQO.cjs.map +1 -0
  98. package/dist/{chunk-V4BZWBZT.cjs → chunk-F5IRMMZ2.cjs} +7 -7
  99. package/dist/{chunk-V4BZWBZT.cjs.map → chunk-F5IRMMZ2.cjs.map} +1 -1
  100. package/dist/{chunk-WE2SBWZ6.js → chunk-FE7S4RSK.js} +10 -10
  101. package/dist/chunk-FE7S4RSK.js.map +1 -0
  102. package/dist/{chunk-BFKPJ627.js → chunk-FHOD3FUN.js} +4 -4
  103. package/dist/{chunk-SNRRF64M.js → chunk-GDRLVX2A.js} +31 -10
  104. package/dist/chunk-GDRLVX2A.js.map +1 -0
  105. package/dist/{chunk-5O73AALP.cjs → chunk-GP6EEZH5.cjs} +7 -3
  106. package/dist/chunk-GP6EEZH5.cjs.map +1 -0
  107. package/dist/{chunk-SDUGYJGW.js → chunk-H3C6YECZ.js} +6 -6
  108. package/dist/{chunk-RJVHR45I.cjs → chunk-H46ZLPNJ.cjs} +7 -7
  109. package/dist/{chunk-RJVHR45I.cjs.map → chunk-H46ZLPNJ.cjs.map} +1 -1
  110. package/dist/{chunk-66UQTF57.cjs → chunk-HLI4SOH3.cjs} +45 -45
  111. package/dist/{chunk-66UQTF57.cjs.map → chunk-HLI4SOH3.cjs.map} +1 -1
  112. package/dist/{chunk-ZMRINZIO.cjs → chunk-HR5MWA3B.cjs} +5 -5
  113. package/dist/{chunk-ZMRINZIO.cjs.map → chunk-HR5MWA3B.cjs.map} +1 -1
  114. package/dist/{chunk-MPIVBAMY.js → chunk-HYRLK462.js} +2 -2
  115. package/dist/{chunk-FIVMMCGM.js → chunk-IHPSRTVW.js} +4 -4
  116. package/dist/{chunk-THCTUBX6.js → chunk-IKXXXVUO.js} +3 -3
  117. package/dist/{chunk-JPYJQ4TF.cjs → chunk-JFV56ISS.cjs} +6 -6
  118. package/dist/{chunk-JPYJQ4TF.cjs.map → chunk-JFV56ISS.cjs.map} +1 -1
  119. package/dist/{chunk-75GFIQRU.js → chunk-JY77VJAZ.js} +30 -15
  120. package/dist/chunk-JY77VJAZ.js.map +1 -0
  121. package/dist/chunk-KXDGW6LJ.cjs +46 -0
  122. package/dist/chunk-KXDGW6LJ.cjs.map +1 -0
  123. package/dist/{chunk-24HKKSKX.js → chunk-L6ERHCQ2.js} +3 -3
  124. package/dist/{chunk-4LNTZPSQ.js → chunk-L6YJ6QTZ.js} +2 -2
  125. package/dist/{chunk-KBQD4JLK.cjs → chunk-LUDK44NZ.cjs} +3 -3
  126. package/dist/{chunk-KBQD4JLK.cjs.map → chunk-LUDK44NZ.cjs.map} +1 -1
  127. package/dist/chunk-LWCFT5SP.cjs +82 -0
  128. package/dist/chunk-LWCFT5SP.cjs.map +1 -0
  129. package/dist/{chunk-JNY7TUDS.js → chunk-MCPGI6EI.js} +2 -2
  130. package/dist/{chunk-DU5JKTHK.cjs → chunk-MKC6V3SY.cjs} +6 -6
  131. package/dist/{chunk-DU5JKTHK.cjs.map → chunk-MKC6V3SY.cjs.map} +1 -1
  132. package/dist/{chunk-J76JHN7J.cjs → chunk-N5NXKVFJ.cjs} +10 -10
  133. package/dist/{chunk-J76JHN7J.cjs.map → chunk-N5NXKVFJ.cjs.map} +1 -1
  134. package/dist/{chunk-XERBOFYZ.cjs → chunk-NERASTO2.cjs} +3 -3
  135. package/dist/{chunk-XERBOFYZ.cjs.map → chunk-NERASTO2.cjs.map} +1 -1
  136. package/dist/{chunk-3KBBJZHK.cjs → chunk-NFD7MPX4.cjs} +16 -14
  137. package/dist/chunk-NFD7MPX4.cjs.map +1 -0
  138. package/dist/{chunk-3ZRFOKDM.cjs → chunk-NNAEQR3Y.cjs} +30 -30
  139. package/dist/{chunk-3ZRFOKDM.cjs.map → chunk-NNAEQR3Y.cjs.map} +1 -1
  140. package/dist/{chunk-36JFXFM2.cjs → chunk-OGGZIFTI.cjs} +38 -38
  141. package/dist/chunk-OGGZIFTI.cjs.map +1 -0
  142. package/dist/{chunk-2PCCGQOH.js → chunk-P6OJQ2RN.js} +6 -6
  143. package/dist/{chunk-3RWZC6OW.cjs → chunk-PE2SLXUS.cjs} +5 -5
  144. package/dist/{chunk-3RWZC6OW.cjs.map → chunk-PE2SLXUS.cjs.map} +1 -1
  145. package/dist/chunk-QD32IMMH.js +13 -0
  146. package/dist/chunk-QD32IMMH.js.map +1 -0
  147. package/dist/{chunk-HEXAY6DE.cjs → chunk-QUSO4GFA.cjs} +7 -7
  148. package/dist/{chunk-HEXAY6DE.cjs.map → chunk-QUSO4GFA.cjs.map} +1 -1
  149. package/dist/{chunk-OOCCSMWM.js → chunk-RHWZX7PB.js} +9 -7
  150. package/dist/chunk-RHWZX7PB.js.map +1 -0
  151. package/dist/{chunk-YXRKBKFB.js → chunk-S5CMZFX6.js} +3 -3
  152. package/dist/{chunk-4AO5RKV5.cjs → chunk-SLHIVEFW.cjs} +7 -7
  153. package/dist/{chunk-4AO5RKV5.cjs.map → chunk-SLHIVEFW.cjs.map} +1 -1
  154. package/dist/{chunk-HEX4IMLO.js → chunk-TJQNGJHP.js} +4 -4
  155. package/dist/{chunk-JCKGAAPZ.cjs → chunk-TNQ2ZZ7W.cjs} +9 -9
  156. package/dist/{chunk-JCKGAAPZ.cjs.map → chunk-TNQ2ZZ7W.cjs.map} +1 -1
  157. package/dist/chunk-U32K2H3N.js +10 -0
  158. package/dist/chunk-U32K2H3N.js.map +1 -0
  159. package/dist/{chunk-RHHZRTWM.js → chunk-U34INRFO.js} +28 -13
  160. package/dist/chunk-U34INRFO.js.map +1 -0
  161. package/dist/{chunk-SFFKQQ5Z.js → chunk-U4SVBE2M.js} +5 -5
  162. package/dist/{chunk-O3QM3BFE.js → chunk-UC4NYF6T.js} +2 -2
  163. package/dist/{chunk-6JHVXWDV.cjs → chunk-ULKWUKD2.cjs} +22 -22
  164. package/dist/{chunk-6JHVXWDV.cjs.map → chunk-ULKWUKD2.cjs.map} +1 -1
  165. package/dist/{chunk-BEOECPVJ.cjs → chunk-UTYY35QX.cjs} +3 -3
  166. package/dist/{chunk-BEOECPVJ.cjs.map → chunk-UTYY35QX.cjs.map} +1 -1
  167. package/dist/{chunk-7BFODYNL.cjs → chunk-UUT2VEN5.cjs} +7 -7
  168. package/dist/{chunk-7BFODYNL.cjs.map → chunk-UUT2VEN5.cjs.map} +1 -1
  169. package/dist/chunk-V3T7RO4F.js +21 -0
  170. package/dist/chunk-V3T7RO4F.js.map +1 -0
  171. package/dist/{chunk-GIEDIAPD.js → chunk-V5CM5TH3.js} +3 -3
  172. package/dist/{chunk-L65MHFMD.js → chunk-V64DICJK.js} +3 -3
  173. package/dist/{chunk-KIZVY57H.cjs → chunk-VXC7Z7XB.cjs} +5 -5
  174. package/dist/{chunk-KIZVY57H.cjs.map → chunk-VXC7Z7XB.cjs.map} +1 -1
  175. package/dist/chunk-VYF7WV4K.cjs +47 -0
  176. package/dist/chunk-VYF7WV4K.cjs.map +1 -0
  177. package/dist/{chunk-P4XZH3OR.js → chunk-WHQGJHMD.js} +4 -4
  178. package/dist/{chunk-TTLFY76J.cjs → chunk-WR77IZUU.cjs} +32 -9
  179. package/dist/chunk-WR77IZUU.cjs.map +1 -0
  180. package/dist/{chunk-O2BECFXJ.cjs → chunk-WTFEMOV5.cjs} +43 -22
  181. package/dist/chunk-WTFEMOV5.cjs.map +1 -0
  182. package/dist/{chunk-YAKTVIVK.js → chunk-XIUZT4TO.js} +3 -3
  183. package/dist/chunk-XPG56DLQ.cjs +103 -0
  184. package/dist/chunk-XPG56DLQ.cjs.map +1 -0
  185. package/dist/{chunk-GPVGGBIR.js → chunk-XWMXEJVZ.js} +2 -2
  186. package/dist/chunk-XZILHRKG.cjs +13 -0
  187. package/dist/chunk-XZILHRKG.cjs.map +1 -0
  188. package/dist/{chunk-VQGLVBPL.cjs → chunk-YIOHKQ6Y.cjs} +11 -4
  189. package/dist/chunk-YIOHKQ6Y.cjs.map +1 -0
  190. package/dist/{chunk-A3LMUPG3.js → chunk-Z3IJWYUD.js} +2 -2
  191. package/dist/{chunk-4J25XZDI.js → chunk-ZJWQPZ7E.js} +9 -2
  192. package/dist/chunk-ZJWQPZ7E.js.map +1 -0
  193. package/dist/color-picker/index.cjs +5 -4
  194. package/dist/color-picker/index.cjs.map +1 -1
  195. package/dist/color-picker/index.js +4 -3
  196. package/dist/combobox/index.cjs +7 -6
  197. package/dist/combobox/index.cjs.map +1 -1
  198. package/dist/combobox/index.js +6 -5
  199. package/dist/command-palette/index.cjs +4 -3
  200. package/dist/command-palette/index.cjs.map +1 -1
  201. package/dist/command-palette/index.js +3 -2
  202. package/dist/context-menu/index.cjs +7 -6
  203. package/dist/context-menu/index.cjs.map +1 -1
  204. package/dist/context-menu/index.d.cts +2 -2
  205. package/dist/context-menu/index.d.ts +2 -2
  206. package/dist/context-menu/index.js +6 -5
  207. package/dist/conversation/index.cjs +11 -8
  208. package/dist/conversation/index.cjs.map +1 -1
  209. package/dist/conversation/index.d.cts +3 -3
  210. package/dist/conversation/index.d.ts +3 -3
  211. package/dist/conversation/index.js +10 -7
  212. package/dist/data-grid/index.cjs +18 -15
  213. package/dist/data-grid/index.cjs.map +1 -1
  214. package/dist/data-grid/index.d.cts +8 -8
  215. package/dist/data-grid/index.d.ts +8 -8
  216. package/dist/data-grid/index.js +17 -14
  217. package/dist/date-picker/index.cjs +11 -8
  218. package/dist/date-picker/index.cjs.map +1 -1
  219. package/dist/date-picker/index.d.cts +2 -2
  220. package/dist/date-picker/index.d.ts +2 -2
  221. package/dist/date-picker/index.js +10 -7
  222. package/dist/drawer/index.cjs +8 -5
  223. package/dist/drawer/index.cjs.map +1 -1
  224. package/dist/drawer/index.d.cts +5 -4
  225. package/dist/drawer/index.d.ts +5 -4
  226. package/dist/drawer/index.js +7 -4
  227. package/dist/dropdown/index.cjs +4 -3
  228. package/dist/dropdown/index.cjs.map +1 -1
  229. package/dist/dropdown/index.js +3 -2
  230. package/dist/header/index.cjs +9 -6
  231. package/dist/header/index.cjs.map +1 -1
  232. package/dist/header/index.d.cts +10 -10
  233. package/dist/header/index.d.ts +10 -10
  234. package/dist/header/index.js +8 -5
  235. package/dist/index.cjs +59 -42
  236. package/dist/index.cjs.map +1 -1
  237. package/dist/index.css +107 -34
  238. package/dist/index.d.cts +16 -13
  239. package/dist/index.d.ts +16 -13
  240. package/dist/index.js +65 -48
  241. package/dist/inline-edit/index.cjs +6 -5
  242. package/dist/inline-edit/index.cjs.map +1 -1
  243. package/dist/inline-edit/index.js +5 -4
  244. package/dist/input/index.cjs +5 -4
  245. package/dist/input/index.cjs.map +1 -1
  246. package/dist/input/index.d.cts +3 -3
  247. package/dist/input/index.d.ts +3 -3
  248. package/dist/input/index.js +4 -3
  249. package/dist/link-provider/index.cjs +12 -0
  250. package/dist/link-provider/index.cjs.map +1 -0
  251. package/dist/link-provider/index.d.cts +43 -0
  252. package/dist/link-provider/index.d.ts +43 -0
  253. package/dist/link-provider/index.js +12 -0
  254. package/dist/link-provider/index.js.map +1 -0
  255. package/dist/lucide-icons/index.cjs +9 -0
  256. package/dist/lucide-icons/index.cjs.map +1 -0
  257. package/dist/lucide-icons/index.d.cts +2 -0
  258. package/dist/lucide-icons/index.d.ts +2 -0
  259. package/dist/lucide-icons/index.js +9 -0
  260. package/dist/lucide-icons/index.js.map +1 -0
  261. package/dist/menu/index.cjs +6 -5
  262. package/dist/menu/index.cjs.map +1 -1
  263. package/dist/menu/index.d.cts +3 -3
  264. package/dist/menu/index.d.ts +3 -3
  265. package/dist/menu/index.js +5 -4
  266. package/dist/modal/index.cjs +8 -5
  267. package/dist/modal/index.cjs.map +1 -1
  268. package/dist/modal/index.d.cts +2 -2
  269. package/dist/modal/index.d.ts +2 -2
  270. package/dist/modal/index.js +7 -4
  271. package/dist/navigation/index.cjs +8 -5
  272. package/dist/navigation/index.cjs.map +1 -1
  273. package/dist/navigation/index.d.cts +3 -3
  274. package/dist/navigation/index.d.ts +3 -3
  275. package/dist/navigation/index.js +7 -4
  276. package/dist/number-input/index.cjs +4 -3
  277. package/dist/number-input/index.cjs.map +1 -1
  278. package/dist/number-input/index.js +3 -2
  279. package/dist/page-layout/index.cjs +16 -13
  280. package/dist/page-layout/index.cjs.map +1 -1
  281. package/dist/page-layout/index.d.cts +8 -8
  282. package/dist/page-layout/index.d.ts +8 -8
  283. package/dist/page-layout/index.js +15 -12
  284. package/dist/pagination/index.cjs +11 -8
  285. package/dist/pagination/index.cjs.map +1 -1
  286. package/dist/pagination/index.js +10 -7
  287. package/dist/popover/index.cjs +4 -3
  288. package/dist/popover/index.cjs.map +1 -1
  289. package/dist/popover/index.d.cts +1 -1
  290. package/dist/popover/index.d.ts +1 -1
  291. package/dist/popover/index.js +3 -2
  292. package/dist/renderIcon-BW3PUtg8.d.cts +50 -0
  293. package/dist/renderIcon-BW3PUtg8.d.ts +50 -0
  294. package/dist/segmented-control/index.cjs +5 -4
  295. package/dist/segmented-control/index.cjs.map +1 -1
  296. package/dist/segmented-control/index.d.cts +3 -3
  297. package/dist/segmented-control/index.d.ts +3 -3
  298. package/dist/segmented-control/index.js +4 -3
  299. package/dist/select/index.cjs +7 -6
  300. package/dist/select/index.cjs.map +1 -1
  301. package/dist/select/index.d.cts +4 -4
  302. package/dist/select/index.d.ts +4 -4
  303. package/dist/select/index.js +6 -5
  304. package/dist/snackbar/index.cjs +8 -5
  305. package/dist/snackbar/index.cjs.map +1 -1
  306. package/dist/snackbar/index.js +7 -4
  307. package/dist/split-button/index.cjs +7 -6
  308. package/dist/split-button/index.cjs.map +1 -1
  309. package/dist/split-button/index.d.cts +2 -2
  310. package/dist/split-button/index.d.ts +2 -2
  311. package/dist/split-button/index.js +6 -5
  312. package/dist/split-chip/index.cjs +14 -0
  313. package/dist/split-chip/index.cjs.map +1 -0
  314. package/dist/split-chip/index.d.cts +67 -0
  315. package/dist/split-chip/index.d.ts +67 -0
  316. package/dist/split-chip/index.js +14 -0
  317. package/dist/split-chip/index.js.map +1 -0
  318. package/dist/table/index.cjs +16 -13
  319. package/dist/table/index.cjs.map +1 -1
  320. package/dist/table/index.d.cts +4 -4
  321. package/dist/table/index.d.ts +4 -4
  322. package/dist/table/index.js +15 -12
  323. package/dist/tabs/index.cjs +4 -3
  324. package/dist/tabs/index.cjs.map +1 -1
  325. package/dist/tabs/index.d.cts +1 -1
  326. package/dist/tabs/index.d.ts +1 -1
  327. package/dist/tabs/index.js +3 -2
  328. package/dist/tag-input/index.cjs +9 -6
  329. package/dist/tag-input/index.cjs.map +1 -1
  330. package/dist/tag-input/index.js +8 -5
  331. package/dist/textarea/index.cjs +5 -4
  332. package/dist/textarea/index.cjs.map +1 -1
  333. package/dist/textarea/index.d.cts +1 -1
  334. package/dist/textarea/index.d.ts +1 -1
  335. package/dist/textarea/index.js +4 -3
  336. package/dist/theme-editor/index.cjs +14 -11
  337. package/dist/theme-editor/index.cjs.map +1 -1
  338. package/dist/theme-editor/index.js +13 -10
  339. package/dist/theme-provider/index.cjs +4 -3
  340. package/dist/theme-provider/index.cjs.map +1 -1
  341. package/dist/theme-provider/index.js +3 -2
  342. package/dist/timeline/index.cjs +2 -2
  343. package/dist/timeline/index.d.cts +18 -3
  344. package/dist/timeline/index.d.ts +18 -3
  345. package/dist/timeline/index.js +1 -1
  346. package/dist/toolbar/index.cjs +12 -9
  347. package/dist/toolbar/index.cjs.map +1 -1
  348. package/dist/toolbar/index.d.cts +7 -7
  349. package/dist/toolbar/index.d.ts +7 -7
  350. package/dist/toolbar/index.js +11 -8
  351. package/dist/tooltip/index.cjs +4 -3
  352. package/dist/tooltip/index.cjs.map +1 -1
  353. package/dist/tooltip/index.js +3 -2
  354. package/package.json +4 -2
  355. package/dist/Button.types-BH0CPyPx.d.ts +0 -33
  356. package/dist/Button.types-DZRCVqyN.d.cts +0 -33
  357. package/dist/chunk-35LGEPLP.cjs.map +0 -1
  358. package/dist/chunk-36JFXFM2.cjs.map +0 -1
  359. package/dist/chunk-3KBBJZHK.cjs.map +0 -1
  360. package/dist/chunk-4J25XZDI.js.map +0 -1
  361. package/dist/chunk-5O73AALP.cjs.map +0 -1
  362. package/dist/chunk-75GFIQRU.js.map +0 -1
  363. package/dist/chunk-DA375AI6.cjs +0 -88
  364. package/dist/chunk-DA375AI6.cjs.map +0 -1
  365. package/dist/chunk-DRXPTACG.js.map +0 -1
  366. package/dist/chunk-GWHZFX2H.js.map +0 -1
  367. package/dist/chunk-NEQXEVHM.js +0 -34
  368. package/dist/chunk-NEQXEVHM.js.map +0 -1
  369. package/dist/chunk-O2BECFXJ.cjs.map +0 -1
  370. package/dist/chunk-OOCCSMWM.js.map +0 -1
  371. package/dist/chunk-RHHZRTWM.js.map +0 -1
  372. package/dist/chunk-SNRRF64M.js.map +0 -1
  373. package/dist/chunk-TTLFY76J.cjs.map +0 -1
  374. package/dist/chunk-VQGLVBPL.cjs.map +0 -1
  375. package/dist/chunk-WE2SBWZ6.js.map +0 -1
  376. package/dist/chunk-ZMDZGL5A.cjs +0 -34
  377. package/dist/chunk-ZMDZGL5A.cjs.map +0 -1
  378. package/dist/renderIcon-C2lEMMzb.d.cts +0 -30
  379. package/dist/renderIcon-C2lEMMzb.d.ts +0 -30
  380. /package/dist/{chunk-RHFD2Z5V.js.map → chunk-3TF2GZSG.js.map} +0 -0
  381. /package/dist/{chunk-JHX6JK3M.js.map → chunk-3X6QVHTD.js.map} +0 -0
  382. /package/dist/{chunk-MQAOXZD4.js.map → chunk-4S57PE43.js.map} +0 -0
  383. /package/dist/{chunk-JT4KVXJK.js.map → chunk-4V2XYUQL.js.map} +0 -0
  384. /package/dist/{chunk-AR2ZOO6L.js.map → chunk-6FXFKMJ5.js.map} +0 -0
  385. /package/dist/{chunk-LGDODZHI.js.map → chunk-6LTZV6HN.js.map} +0 -0
  386. /package/dist/{chunk-YP4HUBKN.js.map → chunk-6NAOAKII.js.map} +0 -0
  387. /package/dist/{chunk-D7SQ7LHJ.js.map → chunk-BO3KK3ZQ.js.map} +0 -0
  388. /package/dist/{chunk-5XH2PHT2.js.map → chunk-CNTG7OOO.js.map} +0 -0
  389. /package/dist/{chunk-WNDDS367.js.map → chunk-DPTTDHZ5.js.map} +0 -0
  390. /package/dist/{chunk-BFKPJ627.js.map → chunk-FHOD3FUN.js.map} +0 -0
  391. /package/dist/{chunk-SDUGYJGW.js.map → chunk-H3C6YECZ.js.map} +0 -0
  392. /package/dist/{chunk-MPIVBAMY.js.map → chunk-HYRLK462.js.map} +0 -0
  393. /package/dist/{chunk-FIVMMCGM.js.map → chunk-IHPSRTVW.js.map} +0 -0
  394. /package/dist/{chunk-THCTUBX6.js.map → chunk-IKXXXVUO.js.map} +0 -0
  395. /package/dist/{chunk-24HKKSKX.js.map → chunk-L6ERHCQ2.js.map} +0 -0
  396. /package/dist/{chunk-4LNTZPSQ.js.map → chunk-L6YJ6QTZ.js.map} +0 -0
  397. /package/dist/{chunk-JNY7TUDS.js.map → chunk-MCPGI6EI.js.map} +0 -0
  398. /package/dist/{chunk-2PCCGQOH.js.map → chunk-P6OJQ2RN.js.map} +0 -0
  399. /package/dist/{chunk-YXRKBKFB.js.map → chunk-S5CMZFX6.js.map} +0 -0
  400. /package/dist/{chunk-HEX4IMLO.js.map → chunk-TJQNGJHP.js.map} +0 -0
  401. /package/dist/{chunk-SFFKQQ5Z.js.map → chunk-U4SVBE2M.js.map} +0 -0
  402. /package/dist/{chunk-O3QM3BFE.js.map → chunk-UC4NYF6T.js.map} +0 -0
  403. /package/dist/{chunk-GIEDIAPD.js.map → chunk-V5CM5TH3.js.map} +0 -0
  404. /package/dist/{chunk-L65MHFMD.js.map → chunk-V64DICJK.js.map} +0 -0
  405. /package/dist/{chunk-P4XZH3OR.js.map → chunk-WHQGJHMD.js.map} +0 -0
  406. /package/dist/{chunk-YAKTVIVK.js.map → chunk-XIUZT4TO.js.map} +0 -0
  407. /package/dist/{chunk-GPVGGBIR.js.map → chunk-XWMXEJVZ.js.map} +0 -0
  408. /package/dist/{chunk-A3LMUPG3.js.map → chunk-Z3IJWYUD.js.map} +0 -0
@@ -1 +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
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-SLHIVEFW.cjs","../src/components/Combobox/Combobox.component.tsx"],"names":["label"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-SLHIVEFW.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"]}
@@ -3,13 +3,13 @@ import {
3
3
  } from "./chunk-XJBWFDDE.js";
4
4
  import {
5
5
  IconButton
6
- } from "./chunk-75GFIQRU.js";
6
+ } from "./chunk-JY77VJAZ.js";
7
7
  import {
8
8
  Tooltip
9
- } from "./chunk-JNY7TUDS.js";
9
+ } from "./chunk-MCPGI6EI.js";
10
10
  import {
11
11
  renderIcon
12
- } from "./chunk-RHHZRTWM.js";
12
+ } from "./chunk-U34INRFO.js";
13
13
 
14
14
  // src/components/Navigation/Navigation.component.tsx
15
15
  import { useCallback, useEffect, useRef, useState } from "react";
@@ -126,4 +126,4 @@ Navigation.displayName = "Navigation";
126
126
  export {
127
127
  Navigation
128
128
  };
129
- //# sourceMappingURL=chunk-HEX4IMLO.js.map
129
+ //# sourceMappingURL=chunk-TJQNGJHP.js.map
@@ -1,18 +1,18 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunk2T7ZMMH5cjs = require('./chunk-2T7ZMMH5.cjs');
3
+ var _chunk7NUVLVSLcjs = require('./chunk-7NUVLVSL.cjs');
4
4
 
5
5
 
6
- var _chunkJ76JHN7Jcjs = require('./chunk-J76JHN7J.cjs');
6
+ var _chunkN5NXKVFJcjs = require('./chunk-N5NXKVFJ.cjs');
7
7
 
8
8
 
9
9
  var _chunkQ3GNKF74cjs = require('./chunk-Q3GNKF74.cjs');
10
10
 
11
11
 
12
- var _chunk5O73AALPcjs = require('./chunk-5O73AALP.cjs');
12
+ var _chunkGP6EEZH5cjs = require('./chunk-GP6EEZH5.cjs');
13
13
 
14
14
 
15
- var _chunkDA375AI6cjs = require('./chunk-DA375AI6.cjs');
15
+ var _chunkXPG56DLQcjs = require('./chunk-XPG56DLQ.cjs');
16
16
 
17
17
  // src/components/Toolbar/Toolbar.component.tsx
18
18
  var _jsxruntime = require('react/jsx-runtime');
@@ -29,12 +29,12 @@ var Toolbar = ({
29
29
  const hasMenu = userMenu !== void 0 && userMenu.length > 0;
30
30
  const avatar = user || hasMenu ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQ3GNKF74cjs.Avatar, { ...user, size: "sm" }) : null;
31
31
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: classes, children: [
32
- breadcrumbs && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk5O73AALPcjs.Breadcrumb, { ...breadcrumbs }),
32
+ breadcrumbs && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkGP6EEZH5cjs.Breadcrumb, { ...breadcrumbs }),
33
33
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-toolbar__content", children: [
34
34
  content && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-toolbar__slot", children: content }),
35
- cmdPaletteItems && cmdPaletteItems.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk2T7ZMMH5cjs.CommandPalette, { trigger: true, triggerLabel: "Search", items: cmdPaletteItems }),
36
- actions && actions.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-toolbar__actions", children: actions.map((action, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDA375AI6cjs.IconButton, { variant: "text", size: "sm", ...action }, index)) }),
37
- hasMenu ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkJ76JHN7Jcjs.Menu, { trigger: avatar, items: userMenu, minWidth: 220 }) : avatar
35
+ cmdPaletteItems && cmdPaletteItems.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk7NUVLVSLcjs.CommandPalette, { trigger: true, triggerLabel: "Search", items: cmdPaletteItems }),
36
+ actions && actions.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-toolbar__actions", children: actions.map((action, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXPG56DLQcjs.IconButton, { variant: "text", size: "sm", ...action }, index)) }),
37
+ hasMenu ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN5NXKVFJcjs.Menu, { trigger: avatar, items: userMenu, minWidth: 220 }) : avatar
38
38
  ] })
39
39
  ] });
40
40
  };
@@ -42,4 +42,4 @@ var Toolbar = ({
42
42
 
43
43
 
44
44
  exports.Toolbar = Toolbar;
45
- //# sourceMappingURL=chunk-JCKGAAPZ.cjs.map
45
+ //# sourceMappingURL=chunk-TNQ2ZZ7W.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-JCKGAAPZ.cjs","../src/components/Toolbar/Toolbar.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACUmC,+CAAA;AAjB5B,IAAM,QAAA,EAAkC,CAAC;AAAA,EAC9C,WAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,QAAA,EAAU,CAAC,eAAA,EAAiB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAOrE,EAAA,MAAM,QAAA,EAAU,SAAA,IAAa,KAAA,EAAA,GAAa,QAAA,CAAS,OAAA,EAAS,CAAA;AAC5D,EAAA,MAAM,OAAA,EAAS,KAAA,GAAQ,QAAA,kBAAU,6BAAA,wBAAC,EAAA,EAAQ,GAAG,IAAA,EAAM,IAAA,EAAK,KAAA,CAAK,EAAA,EAAK,IAAA;AAElE,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,OAAA,EACb,QAAA,EAAA;AAAA,IAAA,YAAA,mBAAe,6BAAA,4BAAC,EAAA,EAAY,GAAG,YAAA,CAAa,CAAA;AAAA,oBAC7C,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,mBAAW,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,QAAA,CAAQ,CAAA;AAAA,MACzD,gBAAA,GAAmB,eAAA,CAAgB,OAAA,EAAS,EAAA,mBAC3C,6BAAA,gCAAC,EAAA,EAAe,OAAA,EAAO,IAAA,EAAC,YAAA,EAAa,QAAA,EAAS,KAAA,EAAO,gBAAA,CAAiB,CAAA;AAAA,MAEvE,QAAA,GAAW,OAAA,CAAQ,OAAA,EAAS,EAAA,mBAC3B,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,EAAA,mBACpB,6BAAA,4BAAC,EAAA,EAAuB,OAAA,EAAQ,MAAA,EAAO,IAAA,EAAK,IAAA,EAAM,GAAG,OAAA,CAAA,EAApC,KAA4C,CAC9D,EAAA,CACH,CAAA;AAAA,MAED,QAAA,kBAAU,6BAAA,sBAAC,EAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,EAAA,EAAK;AAAA,IAAA,EAAA,CACzE;AAAA,EAAA,EAAA,CACF,CAAA;AAEJ,CAAA;ADPA;AACA;AACE;AACF,0BAAC","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-JCKGAAPZ.cjs","sourcesContent":[null,"import React from 'react';\nimport type { ToolbarProps } from './Toolbar.types';\nimport './Toolbar.scss';\nimport { IconButton } from '../Button';\nimport { Breadcrumb } from '../Breadcrumb';\nimport { Avatar } from '../Avatar';\nimport { Menu } from '../Menu';\nimport { CommandPalette } from '../CommandPalette';\n\nexport const Toolbar: React.FC<ToolbarProps> = ({\n breadcrumbs,\n actions,\n user,\n userMenu,\n cmdPaletteItems,\n content,\n className = '',\n}) => {\n const classes = ['eidos-toolbar', className].filter(Boolean).join(' ');\n\n // The avatar is the menu's trigger when there are items to open, and a\n // plain mark when there aren't - `Menu` with an empty `items` array would\n // render an interactive, focusable trigger that opens nothing. A menu\n // given without a `user` still needs a trigger, and `Avatar` already\n // falls back to a generic user icon when it has neither `name` nor `src`.\n const hasMenu = userMenu !== undefined && userMenu.length > 0;\n const avatar = user || hasMenu ? <Avatar {...user} size=\"sm\" /> : null;\n\n return (\n <div className={classes}>\n {breadcrumbs && <Breadcrumb {...breadcrumbs} />}\n <div className=\"eidos-toolbar__content\">\n {content && <div className=\"eidos-toolbar__slot\">{content}</div>}\n {cmdPaletteItems && cmdPaletteItems.length > 0 && (\n <CommandPalette trigger triggerLabel=\"Search\" items={cmdPaletteItems} />\n )}\n {actions && actions.length > 0 && (\n <div className=\"eidos-toolbar__actions\">\n {actions.map((action, index) => (\n <IconButton key={index} variant=\"text\" size=\"sm\" {...action} />\n ))}\n </div>\n )}\n {hasMenu ? <Menu trigger={avatar} items={userMenu} minWidth={220} /> : avatar}\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-TNQ2ZZ7W.cjs","../src/components/Toolbar/Toolbar.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACUmC,+CAAA;AAjB5B,IAAM,QAAA,EAAkC,CAAC;AAAA,EAC9C,WAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,QAAA,EAAU,CAAC,eAAA,EAAiB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAOrE,EAAA,MAAM,QAAA,EAAU,SAAA,IAAa,KAAA,EAAA,GAAa,QAAA,CAAS,OAAA,EAAS,CAAA;AAC5D,EAAA,MAAM,OAAA,EAAS,KAAA,GAAQ,QAAA,kBAAU,6BAAA,wBAAC,EAAA,EAAQ,GAAG,IAAA,EAAM,IAAA,EAAK,KAAA,CAAK,EAAA,EAAK,IAAA;AAElE,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,OAAA,EACb,QAAA,EAAA;AAAA,IAAA,YAAA,mBAAe,6BAAA,4BAAC,EAAA,EAAY,GAAG,YAAA,CAAa,CAAA;AAAA,oBAC7C,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,mBAAW,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,QAAA,CAAQ,CAAA;AAAA,MACzD,gBAAA,GAAmB,eAAA,CAAgB,OAAA,EAAS,EAAA,mBAC3C,6BAAA,gCAAC,EAAA,EAAe,OAAA,EAAO,IAAA,EAAC,YAAA,EAAa,QAAA,EAAS,KAAA,EAAO,gBAAA,CAAiB,CAAA;AAAA,MAEvE,QAAA,GAAW,OAAA,CAAQ,OAAA,EAAS,EAAA,mBAC3B,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,EAAA,mBACpB,6BAAA,4BAAC,EAAA,EAAuB,OAAA,EAAQ,MAAA,EAAO,IAAA,EAAK,IAAA,EAAM,GAAG,OAAA,CAAA,EAApC,KAA4C,CAC9D,EAAA,CACH,CAAA;AAAA,MAED,QAAA,kBAAU,6BAAA,sBAAC,EAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,EAAA,EAAK;AAAA,IAAA,EAAA,CACzE;AAAA,EAAA,EAAA,CACF,CAAA;AAEJ,CAAA;ADPA;AACA;AACE;AACF,0BAAC","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-TNQ2ZZ7W.cjs","sourcesContent":[null,"import React from 'react';\nimport type { ToolbarProps } from './Toolbar.types';\nimport './Toolbar.scss';\nimport { IconButton } from '../Button';\nimport { Breadcrumb } from '../Breadcrumb';\nimport { Avatar } from '../Avatar';\nimport { Menu } from '../Menu';\nimport { CommandPalette } from '../CommandPalette';\n\nexport const Toolbar: React.FC<ToolbarProps> = ({\n breadcrumbs,\n actions,\n user,\n userMenu,\n cmdPaletteItems,\n content,\n className = '',\n}) => {\n const classes = ['eidos-toolbar', className].filter(Boolean).join(' ');\n\n // The avatar is the menu's trigger when there are items to open, and a\n // plain mark when there aren't - `Menu` with an empty `items` array would\n // render an interactive, focusable trigger that opens nothing. A menu\n // given without a `user` still needs a trigger, and `Avatar` already\n // falls back to a generic user icon when it has neither `name` nor `src`.\n const hasMenu = userMenu !== undefined && userMenu.length > 0;\n const avatar = user || hasMenu ? <Avatar {...user} size=\"sm\" /> : null;\n\n return (\n <div className={classes}>\n {breadcrumbs && <Breadcrumb {...breadcrumbs} />}\n <div className=\"eidos-toolbar__content\">\n {content && <div className=\"eidos-toolbar__slot\">{content}</div>}\n {cmdPaletteItems && cmdPaletteItems.length > 0 && (\n <CommandPalette trigger triggerLabel=\"Search\" items={cmdPaletteItems} />\n )}\n {actions && actions.length > 0 && (\n <div className=\"eidos-toolbar__actions\">\n {actions.map((action, index) => (\n <IconButton key={index} variant=\"text\" size=\"sm\" {...action} />\n ))}\n </div>\n )}\n {hasMenu ? <Menu trigger={avatar} items={userMenu} minWidth={220} /> : avatar}\n </div>\n </div>\n );\n};\n"]}
@@ -0,0 +1,10 @@
1
+ // src/components/LinkProvider/LinkProvider.context.ts
2
+ import { createContext, useContext } from "react";
3
+ var LinkContext = createContext("a");
4
+ var useLinkComponent = () => useContext(LinkContext);
5
+
6
+ export {
7
+ LinkContext,
8
+ useLinkComponent
9
+ };
10
+ //# sourceMappingURL=chunk-U32K2H3N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/LinkProvider/LinkProvider.context.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport type { LinkComponent } from './LinkProvider.types';\n\n/**\n * Defaults to a plain anchor rather than `undefined`: unlike `useTheme`, a\n * missing provider is not a misconfiguration - it is the ordinary case for a\n * site without client-side routing.\n */\nexport const LinkContext = createContext<LinkComponent>('a');\n\n/** The link component set by the nearest `LinkProvider`, or `'a'`. */\nexport const useLinkComponent = (): LinkComponent => useContext(LinkContext);\n"],"mappings":";AAAA,SAAS,eAAe,kBAAkB;AAQnC,IAAM,cAAc,cAA6B,GAAG;AAGpD,IAAM,mBAAmB,MAAqB,WAAW,WAAW;","names":[]}
@@ -1,12 +1,37 @@
1
+ import {
2
+ resolveRegisteredIcon,
3
+ toIconKey
4
+ } from "./chunk-V3T7RO4F.js";
5
+
1
6
  // src/utils/renderIcon.tsx
2
7
  import { icons } from "lucide-react";
8
+
9
+ // src/utils/devWarn.ts
10
+ var warned = /* @__PURE__ */ new Set();
11
+ function devWarn(key, message) {
12
+ const nodeEnv = globalThis.process?.env?.NODE_ENV;
13
+ if (nodeEnv === "production") return;
14
+ if (warned.has(key)) return;
15
+ warned.add(key);
16
+ console.warn(`[eidos-ui] ${message}`);
17
+ }
18
+
19
+ // src/utils/renderIcon.tsx
3
20
  import { jsx } from "react/jsx-runtime";
4
21
  var renderIcon = (icon, className) => {
5
22
  if (!icon) return null;
6
23
  if (typeof icon === "string") {
7
- const iconName = icon.split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
24
+ const Registered = resolveRegisteredIcon(icon);
25
+ if (Registered) {
26
+ return /* @__PURE__ */ jsx(Registered, { className, "aria-hidden": "true" });
27
+ }
28
+ const iconName = toIconKey(icon);
8
29
  const LucideIcon = icons[iconName];
9
30
  if (LucideIcon) {
31
+ devWarn(
32
+ `icon-string-fallback-${iconName}`,
33
+ `Icon "${icon}" was resolved by name from the full Lucide icon set. That lookup is deprecated and is removed in 4.0, because it bundles every Lucide icon. Pass the component instead (\`import { ${iconName} } from 'lucide-react'\`), register it once with \`registerIcons({ ${iconName} })\`, or \`import 'eidos-ui/lucide-icons'\` to register them all.`
34
+ );
10
35
  return /* @__PURE__ */ jsx(LucideIcon, { className, "aria-hidden": "true" });
11
36
  }
12
37
  return /* @__PURE__ */ jsx("i", { className: `${icon} ${className || ""}`, "aria-hidden": "true" });
@@ -15,16 +40,6 @@ var renderIcon = (icon, className) => {
15
40
  return /* @__PURE__ */ jsx(IconComponent, { className, "aria-hidden": "true" });
16
41
  };
17
42
 
18
- // src/utils/devWarn.ts
19
- var warned = /* @__PURE__ */ new Set();
20
- function devWarn(key, message) {
21
- const nodeEnv = globalThis.process?.env?.NODE_ENV;
22
- if (nodeEnv === "production") return;
23
- if (warned.has(key)) return;
24
- warned.add(key);
25
- console.warn(`[eidos-ui] ${message}`);
26
- }
27
-
28
43
  // src/utils/dualModifier.ts
29
44
  var dualModifier = (block, canonical, legacy) => `${block}--${canonical} ${block}--${legacy}`;
30
45
  var fullWidthModifier = (block) => dualModifier(block, "full-width", "fullWidth");
@@ -123,12 +138,12 @@ var useIsClient = () => {
123
138
  };
124
139
 
125
140
  export {
126
- renderIcon,
127
141
  devWarn,
142
+ renderIcon,
128
143
  dualModifier,
129
144
  fullWidthModifier,
130
145
  FOCUSABLE_SELECTOR,
131
146
  useDialogFocus,
132
147
  useIsClient
133
148
  };
134
- //# sourceMappingURL=chunk-RHHZRTWM.js.map
149
+ //# sourceMappingURL=chunk-U34INRFO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/renderIcon.tsx","../src/utils/devWarn.ts","../src/utils/dualModifier.ts","../src/utils/useDialogFocus.ts","../src/utils/useIsClient.ts"],"sourcesContent":["import React from 'react';\nimport { icons } from 'lucide-react';\nimport { devWarn } from './devWarn';\nimport { resolveRegisteredIcon, toIconKey, type IconComponent } from './iconRegistry';\n\nexport type IconType = IconComponent | string;\n\n/**\n * Renders an icon prop.\n *\n * @param icon - An icon component, or a string: a name registered with\n * `registerIcons`, or CSS classes for an icon font.\n * @param className - Optional CSS class name to apply to the icon.\n * @returns React node representing the icon, or null if no icon provided.\n *\n * @example\n * // Component - the recommended form; only the icons you import are bundled\n * import { Heart } from 'lucide-react';\n * renderIcon(Heart, 'my-icon-class');\n *\n * @example\n * // Registered name\n * registerIcons({ Heart });\n * renderIcon('heart', 'my-icon-class');\n *\n * @example\n * // CSS classes for an icon font (Font Awesome, Remixicon, ...)\n * renderIcon('fas fa-heart', 'my-icon-class');\n */\nexport const renderIcon = (icon: IconType | undefined, className?: string): React.ReactNode => {\n if (!icon) return null;\n\n if (typeof icon === 'string') {\n const Registered = resolveRegisteredIcon(icon);\n if (Registered) {\n return <Registered className={className} aria-hidden=\"true\" />;\n }\n\n // Deprecated fallback, removed in 4.0: resolving an unregistered name\n // against Lucide's full `icons` map. Referencing that map is what puts\n // every Lucide icon (~1,800 modules) into a consumer's bundle, however\n // few they use - no bundler can tree-shake a lookup by a runtime string.\n // It stays for one minor so existing string names keep working while\n // the warning below points at the migration.\n const iconName = toIconKey(icon);\n const LucideIcon = icons[iconName as keyof typeof icons] as IconComponent | undefined;\n\n if (LucideIcon) {\n devWarn(\n `icon-string-fallback-${iconName}`,\n `Icon \"${icon}\" was resolved by name from the full Lucide icon set. That lookup is deprecated and is removed in 4.0, because it bundles every Lucide icon. Pass the component instead (\\`import { ${iconName} } from 'lucide-react'\\`), register it once with \\`registerIcons({ ${iconName} })\\`, or \\`import 'eidos-ui/lucide-icons'\\` to register them all.`,\n );\n return <LucideIcon className={className} aria-hidden=\"true\" />;\n }\n\n // Fallback: render as a CSS class (for Font Awesome, Remixicon, etc.)\n return <i className={`${icon} ${className || ''}`} aria-hidden=\"true\" />;\n }\n\n // It's a React component\n const IconComponent = icon;\n return <IconComponent className={className} aria-hidden=\"true\" />;\n};\n","/**\n * Logs a misconfiguration warning, once per `key`, and never in production.\n *\n * Deliberately reads `process.env.NODE_ENV` off `globalThis` behind a cast\n * rather than referencing `process` directly: this is a browser library, and\n * a bare `process` reference fails the `tsup` dts build (its worker resolves\n * without node types, so `npm run typecheck` passing is not enough) as well\n * as throwing at runtime anywhere a bundler hasn't substituted it. The\n * optional chaining covers every case - no `process`, no `env`, no value.\n *\n * Because the check is dynamic rather than a statically replaceable\n * `process.env.NODE_ENV` expression, the message text stays in production\n * bundles; only the logging is skipped. That is the trade for not shipping a\n * `process` reference at all, and these strings are small.\n */\nconst warned = new Set<string>();\n\nexport function devWarn(key: string, message: string): void {\n const nodeEnv = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process?.env\n ?.NODE_ENV;\n if (nodeEnv === 'production') return;\n if (warned.has(key)) return;\n warned.add(key);\n console.warn(`[eidos-ui] ${message}`);\n}\n","/**\n * Emits a BEM modifier in both its canonical kebab-case spelling and a legacy\n * camelCase one.\n *\n * The library shipped two conventions for the same idea: eight components\n * used `--fullWidth` while four used `--full-width`, and `Tabs` had\n * `--hideScrollbar`. Kebab-case is the canonical form - every block name\n * (`eidos-date-picker-trigger`) and every design token (`--font-size-sm`) is\n * already kebab, so a camelCase modifier was inconsistent with the very\n * selector it hung off.\n *\n * Renaming outright would be a **breaking** change: `README.md` presents the\n * `eidos-*` class names as things consumers may target, so a stylesheet out\n * there is matching the old spelling. Emitting both keeps every existing\n * selector working while new code has one spelling to learn.\n *\n * Deliberately a helper rather than a duplicated string literal at each call\n * site: two near-identical classes in a `className` read as a copy-paste slip\n * and invite exactly the \"tidy up\" that would silently break those consumer\n * stylesheets. It also makes dropping the aliases at the next major a change\n * to this one file rather than an edit in every component.\n *\n * Internal only - deliberately not re-exported from `src/index.ts`.\n *\n * @example\n * dualModifier('eidos-input', 'full-width', 'fullWidth');\n * // 'eidos-input--full-width eidos-input--fullWidth'\n */\nexport const dualModifier = (block: string, canonical: string, legacy: string): string =>\n `${block}--${canonical} ${block}--${legacy}`;\n\n/** `dualModifier` preset for the library's most widespread split modifier. */\nexport const fullWidthModifier = (block: string): string =>\n dualModifier(block, 'full-width', 'fullWidth');\n","import { useEffect, type RefObject } from 'react';\n\n/**\n * Focus management for a dialog: move focus in on open, optionally trap Tab\n * inside it, and restore focus to the opener on close.\n *\n * Named for the job rather than the mechanism because the trap is optional.\n * `Popover` declares `aria-modal=\"false\"` - an honest non-modal dialog - so\n * trapping Tab in it would be wrong, but it still needs the other two: its\n * panel is portaled to `document.body`, so without moving focus in, Tab from\n * the trigger goes to whatever follows it in the page and the panel's own\n * controls are unreachable by keyboard entirely.\n *\n * ## Why this exists\n *\n * `Modal`, `Drawer` and `CommandPalette` all rendered\n * `role=\"dialog\" aria-modal=\"true\"` with no focus management whatsoever. That\n * attribute is a **promise to assistive technology that the rest of the page\n * is inert**, and it was false: measured in a browser, focus never entered the\n * dialog, and Tab moved to the page behind the scrim on the first press\n * (Drawer on the second). Drawer additionally dropped focus onto `<body>` when\n * it closed, so a keyboard user was returned to the top of the document.\n *\n * That is WCAG 2.4.3 Focus Order (Level A), and it is invisible to axe - a\n * static snapshot of the DOM looks perfectly correct.\n *\n * ## Nesting\n *\n * Traps register on a module-level stack and only the innermost one acts, so a\n * dialog opened from a dialog behaves correctly. Without this, both listeners\n * fire for the same Tab and fight over where focus lands.\n *\n * ## What this does *not* do\n *\n * It does not mark the background `inert`. A trap plus `aria-modal` is the\n * widely-supported approach and is what screen readers act on; `inert` on\n * every sibling of the portal root would be stronger, but it needs the\n * component to know about DOM it does not own. Worth revisiting if a\n * consumer reports a screen reader escaping the dialog in browse mode.\n */\n\n/**\n * Deliberately not `[tabindex]` in general - that would match `tabindex=\"-1\"`,\n * which is programmatically focusable but explicitly removed from the Tab\n * sequence, so including it would make Tab stop somewhere the user cannot\n * reach by tabbing in the first place.\n */\nexport const FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'area[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n 'details > summary:first-of-type',\n 'iframe',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n '[tabindex]:not([tabindex^=\"-\"])',\n].join(',');\n\n/**\n * `offsetParent === null` is the usual visibility check and is wrong here: it\n * is also null for `position: fixed` elements, which is exactly what a modal\n * is. `getClientRects()` is empty only when the element genuinely does not\n * render.\n */\nconst isVisible = (element: HTMLElement): boolean =>\n element.getClientRects().length > 0 && getComputedStyle(element).visibility !== 'hidden';\n\nconst getFocusable = (container: HTMLElement): HTMLElement[] =>\n Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR)).filter(\n (element) => isVisible(element) && element.closest('[aria-hidden=\"true\"]') === null,\n );\n\n/** Innermost trap last. Only the last entry responds to Tab. */\nconst trapStack: HTMLElement[] = [];\n\nexport interface UseDialogFocusOptions {\n /** Focused when the trap activates. Defaults to the first focusable child. */\n initialFocus?: RefObject<HTMLElement | null>;\n /**\n * Whether to return focus to whatever had it when the trap activated.\n * Defaults to `true`; pass `false` when the caller restores focus itself.\n */\n restoreFocus?: boolean;\n /**\n * Whether Tab is confined to the container. Defaults to `true`.\n *\n * Set `false` for a non-modal dialog (`aria-modal=\"false\"`), where the rest\n * of the page stays available and trapping would strand the user.\n */\n trapTab?: boolean;\n}\n\nexport const useDialogFocus = (\n active: boolean,\n containerRef: RefObject<HTMLElement | null>,\n { initialFocus, restoreFocus = true, trapTab = true }: UseDialogFocusOptions = {},\n): void => {\n useEffect(() => {\n const container = containerRef.current;\n if (!active || !container) return;\n\n // Captured before focus moves. The caller must only flip `active` to true\n // once the container is in the DOM - for the animated overlays that means\n // `isOpen && isMounted`, since `isMounted` is set in an effect one render\n // later and the container does not exist before it.\n const previouslyFocused = document.activeElement as HTMLElement | null;\n\n trapStack.push(container);\n\n // Moving focus in is retried across a few frames rather than attempted\n // once.\n //\n // These overlays animate open, and `.focus()` on an element that is still\n // `visibility: hidden` is a silent no-op - it does not throw, it just\n // leaves focus where it was. `Modal` sets its `--is-open` class two\n // animation frames after mounting, and the computed style has not caught\n // up at the moment the effect runs, so a single attempt focused nothing\n // and the trap looked broken.\n //\n // Retrying is better than keying off any particular animation: the hook\n // stays ignorant of each component's transition duration, and simply\n // stops as soon as focus has actually landed inside.\n const MAX_FRAMES = 10;\n let frame = 0;\n let attempts = 0;\n\n const tryFocus = () => {\n const target = initialFocus?.current ?? getFocusable(container)[0];\n if (target) {\n target.focus();\n } else {\n // A dialog with nothing focusable in it still must not leave focus on\n // the page behind, so the container takes it. `tabindex=\"-1\"` keeps\n // it out of the Tab sequence while allowing `.focus()`.\n if (!container.hasAttribute('tabindex')) container.setAttribute('tabindex', '-1');\n container.focus();\n }\n\n if (!container.contains(document.activeElement) && attempts < MAX_FRAMES) {\n attempts += 1;\n frame = requestAnimationFrame(tryFocus);\n }\n };\n\n tryFocus();\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n // Only the innermost trap acts.\n if (trapStack[trapStack.length - 1] !== container) return;\n\n // Re-queried on every Tab rather than cached: dialog contents change\n // (a disabled Confirm button becoming enabled, a list filtering down),\n // and a stale list sends focus to an element that is no longer there.\n const focusable = getFocusable(container);\n if (focusable.length === 0) {\n event.preventDefault();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n const activeElement = document.activeElement as HTMLElement | null;\n\n // Focus outside the container - e.g. a click landed on the backdrop.\n // Pull it back in rather than letting Tab continue through the page.\n if (!activeElement || !container.contains(activeElement)) {\n event.preventDefault();\n (event.shiftKey ? last : first).focus();\n return;\n }\n\n if (event.shiftKey && activeElement === first) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && activeElement === last) {\n event.preventDefault();\n first.focus();\n }\n };\n\n if (trapTab) document.addEventListener('keydown', onKeyDown, true);\n\n return () => {\n cancelAnimationFrame(frame);\n document.removeEventListener('keydown', onKeyDown, true);\n\n const index = trapStack.lastIndexOf(container);\n if (index !== -1) trapStack.splice(index, 1);\n\n // Restore only if focus still belongs to the closing dialog.\n //\n // Two cases count as \"belongs\":\n //\n // 1. Focus is still inside the container.\n // 2. Focus has been lost to `<body>`. When the overlay hides, the\n // browser blurs whatever was focused inside it, so by the time this\n // cleanup runs `activeElement` is often already `<body>` - checking\n // only case 1 meant `CommandPalette` never restored at all.\n //\n // Anything else means something took focus deliberately - a confirm\n // action moving to a new region, say - and stealing it back would be\n // worse than doing nothing.\n const active = document.activeElement;\n const focusIsOurs = container.contains(active) || active === document.body || active === null;\n\n if (restoreFocus && focusIsOurs && previouslyFocused?.isConnected) {\n previouslyFocused.focus();\n }\n };\n }, [active, containerRef, initialFocus, restoreFocus, trapTab]);\n};\n","import { useEffect, useState } from 'react';\n\n/**\n * `false` on the server and on the very first client render, `true` from the\n * first effect onwards.\n *\n * ## Why this exists\n *\n * Every overlay in this library renders through `createPortal(…,\n * document.body)`. A portal is a client-only construct: there is no\n * `document` during `renderToString`, so any overlay that is *already open on\n * its first render* does not merely render oddly - it throws, and takes the\n * whole server render down with it. Measured against the built package:\n *\n * ```\n * renderToString(<Modal isOpen>) ReferenceError: document is not defined\n * renderToString(<Dropdown defaultOpen>) ReferenceError: DOMRect is not defined\n * renderToString(<Select autoOpen>) ReferenceError: DOMRect is not defined\n * ```\n *\n * `Modal`, `Drawer` and `CommandPalette` each keep an `isMounted` flag, which\n * looks like it would prevent this and does not: it is initialised to\n * `useState(isOpen)`, so it is already `true` on the first render. It exists\n * to sequence the open/close *animation*, not to defer the portal.\n *\n * With this hook the server renders nothing for the panel, and the portal\n * appears on the client after mount.\n *\n * ## Why a state flag rather than `typeof document !== 'undefined'`\n *\n * That check is `true` during hydration, so the client's first render would\n * produce the portal while the server's produced nothing - a hydration\n * mismatch, which React resolves by discarding and re-rendering the subtree.\n * A state flag set in an effect makes the first client render agree with the\n * server by construction, and the portal arrive one render later.\n *\n * ## Scope\n *\n * Only for components that can be open on their first render - `Dropdown`\n * (`defaultOpen`), `Popover`, `Modal`, `Drawer`, `CommandPalette`. `Tooltip`,\n * `ContextMenu` and `Snackbar` can only open in response to an event, which\n * cannot happen during a server render, so they need nothing. `check-ssr.js`\n * asserts all of them either way.\n */\nexport const useIsClient = (): boolean => {\n const [isClient, setIsClient] = useState(false);\n\n useEffect(() => {\n setIsClient(true);\n }, []);\n\n return isClient;\n};\n"],"mappings":"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","names":["active","useEffect"]}
@@ -1,18 +1,18 @@
1
1
  import {
2
2
  CommandPalette
3
- } from "./chunk-JT4KVXJK.js";
3
+ } from "./chunk-4V2XYUQL.js";
4
4
  import {
5
5
  Menu
6
- } from "./chunk-P4XZH3OR.js";
6
+ } from "./chunk-WHQGJHMD.js";
7
7
  import {
8
8
  Avatar
9
9
  } from "./chunk-XJBWFDDE.js";
10
10
  import {
11
11
  Breadcrumb
12
- } from "./chunk-DRXPTACG.js";
12
+ } from "./chunk-26PRBZA6.js";
13
13
  import {
14
14
  IconButton
15
- } from "./chunk-75GFIQRU.js";
15
+ } from "./chunk-JY77VJAZ.js";
16
16
 
17
17
  // src/components/Toolbar/Toolbar.component.tsx
18
18
  import { jsx, jsxs } from "react/jsx-runtime";
@@ -42,4 +42,4 @@ var Toolbar = ({
42
42
  export {
43
43
  Toolbar
44
44
  };
45
- //# sourceMappingURL=chunk-SFFKQQ5Z.js.map
45
+ //# sourceMappingURL=chunk-U4SVBE2M.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  MenuPanel
3
- } from "./chunk-P4XZH3OR.js";
3
+ } from "./chunk-WHQGJHMD.js";
4
4
 
5
5
  // src/components/ContextMenu/ContextMenu.component.tsx
6
6
  import { useState, useEffect, useRef, useCallback } from "react";
@@ -103,4 +103,4 @@ var ContextMenu = ({
103
103
  export {
104
104
  ContextMenu
105
105
  };
106
- //# sourceMappingURL=chunk-O3QM3BFE.js.map
106
+ //# sourceMappingURL=chunk-UC4NYF6T.js.map
@@ -1,20 +1,20 @@
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 _chunkXZLSHEHEcjs = require('./chunk-XZLSHEHE.cjs');
3
+ var _chunkB2OHBIALcjs = require('./chunk-B2OHBIAL.cjs');
4
4
 
5
5
 
6
- var _chunk7VJCGKVPcjs = require('./chunk-7VJCGKVP.cjs');
6
+ var _chunk4HZIXRAJcjs = require('./chunk-4HZIXRAJ.cjs');
7
7
 
8
8
 
9
- var _chunkKIZVY57Hcjs = require('./chunk-KIZVY57H.cjs');
9
+ var _chunkVXC7Z7XBcjs = require('./chunk-VXC7Z7XB.cjs');
10
10
 
11
11
 
12
- var _chunkDA375AI6cjs = require('./chunk-DA375AI6.cjs');
12
+ var _chunkXPG56DLQcjs = require('./chunk-XPG56DLQ.cjs');
13
13
 
14
14
 
15
15
 
16
16
 
17
- var _chunk35LGEPLPcjs = require('./chunk-35LGEPLP.cjs');
17
+ var _chunkENMDOQQOcjs = require('./chunk-ENMDOQQO.cjs');
18
18
 
19
19
 
20
20
 
@@ -637,7 +637,7 @@ var Calendar = ({
637
637
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-calendar", children: [
638
638
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-calendar-header", children: showNavigation ? granularity === "month" ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
639
639
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
640
- _chunkDA375AI6cjs.Button,
640
+ _chunkXPG56DLQcjs.Button,
641
641
  {
642
642
  variant: "text",
643
643
  icon: _lucidereact.ChevronLeft,
@@ -646,7 +646,7 @@ var Calendar = ({
646
646
  }
647
647
  ),
648
648
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-calendar-selectors", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
649
- _chunkXZLSHEHEcjs.Select,
649
+ _chunkB2OHBIALcjs.Select,
650
650
  {
651
651
  options: yearOptions,
652
652
  value: currentDate.year().toString(),
@@ -659,7 +659,7 @@ var Calendar = ({
659
659
  }
660
660
  ) }),
661
661
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
662
- _chunkDA375AI6cjs.Button,
662
+ _chunkXPG56DLQcjs.Button,
663
663
  {
664
664
  variant: "text",
665
665
  icon: _lucidereact.ChevronRight,
@@ -669,7 +669,7 @@ var Calendar = ({
669
669
  )
670
670
  ] }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
671
671
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
672
- _chunkDA375AI6cjs.Button,
672
+ _chunkXPG56DLQcjs.Button,
673
673
  {
674
674
  variant: "text",
675
675
  icon: _lucidereact.ChevronLeft,
@@ -679,7 +679,7 @@ var Calendar = ({
679
679
  ),
680
680
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-calendar-selectors", children: [
681
681
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
682
- _chunkXZLSHEHEcjs.Select,
682
+ _chunkB2OHBIALcjs.Select,
683
683
  {
684
684
  options: monthOptions,
685
685
  value: currentDate.month().toString(),
@@ -692,7 +692,7 @@ var Calendar = ({
692
692
  }
693
693
  ),
694
694
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
695
- _chunkXZLSHEHEcjs.Select,
695
+ _chunkB2OHBIALcjs.Select,
696
696
  {
697
697
  options: yearOptions,
698
698
  value: currentDate.year().toString(),
@@ -706,7 +706,7 @@ var Calendar = ({
706
706
  )
707
707
  ] }),
708
708
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
709
- _chunkDA375AI6cjs.Button,
709
+ _chunkXPG56DLQcjs.Button,
710
710
  {
711
711
  variant: "text",
712
712
  icon: _lucidereact.ChevronRight,
@@ -808,7 +808,7 @@ var TimeInput = ({
808
808
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-time-input-inputs", children: [
809
809
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-time-input-input-group", children: [
810
810
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
811
- _chunk7VJCGKVPcjs.Input,
811
+ _chunk4HZIXRAJcjs.Input,
812
812
  {
813
813
  type: "number",
814
814
  value: hours,
@@ -825,7 +825,7 @@ var TimeInput = ({
825
825
  ] }),
826
826
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-time-input-input-group", children: [
827
827
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
828
- _chunk7VJCGKVPcjs.Input,
828
+ _chunk4HZIXRAJcjs.Input,
829
829
  {
830
830
  type: "number",
831
831
  value: minutes,
@@ -841,7 +841,7 @@ var TimeInput = ({
841
841
  includeSeconds && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-time-input-separator", children: ":" })
842
842
  ] }),
843
843
  includeSeconds && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-time-input-input-group", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
844
- _chunk7VJCGKVPcjs.Input,
844
+ _chunk4HZIXRAJcjs.Input,
845
845
  {
846
846
  type: "number",
847
847
  value: seconds,
@@ -897,14 +897,14 @@ var DatePicker = ({
897
897
  const [isOpen, setIsOpen] = _react.useState.call(void 0, false);
898
898
  const panelId = `${_react.useId.call(void 0, )}-date-panel`;
899
899
  const panelRef = _react.useRef.call(void 0, null);
900
- _chunk35LGEPLPcjs.useDialogFocus.call(void 0, isOpen, panelRef, { trapTab: false });
900
+ _chunkENMDOQQOcjs.useDialogFocus.call(void 0, isOpen, panelRef, { trapTab: false });
901
901
  const fieldRef = _react.useRef.call(void 0, null);
902
902
  _react.useEffect.call(void 0, () => {
903
903
  const element = fieldRef.current;
904
904
  if (!element) return;
905
905
  const named = (_nullishCoalesce(_optionalChain([element, 'access', _10 => _10.labels, 'optionalAccess', _11 => _11.length]), () => ( 0))) > 0 || element.hasAttribute("aria-label") || element.hasAttribute("aria-labelledby");
906
906
  if (!named) {
907
- _chunk35LGEPLPcjs.devWarn.call(void 0,
907
+ _chunkENMDOQQOcjs.devWarn.call(void 0,
908
908
  "date-picker-missing-label",
909
909
  'DatePicker: no accessible name. Pass `label` for a visible one, or `inputProps={{ "aria-label": "..." }}` where it must stay visually unlabelled - otherwise the field is announced as just "combobox". A placeholder is not a label, and disappears as soon as a date is chosen.'
910
910
  );
@@ -1189,7 +1189,7 @@ var DatePicker = ({
1189
1189
  "div",
1190
1190
  {
1191
1191
  ref: triggerRef,
1192
- className: `eidos-date-picker-trigger${fullWidth ? ` ${_chunk35LGEPLPcjs.fullWidthModifier.call(void 0, "eidos-date-picker-trigger")}` : ""}`,
1192
+ className: `eidos-date-picker-trigger${fullWidth ? ` ${_chunkENMDOQQOcjs.fullWidthModifier.call(void 0, "eidos-date-picker-trigger")}` : ""}`,
1193
1193
  onKeyDown: (event) => {
1194
1194
  if (disabled) return;
1195
1195
  if (event.key === "Enter" || event.key === " " || event.key === "ArrowDown") {
@@ -1201,7 +1201,7 @@ var DatePicker = ({
1201
1201
  }
1202
1202
  },
1203
1203
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1204
- _chunk7VJCGKVPcjs.Input,
1204
+ _chunk4HZIXRAJcjs.Input,
1205
1205
  {
1206
1206
  ref: fieldRef,
1207
1207
  value: displayValue,
@@ -1361,9 +1361,9 @@ var DatePicker = ({
1361
1361
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1362
1362
  "div",
1363
1363
  {
1364
- className: `eidos-date-picker-container${fullWidth ? ` ${_chunk35LGEPLPcjs.fullWidthModifier.call(void 0, "eidos-date-picker-container")}` : ""} ${className}`.trim(),
1364
+ className: `eidos-date-picker-container${fullWidth ? ` ${_chunkENMDOQQOcjs.fullWidthModifier.call(void 0, "eidos-date-picker-container")}` : ""} ${className}`.trim(),
1365
1365
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1366
- _chunkKIZVY57Hcjs.Dropdown,
1366
+ _chunkVXC7Z7XBcjs.Dropdown,
1367
1367
  {
1368
1368
  open: isOpen,
1369
1369
  onOpenChange: setIsOpen,
@@ -1389,4 +1389,4 @@ DatePicker.displayName = "DatePicker";
1389
1389
 
1390
1390
 
1391
1391
  exports.Calendar = Calendar; exports.TimeInput = TimeInput; exports.DatePicker = DatePicker;
1392
- //# sourceMappingURL=chunk-6JHVXWDV.cjs.map
1392
+ //# sourceMappingURL=chunk-ULKWUKD2.cjs.map