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-BEOECPVJ.cjs","../src/components/Tooltip/Tooltip.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-BEOECPVJ.cjs","sourcesContent":[null,"import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { TooltipProps, TooltipState } from './Tooltip.types';\nimport { FOCUSABLE_SELECTOR } from '../../utils';\n\n/**\n * How long the tooltip stays open after the pointer leaves, so it can be\n * moved onto the panel itself (SC 1.4.13, \"hoverable\"). Long enough to cross\n * the gap, short enough not to feel stuck.\n */\nconst HOVER_GRACE_MS = 150;\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n children,\n message,\n component: Component,\n componentProps,\n placement: preferredPlacement = 'top',\n delay = 100,\n disabled = false,\n className = '',\n triggerType = 'hover',\n closeOnClickOutside = true,\n closeOnEscape = true,\n}) => {\n const [tooltipState, setTooltipState] = useState<TooltipState>({\n isVisible: false,\n position: { top: 0, left: 0, placement: 'top' },\n isPositioned: false,\n });\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const animationFrameRef = useRef<number | undefined>(undefined);\n const isScrollingRef = useRef(false);\n\n const calculateOptimalPosition = useCallback(\n (triggerRect: DOMRect, tooltipRect: DOMRect) => {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 8;\n\n let placement: 'top' | 'bottom' | 'left' | 'right' = preferredPlacement;\n let top = 0;\n let left = 0;\n\n switch (preferredPlacement) {\n case 'top':\n top = triggerRect.top - tooltipRect.height - gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n break;\n case 'bottom':\n top = triggerRect.bottom + gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n break;\n case 'left':\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.left - tooltipRect.width - gap;\n break;\n case 'right':\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.right + gap;\n break;\n }\n\n if (placement === 'top' && top < gap) {\n placement = 'bottom';\n top = triggerRect.bottom + gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n } else if (placement === 'bottom' && top + tooltipRect.height > viewportHeight - gap) {\n placement = 'top';\n top = triggerRect.top - tooltipRect.height - gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n } else if (placement === 'left' && left < gap) {\n placement = 'right';\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.right + gap;\n } else if (placement === 'right' && left + tooltipRect.width > viewportWidth - gap) {\n placement = 'left';\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.left - tooltipRect.width - gap;\n }\n\n top = Math.max(gap, Math.min(top, viewportHeight - tooltipRect.height - gap));\n left = Math.max(gap, Math.min(left, viewportWidth - tooltipRect.width - gap));\n\n return { top, left, placement };\n },\n [preferredPlacement],\n );\n\n const handleScroll = useCallback(() => {\n if (!tooltipState.isVisible || !tooltipState.isPositioned || isScrollingRef.current) return;\n\n isScrollingRef.current = true;\n\n animationFrameRef.current = requestAnimationFrame(() => {\n if (triggerRef.current && tooltipRef.current) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, tooltipRect);\n\n setTooltipState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n\n isScrollingRef.current = false;\n });\n }, [tooltipState.isVisible, tooltipState.isPositioned, calculateOptimalPosition]);\n\n const handleMouseEnter = useCallback(() => {\n if (disabled || triggerType !== 'hover') return;\n\n // Cancels a pending hide as well as scheduling the show. Both handlers\n // are bound to the trigger *and* to the panel, so this is what catches\n // the pointer as it crosses from one to the other.\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n // Left untouched when already open. Re-entering from the panel would\n // otherwise re-run the open transition and reposition a tooltip the\n // user is in the middle of reading.\n setTooltipState((prev) =>\n prev.isVisible ? prev : { ...prev, isVisible: true, isPositioned: false },\n );\n }, delay);\n }, [disabled, delay, triggerType]);\n\n const handleMouseLeave = useCallback(() => {\n if (triggerType !== 'hover') return;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Closing is delayed, not immediate.\n //\n // SC 1.4.13 requires the pointer to be able to reach the tooltip's own\n // content. The panel is portaled and sits a few pixels off the trigger,\n // so an immediate hide made that gap impossible to cross - the tooltip\n // disappeared the moment the pointer left the trigger, however fast the\n // user moved. The grace period is what makes \"hoverable\" reachable in\n // practice.\n timeoutRef.current = setTimeout(() => {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n }, HOVER_GRACE_MS);\n }, [triggerType]);\n\n const handleClick = useCallback(() => {\n if (disabled || triggerType !== 'click') return;\n\n if (tooltipState.isVisible) {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n } else {\n if (delay > 0) {\n timeoutRef.current = setTimeout(() => {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: true,\n isPositioned: false,\n }));\n }, delay);\n } else {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: true,\n isPositioned: false,\n }));\n }\n }\n }, [disabled, triggerType, tooltipState.isVisible, delay]);\n\n const handleFocus = useCallback(() => {\n if (disabled || triggerType !== 'focus') return;\n\n timeoutRef.current = setTimeout(() => {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: true,\n isPositioned: false,\n }));\n }, delay);\n }, [disabled, triggerType, delay]);\n\n const handleBlur = useCallback(() => {\n if (triggerType !== 'focus') return;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n }, [triggerType]);\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (!closeOnClickOutside || !tooltipState.isVisible || triggerType !== 'click') return;\n\n const target = event.target as Node;\n\n if (tooltipRef.current?.contains(target) || triggerRef.current?.contains(target)) {\n return;\n }\n\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n },\n [closeOnClickOutside, tooltipState.isVisible, triggerType],\n );\n\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n // Every trigger type, not just `click`.\n //\n // SC 1.4.13 requires content shown on hover *or focus* to be\n // dismissible without moving the pointer or focus - and `hover` is the\n // default, so the one configuration that could be dismissed was the\n // one least likely to be used. A tooltip covering the text you are\n // trying to read had to be escaped by physically moving the mouse.\n if (closeOnEscape && event.key === 'Escape' && tooltipState.isVisible) {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n }\n },\n [closeOnEscape, tooltipState.isVisible],\n );\n\n useEffect(() => {\n if (\n tooltipState.isVisible &&\n !tooltipState.isPositioned &&\n tooltipRef.current &&\n triggerRef.current\n ) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, tooltipRect);\n\n setTooltipState((prev) => ({\n ...prev,\n position: { top, left, placement },\n isPositioned: true,\n }));\n }\n }, [tooltipState.isVisible, tooltipState.isPositioned, calculateOptimalPosition]);\n\n useEffect(() => {\n const handleResize = () => {\n if (\n tooltipState.isVisible &&\n tooltipState.isPositioned &&\n tooltipRef.current &&\n triggerRef.current\n ) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, tooltipRect);\n\n setTooltipState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [tooltipState.isVisible, tooltipState.isPositioned, calculateOptimalPosition]);\n\n useEffect(() => {\n if (tooltipState.isVisible) {\n // Capture phase on `document` - see the note in `Dropdown`. `scroll` does\n // not bubble, so listeners on `window`/`document.body` miss every\n // ancestor scroll container and the portaled tooltip detaches from its\n // trigger.\n document.addEventListener('scroll', handleScroll, { capture: true, passive: true });\n }\n\n return () => {\n document.removeEventListener('scroll', handleScroll, { capture: true });\n };\n }, [tooltipState.isVisible, handleScroll]);\n\n // Click-outside is only meaningful for a click-triggered tooltip; Escape\n // is not. Registering them together meant a hover tooltip had no way to be\n // dismissed from the keyboard at all (SC 1.4.13, \"dismissible\") - and\n // `hover` is the default, so the failing case was the common one.\n useEffect(() => {\n if (tooltipState.isVisible && triggerType === 'click') {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [tooltipState.isVisible, triggerType, handleClickOutside]);\n\n useEffect(() => {\n if (tooltipState.isVisible) {\n document.addEventListener('keydown', handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [tooltipState.isVisible, handleEscapeKey]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n };\n }, []);\n\n const renderTooltipContent = () => {\n if (message) {\n return <span className=\"eidos-tooltip-message\">{message}</span>;\n }\n if (Component) {\n return <Component {...(componentProps || {})} />;\n }\n return null;\n };\n\n // Whether the trigger wrapper has to become focusable itself, i.e. whether\n // the consumer's child is not already a control. Measured from the DOM\n // rather than guessed from the node type, because `children` is an\n // arbitrary `ReactNode` and the control may be nested inside it.\n const [triggerNeedsFocus, setTriggerNeedsFocus] = useState(false);\n\n useEffect(() => {\n const el = triggerRef.current;\n setTriggerNeedsFocus(!!el && el.querySelector(FOCUSABLE_SELECTOR) === null);\n }, [children, triggerType]);\n\n const getTriggerProps = () => {\n const props: Record<string, unknown> = {\n ref: triggerRef,\n className: 'eidos-tooltip-trigger',\n };\n\n switch (triggerType) {\n case 'hover':\n props.onMouseEnter = handleMouseEnter;\n props.onMouseLeave = handleMouseLeave;\n break;\n case 'click':\n props.onClick = handleClick;\n // Only when the trigger has no control of its own. Making this\n // wrapper a button unconditionally put a button inside a button\n // whenever the child was one - which is the common case, since\n // `Button` wraps *itself* in a Tooltip when given `tooltip`. That is\n // invalid (`nested-interactive`) and gives one action two tab stops.\n if (triggerNeedsFocus) {\n props.role = 'button';\n props.tabIndex = 0;\n props.onKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleClick();\n }\n };\n }\n break;\n case 'focus':\n props.onFocus = handleFocus;\n props.onBlur = handleBlur;\n // Same reasoning: a focusable child already receives the focus that\n // opens the tooltip, and adding `tabIndex` here would just add a\n // second stop in front of it.\n if (triggerNeedsFocus) props.tabIndex = 0;\n break;\n }\n\n return props;\n };\n\n return (\n <>\n <div {...getTriggerProps()}>{children}</div>\n {tooltipState.isVisible &&\n createPortal(\n <div\n ref={tooltipRef}\n // SC 1.4.13 \"hoverable\": the pointer has to be able to reach the\n // tooltip's own content - to read a long message, or select text\n // from it - without it vanishing. The panel used to be\n // `pointer-events: none`, so moving towards it dismissed it.\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={`eidos-tooltip eidos-tooltip--${tooltipState.position.placement} ${className}`}\n style={{\n top: tooltipState.position.top,\n left: tooltipState.position.left,\n }}\n data-state={tooltipState.isPositioned ? 'entered' : 'entering'}\n role=\"tooltip\"\n >\n {renderTooltipContent()}\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nTooltip.displayName = 'Tooltip';\n"]}
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-UTYY35QX.cjs","../src/components/Tooltip/Tooltip.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-UTYY35QX.cjs","sourcesContent":[null,"import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { TooltipProps, TooltipState } from './Tooltip.types';\nimport { FOCUSABLE_SELECTOR } from '../../utils';\n\n/**\n * How long the tooltip stays open after the pointer leaves, so it can be\n * moved onto the panel itself (SC 1.4.13, \"hoverable\"). Long enough to cross\n * the gap, short enough not to feel stuck.\n */\nconst HOVER_GRACE_MS = 150;\n\nexport const Tooltip: React.FC<TooltipProps> = ({\n children,\n message,\n component: Component,\n componentProps,\n placement: preferredPlacement = 'top',\n delay = 100,\n disabled = false,\n className = '',\n triggerType = 'hover',\n closeOnClickOutside = true,\n closeOnEscape = true,\n}) => {\n const [tooltipState, setTooltipState] = useState<TooltipState>({\n isVisible: false,\n position: { top: 0, left: 0, placement: 'top' },\n isPositioned: false,\n });\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const animationFrameRef = useRef<number | undefined>(undefined);\n const isScrollingRef = useRef(false);\n\n const calculateOptimalPosition = useCallback(\n (triggerRect: DOMRect, tooltipRect: DOMRect) => {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 8;\n\n let placement: 'top' | 'bottom' | 'left' | 'right' = preferredPlacement;\n let top = 0;\n let left = 0;\n\n switch (preferredPlacement) {\n case 'top':\n top = triggerRect.top - tooltipRect.height - gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n break;\n case 'bottom':\n top = triggerRect.bottom + gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n break;\n case 'left':\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.left - tooltipRect.width - gap;\n break;\n case 'right':\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.right + gap;\n break;\n }\n\n if (placement === 'top' && top < gap) {\n placement = 'bottom';\n top = triggerRect.bottom + gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n } else if (placement === 'bottom' && top + tooltipRect.height > viewportHeight - gap) {\n placement = 'top';\n top = triggerRect.top - tooltipRect.height - gap;\n left = triggerRect.left + triggerRect.width / 2 - tooltipRect.width / 2;\n } else if (placement === 'left' && left < gap) {\n placement = 'right';\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.right + gap;\n } else if (placement === 'right' && left + tooltipRect.width > viewportWidth - gap) {\n placement = 'left';\n top = triggerRect.top + triggerRect.height / 2 - tooltipRect.height / 2;\n left = triggerRect.left - tooltipRect.width - gap;\n }\n\n top = Math.max(gap, Math.min(top, viewportHeight - tooltipRect.height - gap));\n left = Math.max(gap, Math.min(left, viewportWidth - tooltipRect.width - gap));\n\n return { top, left, placement };\n },\n [preferredPlacement],\n );\n\n const handleScroll = useCallback(() => {\n if (!tooltipState.isVisible || !tooltipState.isPositioned || isScrollingRef.current) return;\n\n isScrollingRef.current = true;\n\n animationFrameRef.current = requestAnimationFrame(() => {\n if (triggerRef.current && tooltipRef.current) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, tooltipRect);\n\n setTooltipState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n\n isScrollingRef.current = false;\n });\n }, [tooltipState.isVisible, tooltipState.isPositioned, calculateOptimalPosition]);\n\n const handleMouseEnter = useCallback(() => {\n if (disabled || triggerType !== 'hover') return;\n\n // Cancels a pending hide as well as scheduling the show. Both handlers\n // are bound to the trigger *and* to the panel, so this is what catches\n // the pointer as it crosses from one to the other.\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n // Left untouched when already open. Re-entering from the panel would\n // otherwise re-run the open transition and reposition a tooltip the\n // user is in the middle of reading.\n setTooltipState((prev) =>\n prev.isVisible ? prev : { ...prev, isVisible: true, isPositioned: false },\n );\n }, delay);\n }, [disabled, delay, triggerType]);\n\n const handleMouseLeave = useCallback(() => {\n if (triggerType !== 'hover') return;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n // Closing is delayed, not immediate.\n //\n // SC 1.4.13 requires the pointer to be able to reach the tooltip's own\n // content. The panel is portaled and sits a few pixels off the trigger,\n // so an immediate hide made that gap impossible to cross - the tooltip\n // disappeared the moment the pointer left the trigger, however fast the\n // user moved. The grace period is what makes \"hoverable\" reachable in\n // practice.\n timeoutRef.current = setTimeout(() => {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n }, HOVER_GRACE_MS);\n }, [triggerType]);\n\n const handleClick = useCallback(() => {\n if (disabled || triggerType !== 'click') return;\n\n if (tooltipState.isVisible) {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n } else {\n if (delay > 0) {\n timeoutRef.current = setTimeout(() => {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: true,\n isPositioned: false,\n }));\n }, delay);\n } else {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: true,\n isPositioned: false,\n }));\n }\n }\n }, [disabled, triggerType, tooltipState.isVisible, delay]);\n\n const handleFocus = useCallback(() => {\n if (disabled || triggerType !== 'focus') return;\n\n timeoutRef.current = setTimeout(() => {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: true,\n isPositioned: false,\n }));\n }, delay);\n }, [disabled, triggerType, delay]);\n\n const handleBlur = useCallback(() => {\n if (triggerType !== 'focus') return;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n }, [triggerType]);\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (!closeOnClickOutside || !tooltipState.isVisible || triggerType !== 'click') return;\n\n const target = event.target as Node;\n\n if (tooltipRef.current?.contains(target) || triggerRef.current?.contains(target)) {\n return;\n }\n\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n },\n [closeOnClickOutside, tooltipState.isVisible, triggerType],\n );\n\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n // Every trigger type, not just `click`.\n //\n // SC 1.4.13 requires content shown on hover *or focus* to be\n // dismissible without moving the pointer or focus - and `hover` is the\n // default, so the one configuration that could be dismissed was the\n // one least likely to be used. A tooltip covering the text you are\n // trying to read had to be escaped by physically moving the mouse.\n if (closeOnEscape && event.key === 'Escape' && tooltipState.isVisible) {\n setTooltipState((prev) => ({\n ...prev,\n isVisible: false,\n isPositioned: false,\n }));\n }\n },\n [closeOnEscape, tooltipState.isVisible],\n );\n\n useEffect(() => {\n if (\n tooltipState.isVisible &&\n !tooltipState.isPositioned &&\n tooltipRef.current &&\n triggerRef.current\n ) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, tooltipRect);\n\n setTooltipState((prev) => ({\n ...prev,\n position: { top, left, placement },\n isPositioned: true,\n }));\n }\n }, [tooltipState.isVisible, tooltipState.isPositioned, calculateOptimalPosition]);\n\n useEffect(() => {\n const handleResize = () => {\n if (\n tooltipState.isVisible &&\n tooltipState.isPositioned &&\n tooltipRef.current &&\n triggerRef.current\n ) {\n const triggerRect = triggerRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, tooltipRect);\n\n setTooltipState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [tooltipState.isVisible, tooltipState.isPositioned, calculateOptimalPosition]);\n\n useEffect(() => {\n if (tooltipState.isVisible) {\n // Capture phase on `document` - see the note in `Dropdown`. `scroll` does\n // not bubble, so listeners on `window`/`document.body` miss every\n // ancestor scroll container and the portaled tooltip detaches from its\n // trigger.\n document.addEventListener('scroll', handleScroll, { capture: true, passive: true });\n }\n\n return () => {\n document.removeEventListener('scroll', handleScroll, { capture: true });\n };\n }, [tooltipState.isVisible, handleScroll]);\n\n // Click-outside is only meaningful for a click-triggered tooltip; Escape\n // is not. Registering them together meant a hover tooltip had no way to be\n // dismissed from the keyboard at all (SC 1.4.13, \"dismissible\") - and\n // `hover` is the default, so the failing case was the common one.\n useEffect(() => {\n if (tooltipState.isVisible && triggerType === 'click') {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [tooltipState.isVisible, triggerType, handleClickOutside]);\n\n useEffect(() => {\n if (tooltipState.isVisible) {\n document.addEventListener('keydown', handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [tooltipState.isVisible, handleEscapeKey]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n };\n }, []);\n\n const renderTooltipContent = () => {\n if (message) {\n return <span className=\"eidos-tooltip-message\">{message}</span>;\n }\n if (Component) {\n return <Component {...(componentProps || {})} />;\n }\n return null;\n };\n\n // Whether the trigger wrapper has to become focusable itself, i.e. whether\n // the consumer's child is not already a control. Measured from the DOM\n // rather than guessed from the node type, because `children` is an\n // arbitrary `ReactNode` and the control may be nested inside it.\n const [triggerNeedsFocus, setTriggerNeedsFocus] = useState(false);\n\n useEffect(() => {\n const el = triggerRef.current;\n setTriggerNeedsFocus(!!el && el.querySelector(FOCUSABLE_SELECTOR) === null);\n }, [children, triggerType]);\n\n const getTriggerProps = () => {\n const props: Record<string, unknown> = {\n ref: triggerRef,\n className: 'eidos-tooltip-trigger',\n };\n\n switch (triggerType) {\n case 'hover':\n props.onMouseEnter = handleMouseEnter;\n props.onMouseLeave = handleMouseLeave;\n break;\n case 'click':\n props.onClick = handleClick;\n // Only when the trigger has no control of its own. Making this\n // wrapper a button unconditionally put a button inside a button\n // whenever the child was one - which is the common case, since\n // `Button` wraps *itself* in a Tooltip when given `tooltip`. That is\n // invalid (`nested-interactive`) and gives one action two tab stops.\n if (triggerNeedsFocus) {\n props.role = 'button';\n props.tabIndex = 0;\n props.onKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n handleClick();\n }\n };\n }\n break;\n case 'focus':\n props.onFocus = handleFocus;\n props.onBlur = handleBlur;\n // Same reasoning: a focusable child already receives the focus that\n // opens the tooltip, and adding `tabIndex` here would just add a\n // second stop in front of it.\n if (triggerNeedsFocus) props.tabIndex = 0;\n break;\n }\n\n return props;\n };\n\n return (\n <>\n <div {...getTriggerProps()}>{children}</div>\n {tooltipState.isVisible &&\n createPortal(\n <div\n ref={tooltipRef}\n // SC 1.4.13 \"hoverable\": the pointer has to be able to reach the\n // tooltip's own content - to read a long message, or select text\n // from it - without it vanishing. The panel used to be\n // `pointer-events: none`, so moving towards it dismissed it.\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n className={`eidos-tooltip eidos-tooltip--${tooltipState.position.placement} ${className}`}\n style={{\n top: tooltipState.position.top,\n left: tooltipState.position.left,\n }}\n data-state={tooltipState.isPositioned ? 'entered' : 'entering'}\n role=\"tooltip\"\n >\n {renderTooltipContent()}\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nTooltip.displayName = 'Tooltip';\n"]}
@@ -1,10 +1,10 @@
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 _chunkBEOECPVJcjs = require('./chunk-BEOECPVJ.cjs');
3
+ var _chunkUTYY35QXcjs = require('./chunk-UTYY35QX.cjs');
4
4
 
5
5
 
6
6
 
7
- var _chunk35LGEPLPcjs = require('./chunk-35LGEPLP.cjs');
7
+ var _chunkENMDOQQOcjs = require('./chunk-ENMDOQQO.cjs');
8
8
 
9
9
  // src/components/Textarea/Textarea.component.tsx
10
10
  var _react = require('react');
@@ -49,7 +49,7 @@ var Textarea = _react.forwardRef.call(void 0,
49
49
  };
50
50
  const containerClasses = [
51
51
  "eidos-textarea-container",
52
- fullWidth && _chunk35LGEPLPcjs.fullWidthModifier.call(void 0, "eidos-textarea-container"),
52
+ fullWidth && _chunkENMDOQQOcjs.fullWidthModifier.call(void 0, "eidos-textarea-container"),
53
53
  className
54
54
  ].filter(Boolean).join(" ");
55
55
  const wrapperClasses = [
@@ -57,7 +57,7 @@ var Textarea = _react.forwardRef.call(void 0,
57
57
  `eidos-textarea-wrapper--${variant}`,
58
58
  `eidos-textarea-wrapper--${color}`,
59
59
  `eidos-textarea-wrapper--${size}`,
60
- fullWidth && _chunk35LGEPLPcjs.fullWidthModifier.call(void 0, "eidos-textarea-wrapper"),
60
+ fullWidth && _chunkENMDOQQOcjs.fullWidthModifier.call(void 0, "eidos-textarea-wrapper"),
61
61
  loading && "eidos-textarea-wrapper--loading",
62
62
  isFocused && "eidos-textarea-wrapper--focused",
63
63
  error && "eidos-textarea-wrapper--error"
@@ -68,7 +68,7 @@ var Textarea = _react.forwardRef.call(void 0,
68
68
  `eidos-textarea--${color}`,
69
69
  `eidos-textarea--${size}`,
70
70
  `eidos-textarea--resize-${resize}`,
71
- fullWidth && _chunk35LGEPLPcjs.fullWidthModifier.call(void 0, "eidos-textarea"),
71
+ fullWidth && _chunkENMDOQQOcjs.fullWidthModifier.call(void 0, "eidos-textarea"),
72
72
  loading && "eidos-textarea--loading",
73
73
  error && "eidos-textarea--error"
74
74
  ].filter(Boolean).join(" ");
@@ -82,7 +82,7 @@ var Textarea = _react.forwardRef.call(void 0,
82
82
  label && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "label", { htmlFor: textareaId, className: labelClasses, children: [
83
83
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-label-text", children: label }),
84
84
  isRequired && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-required-asterisk", children: "*" }),
85
- disclaimerIcon && (disclaimerContent ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBEOECPVJcjs.Tooltip, { message: disclaimerContent, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-disclaimer-icon", children: _chunk35LGEPLPcjs.renderIcon.call(void 0, disclaimerIcon, "eidos-textarea-disclaimer-icon-svg") }) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-disclaimer-icon", children: _chunk35LGEPLPcjs.renderIcon.call(void 0, disclaimerIcon, "eidos-textarea-disclaimer-icon-svg") }))
85
+ disclaimerIcon && (disclaimerContent ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkUTYY35QXcjs.Tooltip, { message: disclaimerContent, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-disclaimer-icon", children: _chunkENMDOQQOcjs.renderIcon.call(void 0, disclaimerIcon, "eidos-textarea-disclaimer-icon-svg") }) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-disclaimer-icon", children: _chunkENMDOQQOcjs.renderIcon.call(void 0, disclaimerIcon, "eidos-textarea-disclaimer-icon-svg") }))
86
86
  ] }),
87
87
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: wrapperClasses, children: [
88
88
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
@@ -127,4 +127,4 @@ Textarea.displayName = "Textarea";
127
127
 
128
128
 
129
129
  exports.Textarea = Textarea;
130
- //# sourceMappingURL=chunk-7BFODYNL.cjs.map
130
+ //# sourceMappingURL=chunk-UUT2VEN5.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-7BFODYNL.cjs","../src/components/Textarea/Textarea.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;ACRA,8BAAmD;AACnD,2CAA4B;AA8GlB,+CAAA;AAzGH,IAAM,SAAA,EAAW,+BAAA;AAAA,EACtB,CACE;AAAA,IACE,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,EAAA;AAAA,IACZ,UAAA,EAAY,KAAA;AAAA,IACZ,KAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,KAAA;AAAA,IACZ,SAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAG;AAAA,EACL,CAAA,EACA,GAAA,EAAA,GACG;AACH,IAAA,MAAM,YAAA,EAAc,0BAAA,CAAM;AAC1B,IAAA,MAAM,WAAA,EAAa,GAAA,GAAM,CAAA,SAAA,EAAY,WAAW,CAAA,CAAA;AAKnB,IAAA;AAKkB,IAAA;AAGE,IAAA;AACJ,IAAA;AACG,IAAA;AAEZ,IAAA;AAGS,IAAA;AAGvB,IAAA;AAE8C,IAAA;AAC/C,MAAA;AACW,QAAA;AAC9B,MAAA;AAC8B,sBAAA;AAChC,IAAA;AAIyB,IAAA;AACvB,MAAA;AAC+B,MAAA;AAC/B,MAAA;AAGS,IAAA;AAEY,IAAA;AACrB,MAAA;AACkC,MAAA;AACF,MAAA;AACD,MAAA;AACA,MAAA;AACpB,MAAA;AACE,MAAA;AACJ,MAAA;AAGA,IAAA;AAEa,IAAA;AACtB,MAAA;AAC0B,MAAA;AACF,MAAA;AACD,MAAA;AACS,MAAA;AACe,MAAA;AACpC,MAAA;AACF,MAAA;AAGA,IAAA;AAEU,IAAA;AACnB,MAAA;AACoB,MAAA;AACF,MAAA;AACT,MAAA;AAGA,IAAA;AAGO,IAAA;AAEL,MAAA;AACW,wBAAA;AACK,QAAA;AAGjB,QAAA;AAUN,MAAA;AAGc,sBAAA;AACd,wBAAA;AAAC,UAAA;AAAA,UAAA;AACC,YAAA;AACI,YAAA;AACO,YAAA;AACkB,YAAA;AACO,YAAA;AACpC,YAAA;AACA,YAAA;AACsB,YAAA;AAClB,YAAA;AACG,YAAA;AACS,YAAA;AACG,cAAA;AACY,8BAAA;AAC/B,YAAA;AACe,YAAA;AACK,cAAA;AACU,8BAAA;AAC9B,YAAA;AACU,YAAA;AAAA,UAAA;AACZ,QAAA;AAGE,QAAA;AAC8B,UAAA;AAAO,UAAA;AAAE,UAAA;AACvC,QAAA;AAEJ,MAAA;AAGW,MAAA;AACM,wBAAA;AACN,wBAAA;AACT,MAAA;AAEJ,IAAA;AAEJ,EAAA;AACF;AAEuB;AD7C8B;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-7BFODYNL.cjs","sourcesContent":[null,"import React, { forwardRef, useState, useId } from 'react';\nimport { CircleAlert } from 'lucide-react';\nimport { renderIcon, fullWidthModifier } from '../../utils';\nimport type { TextareaProps } from './Textarea.types';\nimport { Tooltip } from '../Tooltip/Tooltip.component';\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n variant = 'filled',\n color = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n className = '',\n fullWidth = false,\n label,\n error,\n disclaimerIcon,\n disclaimerContent,\n required,\n rows = 4,\n resize = 'vertical',\n showCount = false,\n maxLength,\n id,\n ...textareaProps\n },\n ref,\n ) => {\n const generatedId = useId();\n const textareaId = id || `textarea-${generatedId}`;\n // Associates the visible error with the control. Without it the message\n // is just a red line of text sitting near the field - obvious to look\n // at, absent from the accessibility tree (SC 3.3.1). See the fuller\n // note in `Input`.\n const errorId = `${textareaId}-error`;\n\n // Extract defaultValue so it never reaches the native <textarea> alongside `value`.\n // Same reasoning as Input: we always set value={currentValue}, so having defaultValue\n // in the spread as well triggers React's controlled/uncontrolled warning.\n const { defaultValue, ...restTextareaProps } = textareaProps;\n\n // Determine if using controlled or uncontrolled mode\n const isControlled = restTextareaProps.value !== undefined;\n const [localValue, setLocalValue] = useState(defaultValue != null ? String(defaultValue) : '');\n const [isFocused, setIsFocused] = useState(false);\n\n const currentValue = isControlled ? restTextareaProps.value : localValue;\n\n // Label floats when the field has content (same logic as Input)\n const shouldFloatLabel = Boolean(currentValue) || Boolean(defaultValue);\n\n const isRequired =\n required || Boolean('required' in restTextareaProps && restTextareaProps.required);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setLocalValue(e.target.value);\n }\n restTextareaProps.onChange?.(e);\n };\n\n // ── Class lists ──────────────────────────────────────────────────────────\n\n const containerClasses = [\n 'eidos-textarea-container',\n fullWidth && fullWidthModifier('eidos-textarea-container'),\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const wrapperClasses = [\n 'eidos-textarea-wrapper',\n `eidos-textarea-wrapper--${variant}`,\n `eidos-textarea-wrapper--${color}`,\n `eidos-textarea-wrapper--${size}`,\n fullWidth && fullWidthModifier('eidos-textarea-wrapper'),\n loading && 'eidos-textarea-wrapper--loading',\n isFocused && 'eidos-textarea-wrapper--focused',\n error && 'eidos-textarea-wrapper--error',\n ]\n .filter(Boolean)\n .join(' ');\n\n const textareaClasses = [\n 'eidos-textarea',\n `eidos-textarea--${variant}`,\n `eidos-textarea--${color}`,\n `eidos-textarea--${size}`,\n `eidos-textarea--resize-${resize}`,\n fullWidth && fullWidthModifier('eidos-textarea'),\n loading && 'eidos-textarea--loading',\n error && 'eidos-textarea--error',\n ]\n .filter(Boolean)\n .join(' ');\n\n const labelClasses = [\n 'eidos-textarea-label',\n shouldFloatLabel && 'eidos-textarea-label--floating',\n disclaimerIcon && 'eidos-textarea-label--with-icon',\n error && 'eidos-textarea-label--error',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={containerClasses}>\n {label && (\n <label htmlFor={textareaId} className={labelClasses}>\n <span className=\"eidos-textarea-label-text\">{label}</span>\n {isRequired && <span className=\"eidos-textarea-required-asterisk\">*</span>}\n {disclaimerIcon &&\n (disclaimerContent ? (\n <Tooltip message={disclaimerContent}>\n <span className=\"eidos-textarea-disclaimer-icon\">\n {renderIcon(disclaimerIcon, 'eidos-textarea-disclaimer-icon-svg')}\n </span>\n </Tooltip>\n ) : (\n <span className=\"eidos-textarea-disclaimer-icon\">\n {renderIcon(disclaimerIcon, 'eidos-textarea-disclaimer-icon-svg')}\n </span>\n ))}\n </label>\n )}\n\n <div className={wrapperClasses}>\n <textarea\n ref={ref}\n id={textareaId}\n className={textareaClasses}\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? errorId : undefined}\n rows={rows}\n maxLength={maxLength}\n disabled={disabled || loading}\n {...restTextareaProps}\n value={currentValue}\n onFocus={(e) => {\n setIsFocused(true);\n restTextareaProps.onFocus?.(e);\n }}\n onBlur={(e) => {\n setIsFocused(false);\n restTextareaProps.onBlur?.(e);\n }}\n onChange={handleChange}\n />\n\n {showCount && maxLength && (\n <span className=\"eidos-textarea-count\">\n {String(currentValue ?? '').length}/{maxLength}\n </span>\n )}\n </div>\n\n {error && (\n <div id={errorId} className=\"eidos-textarea-error-message\">\n <CircleAlert className=\"eidos-textarea-error-icon\" />\n <span>{error}</span>\n </div>\n )}\n </div>\n );\n },\n);\n\nTextarea.displayName = 'Textarea';\n"]}
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-UUT2VEN5.cjs","../src/components/Textarea/Textarea.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;ACRA,8BAAmD;AACnD,2CAA4B;AA8GlB,+CAAA;AAzGH,IAAM,SAAA,EAAW,+BAAA;AAAA,EACtB,CACE;AAAA,IACE,QAAA,EAAU,QAAA;AAAA,IACV,MAAA,EAAQ,SAAA;AAAA,IACR,KAAA,EAAO,IAAA;AAAA,IACP,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,EAAA;AAAA,IACZ,UAAA,EAAY,KAAA;AAAA,IACZ,KAAA;AAAA,IACA,KAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,CAAA;AAAA,IACP,OAAA,EAAS,UAAA;AAAA,IACT,UAAA,EAAY,KAAA;AAAA,IACZ,SAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAG;AAAA,EACL,CAAA,EACA,GAAA,EAAA,GACG;AACH,IAAA,MAAM,YAAA,EAAc,0BAAA,CAAM;AAC1B,IAAA,MAAM,WAAA,EAAa,GAAA,GAAM,CAAA,SAAA,EAAY,WAAW,CAAA,CAAA;AAKnB,IAAA;AAKkB,IAAA;AAGE,IAAA;AACJ,IAAA;AACG,IAAA;AAEZ,IAAA;AAGS,IAAA;AAGvB,IAAA;AAE8C,IAAA;AAC/C,MAAA;AACW,QAAA;AAC9B,MAAA;AAC8B,sBAAA;AAChC,IAAA;AAIyB,IAAA;AACvB,MAAA;AAC+B,MAAA;AAC/B,MAAA;AAGS,IAAA;AAEY,IAAA;AACrB,MAAA;AACkC,MAAA;AACF,MAAA;AACD,MAAA;AACA,MAAA;AACpB,MAAA;AACE,MAAA;AACJ,MAAA;AAGA,IAAA;AAEa,IAAA;AACtB,MAAA;AAC0B,MAAA;AACF,MAAA;AACD,MAAA;AACS,MAAA;AACe,MAAA;AACpC,MAAA;AACF,MAAA;AAGA,IAAA;AAEU,IAAA;AACnB,MAAA;AACoB,MAAA;AACF,MAAA;AACT,MAAA;AAGA,IAAA;AAGO,IAAA;AAEL,MAAA;AACW,wBAAA;AACK,QAAA;AAGjB,QAAA;AAUN,MAAA;AAGc,sBAAA;AACd,wBAAA;AAAC,UAAA;AAAA,UAAA;AACC,YAAA;AACI,YAAA;AACO,YAAA;AACkB,YAAA;AACO,YAAA;AACpC,YAAA;AACA,YAAA;AACsB,YAAA;AAClB,YAAA;AACG,YAAA;AACS,YAAA;AACG,cAAA;AACY,8BAAA;AAC/B,YAAA;AACe,YAAA;AACK,cAAA;AACU,8BAAA;AAC9B,YAAA;AACU,YAAA;AAAA,UAAA;AACZ,QAAA;AAGE,QAAA;AAC8B,UAAA;AAAO,UAAA;AAAE,UAAA;AACvC,QAAA;AAEJ,MAAA;AAGW,MAAA;AACM,wBAAA;AACN,wBAAA;AACT,MAAA;AAEJ,IAAA;AAEJ,EAAA;AACF;AAEuB;AD7C8B;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-UUT2VEN5.cjs","sourcesContent":[null,"import React, { forwardRef, useState, useId } from 'react';\nimport { CircleAlert } from 'lucide-react';\nimport { renderIcon, fullWidthModifier } from '../../utils';\nimport type { TextareaProps } from './Textarea.types';\nimport { Tooltip } from '../Tooltip/Tooltip.component';\n\nexport const Textarea = forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n variant = 'filled',\n color = 'primary',\n size = 'md',\n disabled = false,\n loading = false,\n className = '',\n fullWidth = false,\n label,\n error,\n disclaimerIcon,\n disclaimerContent,\n required,\n rows = 4,\n resize = 'vertical',\n showCount = false,\n maxLength,\n id,\n ...textareaProps\n },\n ref,\n ) => {\n const generatedId = useId();\n const textareaId = id || `textarea-${generatedId}`;\n // Associates the visible error with the control. Without it the message\n // is just a red line of text sitting near the field - obvious to look\n // at, absent from the accessibility tree (SC 3.3.1). See the fuller\n // note in `Input`.\n const errorId = `${textareaId}-error`;\n\n // Extract defaultValue so it never reaches the native <textarea> alongside `value`.\n // Same reasoning as Input: we always set value={currentValue}, so having defaultValue\n // in the spread as well triggers React's controlled/uncontrolled warning.\n const { defaultValue, ...restTextareaProps } = textareaProps;\n\n // Determine if using controlled or uncontrolled mode\n const isControlled = restTextareaProps.value !== undefined;\n const [localValue, setLocalValue] = useState(defaultValue != null ? String(defaultValue) : '');\n const [isFocused, setIsFocused] = useState(false);\n\n const currentValue = isControlled ? restTextareaProps.value : localValue;\n\n // Label floats when the field has content (same logic as Input)\n const shouldFloatLabel = Boolean(currentValue) || Boolean(defaultValue);\n\n const isRequired =\n required || Boolean('required' in restTextareaProps && restTextareaProps.required);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n if (!isControlled) {\n setLocalValue(e.target.value);\n }\n restTextareaProps.onChange?.(e);\n };\n\n // ── Class lists ──────────────────────────────────────────────────────────\n\n const containerClasses = [\n 'eidos-textarea-container',\n fullWidth && fullWidthModifier('eidos-textarea-container'),\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const wrapperClasses = [\n 'eidos-textarea-wrapper',\n `eidos-textarea-wrapper--${variant}`,\n `eidos-textarea-wrapper--${color}`,\n `eidos-textarea-wrapper--${size}`,\n fullWidth && fullWidthModifier('eidos-textarea-wrapper'),\n loading && 'eidos-textarea-wrapper--loading',\n isFocused && 'eidos-textarea-wrapper--focused',\n error && 'eidos-textarea-wrapper--error',\n ]\n .filter(Boolean)\n .join(' ');\n\n const textareaClasses = [\n 'eidos-textarea',\n `eidos-textarea--${variant}`,\n `eidos-textarea--${color}`,\n `eidos-textarea--${size}`,\n `eidos-textarea--resize-${resize}`,\n fullWidth && fullWidthModifier('eidos-textarea'),\n loading && 'eidos-textarea--loading',\n error && 'eidos-textarea--error',\n ]\n .filter(Boolean)\n .join(' ');\n\n const labelClasses = [\n 'eidos-textarea-label',\n shouldFloatLabel && 'eidos-textarea-label--floating',\n disclaimerIcon && 'eidos-textarea-label--with-icon',\n error && 'eidos-textarea-label--error',\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={containerClasses}>\n {label && (\n <label htmlFor={textareaId} className={labelClasses}>\n <span className=\"eidos-textarea-label-text\">{label}</span>\n {isRequired && <span className=\"eidos-textarea-required-asterisk\">*</span>}\n {disclaimerIcon &&\n (disclaimerContent ? (\n <Tooltip message={disclaimerContent}>\n <span className=\"eidos-textarea-disclaimer-icon\">\n {renderIcon(disclaimerIcon, 'eidos-textarea-disclaimer-icon-svg')}\n </span>\n </Tooltip>\n ) : (\n <span className=\"eidos-textarea-disclaimer-icon\">\n {renderIcon(disclaimerIcon, 'eidos-textarea-disclaimer-icon-svg')}\n </span>\n ))}\n </label>\n )}\n\n <div className={wrapperClasses}>\n <textarea\n ref={ref}\n id={textareaId}\n className={textareaClasses}\n aria-invalid={error ? true : undefined}\n aria-describedby={error ? errorId : undefined}\n rows={rows}\n maxLength={maxLength}\n disabled={disabled || loading}\n {...restTextareaProps}\n value={currentValue}\n onFocus={(e) => {\n setIsFocused(true);\n restTextareaProps.onFocus?.(e);\n }}\n onBlur={(e) => {\n setIsFocused(false);\n restTextareaProps.onBlur?.(e);\n }}\n onChange={handleChange}\n />\n\n {showCount && maxLength && (\n <span className=\"eidos-textarea-count\">\n {String(currentValue ?? '').length}/{maxLength}\n </span>\n )}\n </div>\n\n {error && (\n <div id={errorId} className=\"eidos-textarea-error-message\">\n <CircleAlert className=\"eidos-textarea-error-icon\" />\n <span>{error}</span>\n </div>\n )}\n </div>\n );\n },\n);\n\nTextarea.displayName = 'Textarea';\n"]}
@@ -0,0 +1,21 @@
1
+ // src/utils/iconRegistry.ts
2
+ var REGISTRY_KEY = /* @__PURE__ */ Symbol.for("eidos-ui.icon-registry");
3
+ var registry = () => {
4
+ const scope = globalThis;
5
+ return scope[REGISTRY_KEY] ?? (scope[REGISTRY_KEY] = /* @__PURE__ */ new Map());
6
+ };
7
+ var toIconKey = (name) => name.split("-").map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
8
+ var registerIcons = (icons) => {
9
+ const target = registry();
10
+ for (const [name, component] of Object.entries(icons)) {
11
+ target.set(toIconKey(name), component);
12
+ }
13
+ };
14
+ var resolveRegisteredIcon = (name) => registry().get(toIconKey(name));
15
+
16
+ export {
17
+ toIconKey,
18
+ registerIcons,
19
+ resolveRegisteredIcon
20
+ };
21
+ //# sourceMappingURL=chunk-V3T7RO4F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/iconRegistry.ts"],"sourcesContent":["import type React from 'react';\n\n/** A component an icon prop can render: Lucide, MUI, or any `className`-taking SVG. */\nexport type IconComponent = React.ComponentType<{ className?: string }>;\n\n/**\n * Stored on `globalThis` under a registered symbol rather than in a\n * module-level `Map`.\n *\n * tsup compiles every CommonJS entry point independently (`splitting` only\n * shares chunks for ESM), so `eidos-ui/button` and `eidos-ui/lucide-icons`\n * each carry their own copy of this module under `require`. A module-level\n * registry would therefore split in two: icons registered through one entry\n * would be invisible to components loaded through another, silently, and\n * only for CJS consumers. `Symbol.for` resolves to the same key from every\n * copy.\n */\nconst REGISTRY_KEY = Symbol.for('eidos-ui.icon-registry');\n\nconst registry = (): Map<string, IconComponent> => {\n const scope = globalThis as unknown as Record<symbol, Map<string, IconComponent> | undefined>;\n return (scope[REGISTRY_KEY] ??= new Map());\n};\n\n/**\n * `arrow-right`, `ArrowRight` and `arrowRight` all name the same icon. Lucide\n * exports PascalCase; string props are conventionally kebab-case.\n */\nexport const toIconKey = (name: string): string =>\n name\n .split('-')\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n\n/**\n * Makes icons available to every icon prop by string name.\n *\n * Pass only the icons your app uses, so only those reach your bundle:\n *\n * ```ts\n * import { ArrowRight, Settings } from 'lucide-react';\n * registerIcons({ ArrowRight, Settings });\n * ```\n *\n * Keys may be PascalCase (as Lucide exports them) or kebab-case; both resolve\n * `icon=\"arrow-right\"` and `icon=\"ArrowRight\"`. Registering the same name\n * again replaces it. To register every Lucide icon, import\n * `eidos-ui/lucide-icons` once instead - at the cost of the whole icon set in\n * your bundle.\n */\nexport const registerIcons = (icons: Record<string, IconComponent>): void => {\n const target = registry();\n for (const [name, component] of Object.entries(icons)) {\n target.set(toIconKey(name), component);\n }\n};\n\n/** The registered component for a string icon name, if any. */\nexport const resolveRegisteredIcon = (name: string): IconComponent | undefined =>\n registry().get(toIconKey(name));\n"],"mappings":";AAiBA,IAAM,eAAe,uBAAO,IAAI,wBAAwB;AAExD,IAAM,WAAW,MAAkC;AACjD,QAAM,QAAQ;AACd,SAAQ,8CAAwB,oBAAI,IAAI;AAC1C;AAMO,IAAM,YAAY,CAAC,SACxB,KACG,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE;AAkBL,IAAM,gBAAgB,CAAC,UAA+C;AAC3E,QAAM,SAAS,SAAS;AACxB,aAAW,CAAC,MAAM,SAAS,KAAK,OAAO,QAAQ,KAAK,GAAG;AACrD,WAAO,IAAI,UAAU,IAAI,GAAG,SAAS;AAAA,EACvC;AACF;AAGO,IAAM,wBAAwB,CAAC,SACpC,SAAS,EAAE,IAAI,UAAU,IAAI,CAAC;","names":[]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  Button
3
- } from "./chunk-75GFIQRU.js";
3
+ } from "./chunk-JY77VJAZ.js";
4
4
  import {
5
5
  renderIcon,
6
6
  useDialogFocus,
7
7
  useIsClient
8
- } from "./chunk-RHHZRTWM.js";
8
+ } from "./chunk-U34INRFO.js";
9
9
 
10
10
  // src/components/Modal/Modal.component.tsx
11
11
  import { useEffect, useCallback, useId, useRef, useState } from "react";
@@ -120,4 +120,4 @@ Modal.displayName = "Modal";
120
120
  export {
121
121
  Modal
122
122
  };
123
- //# sourceMappingURL=chunk-GIEDIAPD.js.map
123
+ //# sourceMappingURL=chunk-V5CM5TH3.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Tooltip
3
- } from "./chunk-JNY7TUDS.js";
3
+ } from "./chunk-MCPGI6EI.js";
4
4
  import {
5
5
  devWarn,
6
6
  renderIcon
7
- } from "./chunk-RHHZRTWM.js";
7
+ } from "./chunk-U34INRFO.js";
8
8
 
9
9
  // src/components/SegmentedControl/SegmentedControl.component.tsx
10
10
  import React, { useEffect, useLayoutEffect, useRef, useState } from "react";
@@ -191,4 +191,4 @@ var SegmentedControl = ({
191
191
  export {
192
192
  SegmentedControl
193
193
  };
194
- //# sourceMappingURL=chunk-L65MHFMD.js.map
194
+ //# sourceMappingURL=chunk-V64DICJK.js.map
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- var _chunk35LGEPLPcjs = require('./chunk-35LGEPLP.cjs');
5
+ var _chunkENMDOQQOcjs = require('./chunk-ENMDOQQO.cjs');
6
6
 
7
7
  // src/components/Dropdown/Dropdown.context.types.ts
8
8
  var _react = require('react');
@@ -55,7 +55,7 @@ var DropdownInternal = ({
55
55
  }) => {
56
56
  const context = useDropdownContext();
57
57
  const actualLevel = dropdownLevel !== void 0 ? dropdownLevel : context.level;
58
- const isClient = _chunk35LGEPLPcjs.useIsClient.call(void 0, );
58
+ const isClient = _chunkENMDOQQOcjs.useIsClient.call(void 0, );
59
59
  const [dropdownState, setDropdownState] = _react.useState.call(void 0, {
60
60
  isVisible: defaultOpen,
61
61
  isPositioned: false,
@@ -65,7 +65,7 @@ var DropdownInternal = ({
65
65
  const isVisible = isControlled ? open : dropdownState.isVisible;
66
66
  const wasControlled = _react.useRef.call(void 0, isControlled);
67
67
  if (wasControlled.current !== isControlled) {
68
- _chunk35LGEPLPcjs.devWarn.call(void 0,
68
+ _chunkENMDOQQOcjs.devWarn.call(void 0,
69
69
  "dropdown-controlled-switch",
70
70
  "Dropdown: `open` switched between controlled and uncontrolled. Pick one for the lifetime of the component - the dropdown keeps its own state as a fallback, so switching makes it jump to whatever that happens to be."
71
71
  );
@@ -366,7 +366,7 @@ var DropdownInternal = ({
366
366
  {
367
367
  ref: triggerRef,
368
368
  onClick: handleTriggerClick,
369
- className: `eidos-dropdown-trigger ${fullWidth ? _chunk35LGEPLPcjs.fullWidthModifier.call(void 0, "eidos-dropdown-trigger") : ""} ${triggerClassName}`,
369
+ className: `eidos-dropdown-trigger ${fullWidth ? _chunkENMDOQQOcjs.fullWidthModifier.call(void 0, "eidos-dropdown-trigger") : ""} ${triggerClassName}`,
370
370
  children: trigger
371
371
  }
372
372
  ),
@@ -404,4 +404,4 @@ Dropdown.displayName = "Dropdown";
404
404
 
405
405
 
406
406
  exports.DropdownProvider = DropdownProvider; exports.useDropdownContext = useDropdownContext; exports.Dropdown = Dropdown;
407
- //# sourceMappingURL=chunk-KIZVY57H.cjs.map
407
+ //# sourceMappingURL=chunk-VXC7Z7XB.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-KIZVY57H.cjs","../src/components/Dropdown/Dropdown.context.types.ts","../src/components/Dropdown/Dropdown.context.tsx","../src/components/Dropdown/Dropdown.hooks.ts","../src/components/Dropdown/Dropdown.component.tsx"],"names":["jsx"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-KIZVY57H.cjs","sourcesContent":[null,"import { createContext } from 'react';\n\nexport interface DropdownContextValue {\n level: number;\n}\n\nexport const DropdownContext = createContext<DropdownContextValue>({ level: 0 });\n","import React from 'react';\nimport { DropdownContext } from './Dropdown.context.types';\n\nexport const DropdownProvider: React.FC<{ children: React.ReactNode; level?: number }> = ({\n children,\n level = 0,\n}) => {\n return <DropdownContext.Provider value={{ level }}>{children}</DropdownContext.Provider>;\n};\n","import { useContext } from 'react';\nimport { DropdownContext } from './Dropdown.context.types';\n\nexport const useDropdownContext = () => {\n return useContext(DropdownContext);\n};\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { devWarn, fullWidthModifier, useIsClient } from '../../utils';\nimport type { DropdownProps, DropdownState } from './Dropdown.types';\nimport { DropdownProvider } from './Dropdown.context';\nimport { useDropdownContext } from './Dropdown.hooks';\n\nconst DropdownInternal: React.FC<DropdownProps> = ({\n trigger,\n content,\n placement: preferredPlacement = 'bottom',\n align = 'start',\n delay = 0,\n disabled = false,\n defaultOpen = false,\n open,\n onOpenChange,\n triggerClassName = '',\n contentClassName = '',\n role,\n closeOnClickOutside = true,\n closeOnEscape = true,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n autoWidth = true,\n fullWidth = false,\n triggerRef: externalTriggerRef,\n isNested = false,\n dropdownLevel,\n dropdownGroup,\n}) => {\n const context = useDropdownContext();\n const actualLevel = dropdownLevel !== undefined ? dropdownLevel : context.level;\n // `defaultOpen` makes the portal reachable on the first render, which cannot\n // happen on a server - see `useIsClient`.\n const isClient = useIsClient();\n const [dropdownState, setDropdownState] = useState<DropdownState>({\n isVisible: defaultOpen,\n isPositioned: false,\n position: { top: 0, left: 0, placement: preferredPlacement },\n });\n\n // ── Controlled / uncontrolled open state ──────────────────────────────────\n //\n // `dropdownState.isVisible` stays the *uncontrolled* value and is kept in\n // step even while controlled, so removing `open` later leaves coherent state.\n // Everything downstream reads `isVisible` below, never the field directly.\n //\n // `DropdownState` is exported from the package root, so it keeps its shape:\n // splitting `isVisible` out of it would be a breaking type change for a\n // consumer who imports it, in exchange for nothing a reader of this file\n // needs.\n const isControlled = open !== undefined;\n const isVisible = isControlled ? open : dropdownState.isVisible;\n\n const wasControlled = useRef(isControlled);\n if (wasControlled.current !== isControlled) {\n devWarn(\n 'dropdown-controlled-switch',\n 'Dropdown: `open` switched between controlled and uncontrolled. Pick one for the lifetime of the component - the dropdown keeps its own state as a fallback, so switching makes it jump to whatever that happens to be.',\n );\n wasControlled.current = isControlled;\n }\n\n /**\n * The single place the open state changes. Every route - trigger click,\n * click-outside, Escape, a group sibling, the `delay` timer - goes through\n * here, so a controlled consumer sees all of them and cannot desync.\n */\n const setOpen = useCallback(\n (next: boolean) => {\n setDropdownState((prev) => ({ ...prev, isVisible: next, isPositioned: false }));\n onOpenChange?.(next);\n },\n [onOpenChange],\n );\n\n // A controlled caller can flip `open` without going through `setOpen`, which\n // would leave `isPositioned` true from the previous open and paint the panel\n // at its old coordinates for a frame. Re-arm the positioning pass from the\n // transition itself.\n useEffect(() => {\n if (!isVisible) {\n setDropdownState((prev) => (prev.isPositioned ? { ...prev, isPositioned: false } : prev));\n }\n }, [isVisible]);\n\n // A pending `delay` timer outlives a controlled close otherwise, and reopens\n // the panel a moment after the consumer closed it.\n useEffect(() => {\n if (!isVisible && timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n }, [isVisible]);\n const triggerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const animationFrameRef = useRef<number | undefined>(undefined);\n const isScrollingRef = useRef(false);\n\n // The element to actually measure/anchor against. When a consumer passes\n // `triggerRef`, that's an explicit statement of \"this is what I want the\n // dropdown positioned relative to\" - it must win over the internal wrapper\n // div, not just inform sizing. Consumers occasionally need `trigger` to be\n // a small anchor node (e.g. a 0-height span) sitting inside a larger,\n // variable-content field (chips, wrapped text); anchoring position to the\n // wrapper instead of that field silently drifts as soon as the field's\n // internal layout changes, since the wrapper only ever contains `trigger`\n // itself, never the field around it.\n const getTriggerElement = useCallback(\n (): HTMLElement | null => externalTriggerRef?.current ?? triggerRef.current,\n [externalTriggerRef],\n );\n\n const calculateDynamicSizing = useCallback(\n // Only the width is read, so the parameter is the narrowest shape that\n // satisfies it rather than a `DOMRect`. The caller used to fall back to\n // `new DOMRect()`, which is a browser-only global evaluated *during\n // render* - it was the first thing to throw when an open dropdown was\n // server-rendered, before `document.body` ever got a chance to.\n (triggerRect: { width: number } | null) => {\n // Shrink the panel to its content by default. This prevents the\n // position:fixed element from expanding to viewport width when children\n // use `width:100%` or `flex:1`. `minWidth` (set below) still wins when\n // the trigger is wider than the content, as CSS min-width overrides width.\n const styles: Record<string, string | number> = { width: 'max-content' };\n\n if (autoWidth && triggerRect && (externalTriggerRef?.current || triggerRef.current)) {\n const triggerWidth = triggerRect.width;\n styles.minWidth = triggerWidth;\n }\n\n if (minWidth !== undefined) {\n styles.minWidth = typeof minWidth === 'number' ? `${minWidth}px` : minWidth;\n }\n if (maxWidth !== undefined) {\n if (maxWidth === 'auto') {\n styles.maxWidth = 'none';\n } else {\n styles.maxWidth = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n }\n }\n if (minHeight !== undefined) {\n styles.minHeight = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n }\n if (maxHeight !== undefined) {\n if (maxHeight === 'auto') {\n styles.maxHeight = 'none';\n } else {\n styles.maxHeight = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n }\n }\n\n const hasHeightConstraint = minHeight !== undefined || maxHeight !== undefined;\n if (hasHeightConstraint) {\n styles.overflowY = 'auto';\n } else {\n styles.overflowY = 'visible';\n }\n\n return styles;\n },\n [autoWidth, externalTriggerRef, minWidth, maxWidth, minHeight, maxHeight],\n );\n\n const calculateOptimalPosition = useCallback(\n (triggerRect: DOMRect, contentRect: DOMRect) => {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 8;\n\n let placement: 'top' | 'bottom' | 'left' | 'right' = preferredPlacement;\n let top = 0;\n let left = 0;\n\n // Helpers for cross-axis alignment\n const alignedLeft = (() => {\n switch (align) {\n case 'end':\n return triggerRect.right - contentRect.width;\n case 'center':\n return triggerRect.left + (triggerRect.width - contentRect.width) / 2;\n default:\n return triggerRect.left; // \"start\"\n }\n })();\n const alignedTop = (() => {\n switch (align) {\n case 'end':\n return triggerRect.bottom - contentRect.height;\n case 'center':\n return triggerRect.top + (triggerRect.height - contentRect.height) / 2;\n default:\n return triggerRect.top; // \"start\"\n }\n })();\n\n switch (preferredPlacement) {\n case 'top':\n top = triggerRect.top - contentRect.height - gap;\n left = alignedLeft;\n break;\n case 'bottom':\n top = triggerRect.bottom + gap;\n left = alignedLeft;\n break;\n case 'left':\n top = alignedTop;\n left = triggerRect.left - contentRect.width - gap;\n break;\n case 'right':\n top = alignedTop;\n left = triggerRect.right + gap;\n break;\n }\n\n if (placement === 'top' && top < gap) {\n placement = 'bottom';\n top = triggerRect.bottom + gap;\n } else if (placement === 'bottom' && top + contentRect.height > viewportHeight - gap) {\n placement = 'top';\n top = triggerRect.top - contentRect.height - gap;\n } else if (placement === 'left' && left < gap) {\n placement = 'right';\n left = triggerRect.right + gap;\n } else if (placement === 'right' && left + contentRect.width > viewportWidth - gap) {\n placement = 'left';\n left = triggerRect.left - contentRect.width - gap;\n }\n\n // Always clamp to both viewport edges - not just the near one - regardless\n // of whether an explicit min/max size was passed. `autoWidth` consumers\n // (Combobox, Select, TagInput suggestions, Menu, ...) never set\n // minWidth/maxWidth, so gating this on those props left the far edge\n // (right/bottom) completely unclamped and let content overflow the\n // viewport whenever it rendered wider/taller than its trigger.\n top = Math.max(gap, Math.min(top, viewportHeight - contentRect.height - gap));\n\n left = Math.max(gap, Math.min(left, viewportWidth - contentRect.width - gap));\n\n return { top, left, placement };\n },\n [preferredPlacement, align],\n );\n\n const handleScroll = useCallback(() => {\n if (!isVisible || !dropdownState.isPositioned || isScrollingRef.current) return;\n\n isScrollingRef.current = true;\n\n animationFrameRef.current = requestAnimationFrame(() => {\n const triggerElement = getTriggerElement();\n if (triggerElement && contentRef.current) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n\n isScrollingRef.current = false;\n });\n }, [isVisible, dropdownState.isPositioned, calculateOptimalPosition, getTriggerElement]);\n\n const handleTriggerClick = useCallback(() => {\n if (disabled) return;\n\n if (isVisible) {\n setOpen(false);\n } else {\n if (dropdownGroup) {\n const siblingDropdowns = document.querySelectorAll(\n `[data-dropdown-group=\"${dropdownGroup}\"][data-dropdown-content]`,\n );\n siblingDropdowns.forEach((dropdown) => {\n const dropdownElement = dropdown as HTMLElement;\n\n dropdownElement.dispatchEvent(new CustomEvent('closeSibling'));\n });\n }\n\n if (delay > 0) {\n timeoutRef.current = setTimeout(() => setOpen(true), delay);\n } else {\n setOpen(true);\n }\n }\n }, [disabled, isVisible, delay, dropdownGroup, setOpen]);\n\n useEffect(() => {\n const handleCloseSibling = () => {\n if (isVisible) setOpen(false);\n };\n\n const currentContentRef = contentRef.current;\n if (currentContentRef) {\n currentContentRef.addEventListener('closeSibling', handleCloseSibling);\n }\n\n return () => {\n if (currentContentRef) {\n currentContentRef.removeEventListener('closeSibling', handleCloseSibling);\n }\n };\n }, [isVisible, setOpen]);\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (!closeOnClickOutside || !isVisible) return;\n\n const target = event.target as Node;\n\n if (contentRef.current?.contains(target)) {\n return;\n }\n\n if (getTriggerElement()?.contains(target)) {\n return;\n }\n\n const allDropdowns = document.querySelectorAll('[data-dropdown-content]');\n for (const dropdown of allDropdowns) {\n if (dropdown === contentRef.current) continue;\n\n if (dropdown.contains(target)) {\n const clickedDropdownLevel = parseInt(\n dropdown.getAttribute('data-dropdown-level') || '0',\n );\n\n if (clickedDropdownLevel > actualLevel) {\n return;\n }\n }\n }\n\n setOpen(false);\n },\n [closeOnClickOutside, isVisible, actualLevel, getTriggerElement, setOpen],\n );\n\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n if (closeOnEscape && event.key === 'Escape' && isVisible) {\n setOpen(false);\n }\n },\n [closeOnEscape, isVisible, setOpen],\n );\n\n useEffect(() => {\n const triggerElement = getTriggerElement();\n if (isVisible && !dropdownState.isPositioned && contentRef.current && triggerElement) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n isPositioned: true,\n }));\n }\n }, [\n isVisible,\n dropdownState.isPositioned,\n calculateOptimalPosition,\n getTriggerElement,\n // Load-bearing, not incidental. With `defaultOpen` the panel is \"visible\"\n // from the first render, but the portal is deferred one render for SSR\n // safety - so this effect's first run finds `contentRef.current` still\n // null, measures nothing, and without `isClient` in the deps it would never\n // run again. The panel then stays `visibility: hidden` forever: mounted,\n // unpositioned, invisible. Caught by `OpensOnMountWithDefaultOpen`.\n isClient,\n ]);\n\n useEffect(() => {\n const handleResize = () => {\n const triggerElement = getTriggerElement();\n if (isVisible && dropdownState.isPositioned && contentRef.current && triggerElement) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [isVisible, dropdownState.isPositioned, calculateOptimalPosition, getTriggerElement]);\n\n useEffect(() => {\n if (isVisible) {\n // Capture phase on `document`, which is the only way to see scrolling in\n // an arbitrary ancestor: `scroll` does not bubble from an element, so the\n // previous listeners on `window` and `document.body` only ever fired for\n // the page itself. Any other scroll container - `PageLayout`'s\n // `&__content` is the layout's scrollport, so this is every dropdown\n // inside it - moved the trigger while the portaled, `position: fixed`\n // content stayed at its original viewport coordinates.\n document.addEventListener('scroll', handleScroll, { capture: true, passive: true });\n }\n\n return () => {\n document.removeEventListener('scroll', handleScroll, { capture: true });\n };\n }, [isVisible, handleScroll]);\n\n useEffect(() => {\n if (isVisible) {\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [isVisible, handleClickOutside, handleEscapeKey]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n };\n }, []);\n\n return (\n <>\n {/*\n A positioning and click-capturing wrapper, and nothing more - it\n deliberately carries no `role` and no `tabIndex`.\n\n It used to be `role=\"button\" tabIndex={-1}`, which was wrong in both\n directions at once. `tabIndex={-1}` with no key handler meant the\n wrapper was never keyboard-operable, so the button role it advertised\n could not be activated by anyone using a keyboard - it promised a\n control that did not exist. Meanwhile, because `trigger` is virtually\n always a real control (Select and Combobox pass an `<input>`, Menu and\n SplitButton a `<button>`, ...), the role wrapped an interactive element\n in another interactive element: invalid ARIA, flagged by axe as\n `nested-interactive`, and announced by screen readers as a button\n inside a button. One attribute did this across every component built\n on Dropdown - Select, Combobox, Menu, Popover, ContextMenu,\n ColorPicker and TagInput - 212 violations in a single axe run.\n\n Semantics belong to whatever is passed as `trigger`, which is the only\n element that can actually own them. A consumer passing a\n non-interactive node should pass a `<button>` instead; it was never\n keyboard-accessible under the old markup either.\n */}\n <div\n ref={triggerRef}\n onClick={handleTriggerClick}\n className={`eidos-dropdown-trigger ${fullWidth ? fullWidthModifier('eidos-dropdown-trigger') : ''} ${triggerClassName}`}\n >\n {trigger}\n </div>\n {isClient &&\n isVisible &&\n createPortal(\n <div\n ref={contentRef}\n data-dropdown-content\n data-dropdown-level={actualLevel}\n data-dropdown-group={dropdownGroup || ''}\n className={`eidos-dropdown-content eidos-dropdown-content--${dropdownState.position.placement} ${isNested ? 'eidos-dropdown-content--nested' : ''} ${dropdownState.isPositioned ? 'eidos-dropdown-content--positioned' : ''} ${contentClassName || ''}`}\n style={{\n top: dropdownState.position.top,\n left: dropdownState.position.left,\n ...calculateDynamicSizing(getTriggerElement()?.getBoundingClientRect() ?? null),\n }}\n // No default role: see the `role` prop's note in `Dropdown.types`.\n // This was `role=\"menu\"` unconditionally, which made a menu out of\n // every `Select` listbox, date picker and toolbar panel in the\n // library.\n role={role}\n >\n {content}\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nexport const Dropdown: React.FC<DropdownProps> = (props) => {\n const context = useDropdownContext();\n const nextLevel = props.dropdownLevel !== undefined ? props.dropdownLevel : context.level + 1;\n\n return (\n <DropdownProvider level={nextLevel}>\n <DropdownInternal {...props} />\n </DropdownProvider>\n );\n};\n\nDropdown.displayName = 'Dropdown';\n"]}
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-VXC7Z7XB.cjs","../src/components/Dropdown/Dropdown.context.types.ts","../src/components/Dropdown/Dropdown.context.tsx","../src/components/Dropdown/Dropdown.hooks.ts","../src/components/Dropdown/Dropdown.component.tsx"],"names":["jsx"],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-VXC7Z7XB.cjs","sourcesContent":[null,"import { createContext } from 'react';\n\nexport interface DropdownContextValue {\n level: number;\n}\n\nexport const DropdownContext = createContext<DropdownContextValue>({ level: 0 });\n","import React from 'react';\nimport { DropdownContext } from './Dropdown.context.types';\n\nexport const DropdownProvider: React.FC<{ children: React.ReactNode; level?: number }> = ({\n children,\n level = 0,\n}) => {\n return <DropdownContext.Provider value={{ level }}>{children}</DropdownContext.Provider>;\n};\n","import { useContext } from 'react';\nimport { DropdownContext } from './Dropdown.context.types';\n\nexport const useDropdownContext = () => {\n return useContext(DropdownContext);\n};\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { devWarn, fullWidthModifier, useIsClient } from '../../utils';\nimport type { DropdownProps, DropdownState } from './Dropdown.types';\nimport { DropdownProvider } from './Dropdown.context';\nimport { useDropdownContext } from './Dropdown.hooks';\n\nconst DropdownInternal: React.FC<DropdownProps> = ({\n trigger,\n content,\n placement: preferredPlacement = 'bottom',\n align = 'start',\n delay = 0,\n disabled = false,\n defaultOpen = false,\n open,\n onOpenChange,\n triggerClassName = '',\n contentClassName = '',\n role,\n closeOnClickOutside = true,\n closeOnEscape = true,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight,\n autoWidth = true,\n fullWidth = false,\n triggerRef: externalTriggerRef,\n isNested = false,\n dropdownLevel,\n dropdownGroup,\n}) => {\n const context = useDropdownContext();\n const actualLevel = dropdownLevel !== undefined ? dropdownLevel : context.level;\n // `defaultOpen` makes the portal reachable on the first render, which cannot\n // happen on a server - see `useIsClient`.\n const isClient = useIsClient();\n const [dropdownState, setDropdownState] = useState<DropdownState>({\n isVisible: defaultOpen,\n isPositioned: false,\n position: { top: 0, left: 0, placement: preferredPlacement },\n });\n\n // ── Controlled / uncontrolled open state ──────────────────────────────────\n //\n // `dropdownState.isVisible` stays the *uncontrolled* value and is kept in\n // step even while controlled, so removing `open` later leaves coherent state.\n // Everything downstream reads `isVisible` below, never the field directly.\n //\n // `DropdownState` is exported from the package root, so it keeps its shape:\n // splitting `isVisible` out of it would be a breaking type change for a\n // consumer who imports it, in exchange for nothing a reader of this file\n // needs.\n const isControlled = open !== undefined;\n const isVisible = isControlled ? open : dropdownState.isVisible;\n\n const wasControlled = useRef(isControlled);\n if (wasControlled.current !== isControlled) {\n devWarn(\n 'dropdown-controlled-switch',\n 'Dropdown: `open` switched between controlled and uncontrolled. Pick one for the lifetime of the component - the dropdown keeps its own state as a fallback, so switching makes it jump to whatever that happens to be.',\n );\n wasControlled.current = isControlled;\n }\n\n /**\n * The single place the open state changes. Every route - trigger click,\n * click-outside, Escape, a group sibling, the `delay` timer - goes through\n * here, so a controlled consumer sees all of them and cannot desync.\n */\n const setOpen = useCallback(\n (next: boolean) => {\n setDropdownState((prev) => ({ ...prev, isVisible: next, isPositioned: false }));\n onOpenChange?.(next);\n },\n [onOpenChange],\n );\n\n // A controlled caller can flip `open` without going through `setOpen`, which\n // would leave `isPositioned` true from the previous open and paint the panel\n // at its old coordinates for a frame. Re-arm the positioning pass from the\n // transition itself.\n useEffect(() => {\n if (!isVisible) {\n setDropdownState((prev) => (prev.isPositioned ? { ...prev, isPositioned: false } : prev));\n }\n }, [isVisible]);\n\n // A pending `delay` timer outlives a controlled close otherwise, and reopens\n // the panel a moment after the consumer closed it.\n useEffect(() => {\n if (!isVisible && timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = undefined;\n }\n }, [isVisible]);\n const triggerRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n const animationFrameRef = useRef<number | undefined>(undefined);\n const isScrollingRef = useRef(false);\n\n // The element to actually measure/anchor against. When a consumer passes\n // `triggerRef`, that's an explicit statement of \"this is what I want the\n // dropdown positioned relative to\" - it must win over the internal wrapper\n // div, not just inform sizing. Consumers occasionally need `trigger` to be\n // a small anchor node (e.g. a 0-height span) sitting inside a larger,\n // variable-content field (chips, wrapped text); anchoring position to the\n // wrapper instead of that field silently drifts as soon as the field's\n // internal layout changes, since the wrapper only ever contains `trigger`\n // itself, never the field around it.\n const getTriggerElement = useCallback(\n (): HTMLElement | null => externalTriggerRef?.current ?? triggerRef.current,\n [externalTriggerRef],\n );\n\n const calculateDynamicSizing = useCallback(\n // Only the width is read, so the parameter is the narrowest shape that\n // satisfies it rather than a `DOMRect`. The caller used to fall back to\n // `new DOMRect()`, which is a browser-only global evaluated *during\n // render* - it was the first thing to throw when an open dropdown was\n // server-rendered, before `document.body` ever got a chance to.\n (triggerRect: { width: number } | null) => {\n // Shrink the panel to its content by default. This prevents the\n // position:fixed element from expanding to viewport width when children\n // use `width:100%` or `flex:1`. `minWidth` (set below) still wins when\n // the trigger is wider than the content, as CSS min-width overrides width.\n const styles: Record<string, string | number> = { width: 'max-content' };\n\n if (autoWidth && triggerRect && (externalTriggerRef?.current || triggerRef.current)) {\n const triggerWidth = triggerRect.width;\n styles.minWidth = triggerWidth;\n }\n\n if (minWidth !== undefined) {\n styles.minWidth = typeof minWidth === 'number' ? `${minWidth}px` : minWidth;\n }\n if (maxWidth !== undefined) {\n if (maxWidth === 'auto') {\n styles.maxWidth = 'none';\n } else {\n styles.maxWidth = typeof maxWidth === 'number' ? `${maxWidth}px` : maxWidth;\n }\n }\n if (minHeight !== undefined) {\n styles.minHeight = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n }\n if (maxHeight !== undefined) {\n if (maxHeight === 'auto') {\n styles.maxHeight = 'none';\n } else {\n styles.maxHeight = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n }\n }\n\n const hasHeightConstraint = minHeight !== undefined || maxHeight !== undefined;\n if (hasHeightConstraint) {\n styles.overflowY = 'auto';\n } else {\n styles.overflowY = 'visible';\n }\n\n return styles;\n },\n [autoWidth, externalTriggerRef, minWidth, maxWidth, minHeight, maxHeight],\n );\n\n const calculateOptimalPosition = useCallback(\n (triggerRect: DOMRect, contentRect: DOMRect) => {\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const gap = 8;\n\n let placement: 'top' | 'bottom' | 'left' | 'right' = preferredPlacement;\n let top = 0;\n let left = 0;\n\n // Helpers for cross-axis alignment\n const alignedLeft = (() => {\n switch (align) {\n case 'end':\n return triggerRect.right - contentRect.width;\n case 'center':\n return triggerRect.left + (triggerRect.width - contentRect.width) / 2;\n default:\n return triggerRect.left; // \"start\"\n }\n })();\n const alignedTop = (() => {\n switch (align) {\n case 'end':\n return triggerRect.bottom - contentRect.height;\n case 'center':\n return triggerRect.top + (triggerRect.height - contentRect.height) / 2;\n default:\n return triggerRect.top; // \"start\"\n }\n })();\n\n switch (preferredPlacement) {\n case 'top':\n top = triggerRect.top - contentRect.height - gap;\n left = alignedLeft;\n break;\n case 'bottom':\n top = triggerRect.bottom + gap;\n left = alignedLeft;\n break;\n case 'left':\n top = alignedTop;\n left = triggerRect.left - contentRect.width - gap;\n break;\n case 'right':\n top = alignedTop;\n left = triggerRect.right + gap;\n break;\n }\n\n if (placement === 'top' && top < gap) {\n placement = 'bottom';\n top = triggerRect.bottom + gap;\n } else if (placement === 'bottom' && top + contentRect.height > viewportHeight - gap) {\n placement = 'top';\n top = triggerRect.top - contentRect.height - gap;\n } else if (placement === 'left' && left < gap) {\n placement = 'right';\n left = triggerRect.right + gap;\n } else if (placement === 'right' && left + contentRect.width > viewportWidth - gap) {\n placement = 'left';\n left = triggerRect.left - contentRect.width - gap;\n }\n\n // Always clamp to both viewport edges - not just the near one - regardless\n // of whether an explicit min/max size was passed. `autoWidth` consumers\n // (Combobox, Select, TagInput suggestions, Menu, ...) never set\n // minWidth/maxWidth, so gating this on those props left the far edge\n // (right/bottom) completely unclamped and let content overflow the\n // viewport whenever it rendered wider/taller than its trigger.\n top = Math.max(gap, Math.min(top, viewportHeight - contentRect.height - gap));\n\n left = Math.max(gap, Math.min(left, viewportWidth - contentRect.width - gap));\n\n return { top, left, placement };\n },\n [preferredPlacement, align],\n );\n\n const handleScroll = useCallback(() => {\n if (!isVisible || !dropdownState.isPositioned || isScrollingRef.current) return;\n\n isScrollingRef.current = true;\n\n animationFrameRef.current = requestAnimationFrame(() => {\n const triggerElement = getTriggerElement();\n if (triggerElement && contentRef.current) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n\n isScrollingRef.current = false;\n });\n }, [isVisible, dropdownState.isPositioned, calculateOptimalPosition, getTriggerElement]);\n\n const handleTriggerClick = useCallback(() => {\n if (disabled) return;\n\n if (isVisible) {\n setOpen(false);\n } else {\n if (dropdownGroup) {\n const siblingDropdowns = document.querySelectorAll(\n `[data-dropdown-group=\"${dropdownGroup}\"][data-dropdown-content]`,\n );\n siblingDropdowns.forEach((dropdown) => {\n const dropdownElement = dropdown as HTMLElement;\n\n dropdownElement.dispatchEvent(new CustomEvent('closeSibling'));\n });\n }\n\n if (delay > 0) {\n timeoutRef.current = setTimeout(() => setOpen(true), delay);\n } else {\n setOpen(true);\n }\n }\n }, [disabled, isVisible, delay, dropdownGroup, setOpen]);\n\n useEffect(() => {\n const handleCloseSibling = () => {\n if (isVisible) setOpen(false);\n };\n\n const currentContentRef = contentRef.current;\n if (currentContentRef) {\n currentContentRef.addEventListener('closeSibling', handleCloseSibling);\n }\n\n return () => {\n if (currentContentRef) {\n currentContentRef.removeEventListener('closeSibling', handleCloseSibling);\n }\n };\n }, [isVisible, setOpen]);\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (!closeOnClickOutside || !isVisible) return;\n\n const target = event.target as Node;\n\n if (contentRef.current?.contains(target)) {\n return;\n }\n\n if (getTriggerElement()?.contains(target)) {\n return;\n }\n\n const allDropdowns = document.querySelectorAll('[data-dropdown-content]');\n for (const dropdown of allDropdowns) {\n if (dropdown === contentRef.current) continue;\n\n if (dropdown.contains(target)) {\n const clickedDropdownLevel = parseInt(\n dropdown.getAttribute('data-dropdown-level') || '0',\n );\n\n if (clickedDropdownLevel > actualLevel) {\n return;\n }\n }\n }\n\n setOpen(false);\n },\n [closeOnClickOutside, isVisible, actualLevel, getTriggerElement, setOpen],\n );\n\n const handleEscapeKey = useCallback(\n (event: KeyboardEvent) => {\n if (closeOnEscape && event.key === 'Escape' && isVisible) {\n setOpen(false);\n }\n },\n [closeOnEscape, isVisible, setOpen],\n );\n\n useEffect(() => {\n const triggerElement = getTriggerElement();\n if (isVisible && !dropdownState.isPositioned && contentRef.current && triggerElement) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n isPositioned: true,\n }));\n }\n }, [\n isVisible,\n dropdownState.isPositioned,\n calculateOptimalPosition,\n getTriggerElement,\n // Load-bearing, not incidental. With `defaultOpen` the panel is \"visible\"\n // from the first render, but the portal is deferred one render for SSR\n // safety - so this effect's first run finds `contentRef.current` still\n // null, measures nothing, and without `isClient` in the deps it would never\n // run again. The panel then stays `visibility: hidden` forever: mounted,\n // unpositioned, invisible. Caught by `OpensOnMountWithDefaultOpen`.\n isClient,\n ]);\n\n useEffect(() => {\n const handleResize = () => {\n const triggerElement = getTriggerElement();\n if (isVisible && dropdownState.isPositioned && contentRef.current && triggerElement) {\n const triggerRect = triggerElement.getBoundingClientRect();\n const contentRect = contentRef.current.getBoundingClientRect();\n\n const { top, left, placement } = calculateOptimalPosition(triggerRect, contentRect);\n\n setDropdownState((prev) => ({\n ...prev,\n position: { top, left, placement },\n }));\n }\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [isVisible, dropdownState.isPositioned, calculateOptimalPosition, getTriggerElement]);\n\n useEffect(() => {\n if (isVisible) {\n // Capture phase on `document`, which is the only way to see scrolling in\n // an arbitrary ancestor: `scroll` does not bubble from an element, so the\n // previous listeners on `window` and `document.body` only ever fired for\n // the page itself. Any other scroll container - `PageLayout`'s\n // `&__content` is the layout's scrollport, so this is every dropdown\n // inside it - moved the trigger while the portaled, `position: fixed`\n // content stayed at its original viewport coordinates.\n document.addEventListener('scroll', handleScroll, { capture: true, passive: true });\n }\n\n return () => {\n document.removeEventListener('scroll', handleScroll, { capture: true });\n };\n }, [isVisible, handleScroll]);\n\n useEffect(() => {\n if (isVisible) {\n document.addEventListener('mousedown', handleClickOutside);\n document.addEventListener('keydown', handleEscapeKey);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n document.removeEventListener('keydown', handleEscapeKey);\n };\n }, [isVisible, handleClickOutside, handleEscapeKey]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n if (animationFrameRef.current) {\n cancelAnimationFrame(animationFrameRef.current);\n }\n };\n }, []);\n\n return (\n <>\n {/*\n A positioning and click-capturing wrapper, and nothing more - it\n deliberately carries no `role` and no `tabIndex`.\n\n It used to be `role=\"button\" tabIndex={-1}`, which was wrong in both\n directions at once. `tabIndex={-1}` with no key handler meant the\n wrapper was never keyboard-operable, so the button role it advertised\n could not be activated by anyone using a keyboard - it promised a\n control that did not exist. Meanwhile, because `trigger` is virtually\n always a real control (Select and Combobox pass an `<input>`, Menu and\n SplitButton a `<button>`, ...), the role wrapped an interactive element\n in another interactive element: invalid ARIA, flagged by axe as\n `nested-interactive`, and announced by screen readers as a button\n inside a button. One attribute did this across every component built\n on Dropdown - Select, Combobox, Menu, Popover, ContextMenu,\n ColorPicker and TagInput - 212 violations in a single axe run.\n\n Semantics belong to whatever is passed as `trigger`, which is the only\n element that can actually own them. A consumer passing a\n non-interactive node should pass a `<button>` instead; it was never\n keyboard-accessible under the old markup either.\n */}\n <div\n ref={triggerRef}\n onClick={handleTriggerClick}\n className={`eidos-dropdown-trigger ${fullWidth ? fullWidthModifier('eidos-dropdown-trigger') : ''} ${triggerClassName}`}\n >\n {trigger}\n </div>\n {isClient &&\n isVisible &&\n createPortal(\n <div\n ref={contentRef}\n data-dropdown-content\n data-dropdown-level={actualLevel}\n data-dropdown-group={dropdownGroup || ''}\n className={`eidos-dropdown-content eidos-dropdown-content--${dropdownState.position.placement} ${isNested ? 'eidos-dropdown-content--nested' : ''} ${dropdownState.isPositioned ? 'eidos-dropdown-content--positioned' : ''} ${contentClassName || ''}`}\n style={{\n top: dropdownState.position.top,\n left: dropdownState.position.left,\n ...calculateDynamicSizing(getTriggerElement()?.getBoundingClientRect() ?? null),\n }}\n // No default role: see the `role` prop's note in `Dropdown.types`.\n // This was `role=\"menu\"` unconditionally, which made a menu out of\n // every `Select` listbox, date picker and toolbar panel in the\n // library.\n role={role}\n >\n {content}\n </div>,\n document.body,\n )}\n </>\n );\n};\n\nexport const Dropdown: React.FC<DropdownProps> = (props) => {\n const context = useDropdownContext();\n const nextLevel = props.dropdownLevel !== undefined ? props.dropdownLevel : context.level + 1;\n\n return (\n <DropdownProvider level={nextLevel}>\n <DropdownInternal {...props} />\n </DropdownProvider>\n );\n};\n\nDropdown.displayName = 'Dropdown';\n"]}
@@ -0,0 +1,47 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/components/Timeline/Timeline.component.tsx
2
+ var _jsxruntime = require('react/jsx-runtime');
3
+ var Timeline = ({
4
+ items,
5
+ ariaLabel,
6
+ "aria-labelledby": ariaLabelledBy,
7
+ className = ""
8
+ }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
9
+ "ol",
10
+ {
11
+ className: ["eidos-timeline", className].filter(Boolean).join(" "),
12
+ "aria-label": ariaLabel,
13
+ "aria-labelledby": ariaLabelledBy,
14
+ children: items.map((item, index) => {
15
+ const isLast = index === items.length - 1;
16
+ const color = _nullishCoalesce(item.color, () => ( "default"));
17
+ return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
18
+ "li",
19
+ {
20
+ className: [
21
+ "eidos-timeline-item",
22
+ `eidos-timeline-item--${color}`,
23
+ !isLast && "eidos-timeline-item--has-connector"
24
+ ].filter(Boolean).join(" "),
25
+ children: [
26
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-timeline-track", "aria-hidden": "true", children: [
27
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-timeline-dot", children: item.icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-timeline-dot-icon", children: item.icon }) }),
28
+ !isLast && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-timeline-connector" })
29
+ ] }),
30
+ /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-timeline-content", children: [
31
+ item.timestamp && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-timeline-timestamp", children: item.timestamp }),
32
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-timeline-title", children: item.title }),
33
+ item.description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-timeline-description", children: item.description })
34
+ ] })
35
+ ]
36
+ },
37
+ item.id
38
+ );
39
+ })
40
+ }
41
+ );
42
+ Timeline.displayName = "Timeline";
43
+
44
+
45
+
46
+ exports.Timeline = Timeline;
47
+ //# sourceMappingURL=chunk-VYF7WV4K.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-VYF7WV4K.cjs","../src/components/Timeline/Timeline.component.tsx"],"names":[],"mappings":"AAAA;ACwCU,+CAAA;AA3BH,IAAM,SAAA,EAAoC,CAAC;AAAA,EAChD,KAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA,EAAmB,cAAA;AAAA,EACnB,UAAA,EAAY;AACd,CAAA,EAAA,mBACE,6BAAA;AAAA,EAAC,IAAA;AAAA,EAAA;AAAA,IACC,SAAA,EAAW,CAAC,gBAAA,EAAkB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,IACjE,YAAA,EAAY,SAAA;AAAA,IACZ,iBAAA,EAAiB,cAAA;AAAA,IAEhB,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,EAAA,GAAU;AAC1B,MAAA,MAAM,OAAA,EAAS,MAAA,IAAU,KAAA,CAAM,OAAA,EAAS,CAAA;AACxC,MAAA,MAAM,MAAA,mBAAQ,IAAA,CAAK,KAAA,UAAS,WAAA;AAE5B,MAAA,uBACE,8BAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW;AAAA,YACT,qBAAA;AAAA,YACA,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAA;AAClB,YAAA;AAGF,UAAA;AAGX,UAAA;AAAK,4BAAA;AACF,8BAAA;AAGW,cAAA;AACd,YAAA;AAGK,4BAAA;AACgB,cAAA;AAClB,8BAAA;AAEC,cAAA;AAEJ,YAAA;AAAA,UAAA;AAAA,QAAA;AAxBU,QAAA;AAyBZ,MAAA;AAEH,IAAA;AAAA,EAAA;AACH;AAGqB;ADnBmB;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-VYF7WV4K.cjs","sourcesContent":[null,"import React from 'react';\nimport type { TimelineProps } from './Timeline.types';\n\n// Title and description are `div`s, not `span` and `p`. Both are documented\n// as `ReactNode`, and the obvious content for an Experience or Education\n// entry - a bullet list, a row of chips - is block-level: inside a `<p>` it is\n// invalid HTML (React reports it as a hydration error, and the browser's\n// parser closes the paragraph early), which pushed consumers to rebuild the\n// component out of Cards.\n//\n// The list used to carry a hardcoded `aria-label=\"Timeline\"`, which named\n// every instance the same thing and overrode whatever heading introduced it.\n// The name is now the consumer's to give, or to omit.\nexport const Timeline: React.FC<TimelineProps> = ({\n items,\n ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n className = '',\n}) => (\n <ol\n className={['eidos-timeline', className].filter(Boolean).join(' ')}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n >\n {items.map((item, index) => {\n const isLast = index === items.length - 1;\n const color = item.color ?? 'default';\n\n return (\n <li\n key={item.id}\n className={[\n 'eidos-timeline-item',\n `eidos-timeline-item--${color}`,\n !isLast && 'eidos-timeline-item--has-connector',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {/* Left: dot + connector */}\n <div className=\"eidos-timeline-track\" aria-hidden=\"true\">\n <div className=\"eidos-timeline-dot\">\n {item.icon && <span className=\"eidos-timeline-dot-icon\">{item.icon}</span>}\n </div>\n {!isLast && <div className=\"eidos-timeline-connector\" />}\n </div>\n\n {/* Right: content */}\n <div className=\"eidos-timeline-content\">\n {item.timestamp && <span className=\"eidos-timeline-timestamp\">{item.timestamp}</span>}\n <div className=\"eidos-timeline-title\">{item.title}</div>\n {item.description && (\n <div className=\"eidos-timeline-description\">{item.description}</div>\n )}\n </div>\n </li>\n );\n })}\n </ol>\n);\n\nTimeline.displayName = 'Timeline';\n"]}
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  Dropdown
3
- } from "./chunk-JHX6JK3M.js";
3
+ } from "./chunk-3X6QVHTD.js";
4
4
  import {
5
5
  Kbd
6
6
  } from "./chunk-LYH3EKKQ.js";
7
7
  import {
8
8
  Tooltip
9
- } from "./chunk-JNY7TUDS.js";
9
+ } from "./chunk-MCPGI6EI.js";
10
10
  import {
11
11
  renderIcon,
12
12
  useDialogFocus
13
- } from "./chunk-RHHZRTWM.js";
13
+ } from "./chunk-U34INRFO.js";
14
14
 
15
15
  // src/components/Menu/Menu.component.tsx
16
16
  import React, { useCallback, useMemo, useRef, useState } from "react";
@@ -222,4 +222,4 @@ export {
222
222
  MenuPanel,
223
223
  Menu
224
224
  };
225
- //# sourceMappingURL=chunk-P4XZH3OR.js.map
225
+ //# sourceMappingURL=chunk-WHQGJHMD.js.map