eidos-ui 3.8.1 → 4.0.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 (244) hide show
  1. package/README.md +2 -2
  2. package/dist/alert/index.cjs +5 -5
  3. package/dist/alert/index.js +4 -4
  4. package/dist/button/index.cjs +4 -4
  5. package/dist/button/index.js +3 -3
  6. package/dist/chip/index.cjs +4 -4
  7. package/dist/chip/index.js +3 -3
  8. package/dist/{chunk-V5CM5TH3.js → chunk-2OBOD3GO.js} +3 -3
  9. package/dist/{chunk-CFVUUMQA.cjs → chunk-2URFSWJT.cjs} +6 -8
  10. package/dist/chunk-2URFSWJT.cjs.map +1 -0
  11. package/dist/{chunk-4S57PE43.js → chunk-2WDL2ZVP.js} +6 -7
  12. package/dist/chunk-2WDL2ZVP.js.map +1 -0
  13. package/dist/{chunk-V64DICJK.js → chunk-363IKX3C.js} +3 -3
  14. package/dist/{chunk-LWCFT5SP.cjs → chunk-3QBMSZSE.cjs} +3 -3
  15. package/dist/{chunk-LWCFT5SP.cjs.map → chunk-3QBMSZSE.cjs.map} +1 -1
  16. package/dist/{chunk-IC2PIK3E.js → chunk-43DJ3GGR.js} +4 -4
  17. package/dist/{chunk-L6ERHCQ2.js → chunk-57BVERWD.js} +3 -3
  18. package/dist/{chunk-AUNDBUHM.cjs → chunk-5HRVHEHE.cjs} +3 -3
  19. package/dist/{chunk-AUNDBUHM.cjs.map → chunk-5HRVHEHE.cjs.map} +1 -1
  20. package/dist/{chunk-6IB27I5K.cjs → chunk-6JYXGRJ3.cjs} +8 -8
  21. package/dist/{chunk-6IB27I5K.cjs.map → chunk-6JYXGRJ3.cjs.map} +1 -1
  22. package/dist/{chunk-NERASTO2.cjs → chunk-6ZFXIYH7.cjs} +3 -3
  23. package/dist/{chunk-NERASTO2.cjs.map → chunk-6ZFXIYH7.cjs.map} +1 -1
  24. package/dist/{chunk-IKXXXVUO.js → chunk-7TQUJ6BJ.js} +3 -3
  25. package/dist/{chunk-544RAXWO.cjs → chunk-7VMF6LIC.cjs} +19 -19
  26. package/dist/{chunk-544RAXWO.cjs.map → chunk-7VMF6LIC.cjs.map} +1 -1
  27. package/dist/{chunk-WTFEMOV5.cjs → chunk-ADB7QRX5.cjs} +16 -16
  28. package/dist/{chunk-WTFEMOV5.cjs.map → chunk-ADB7QRX5.cjs.map} +1 -1
  29. package/dist/{chunk-6CW5QSYV.cjs → chunk-AFGC62AL.cjs} +7 -7
  30. package/dist/{chunk-6CW5QSYV.cjs.map → chunk-AFGC62AL.cjs.map} +1 -1
  31. package/dist/{chunk-U4SVBE2M.js → chunk-AWPJH3UB.js} +4 -4
  32. package/dist/{chunk-B2OHBIAL.cjs → chunk-BKUZF7CW.cjs} +10 -11
  33. package/dist/chunk-BKUZF7CW.cjs.map +1 -0
  34. package/dist/{chunk-WR77IZUU.cjs → chunk-BPVOQLCA.cjs} +7 -7
  35. package/dist/{chunk-WR77IZUU.cjs.map → chunk-BPVOQLCA.cjs.map} +1 -1
  36. package/dist/{chunk-MCPGI6EI.js → chunk-BUSMGQJ4.js} +2 -2
  37. package/dist/{chunk-H3C6YECZ.js → chunk-D2PXPX56.js} +6 -6
  38. package/dist/{chunk-L6YJ6QTZ.js → chunk-DCUIT7SI.js} +2 -2
  39. package/dist/{chunk-HYRLK462.js → chunk-EDPCI2JC.js} +2 -2
  40. package/dist/{chunk-DPTTDHZ5.js → chunk-FAGQGGT3.js} +3 -3
  41. package/dist/{chunk-CNTG7OOO.js → chunk-FAXDWZQH.js} +12 -12
  42. package/dist/{chunk-7NUVLVSL.cjs → chunk-FJSK2RT7.cjs} +5 -5
  43. package/dist/{chunk-7NUVLVSL.cjs.map → chunk-FJSK2RT7.cjs.map} +1 -1
  44. package/dist/{chunk-P6OJQ2RN.js → chunk-FSX7DDLO.js} +8 -9
  45. package/dist/chunk-FSX7DDLO.js.map +1 -0
  46. package/dist/{chunk-XIUZT4TO.js → chunk-GE3QCXT7.js} +6 -7
  47. package/dist/chunk-GE3QCXT7.js.map +1 -0
  48. package/dist/{chunk-JY77VJAZ.js → chunk-GHUEVNNU.js} +3 -3
  49. package/dist/{chunk-4V2XYUQL.js → chunk-GLEPKX2R.js} +2 -2
  50. package/dist/{chunk-GZDT2AHJ.cjs → chunk-GRKC4PIX.cjs} +7 -7
  51. package/dist/{chunk-GZDT2AHJ.cjs.map → chunk-GRKC4PIX.cjs.map} +1 -1
  52. package/dist/{chunk-SLHIVEFW.cjs → chunk-HKLLKNRQ.cjs} +6 -9
  53. package/dist/chunk-HKLLKNRQ.cjs.map +1 -0
  54. package/dist/{chunk-2TIMJD4K.js → chunk-IBT535UH.js} +3 -3
  55. package/dist/{chunk-HR5MWA3B.cjs → chunk-IJW6YCJB.cjs} +5 -5
  56. package/dist/{chunk-HR5MWA3B.cjs.map → chunk-IJW6YCJB.cjs.map} +1 -1
  57. package/dist/{chunk-NNAEQR3Y.cjs → chunk-K6VEUJLY.cjs} +30 -30
  58. package/dist/{chunk-NNAEQR3Y.cjs.map → chunk-K6VEUJLY.cjs.map} +1 -1
  59. package/dist/{chunk-F5IRMMZ2.cjs → chunk-K73JO4FK.cjs} +7 -7
  60. package/dist/{chunk-F5IRMMZ2.cjs.map → chunk-K73JO4FK.cjs.map} +1 -1
  61. package/dist/{chunk-4HZIXRAJ.cjs → chunk-KF2OGUAD.cjs} +11 -12
  62. package/dist/chunk-KF2OGUAD.cjs.map +1 -0
  63. package/dist/{chunk-TJQNGJHP.js → chunk-KLHC5BHS.js} +4 -4
  64. package/dist/{chunk-XWMXEJVZ.js → chunk-KZKBZ2AV.js} +5 -7
  65. package/dist/chunk-KZKBZ2AV.js.map +1 -0
  66. package/dist/{chunk-DG3O5NV4.cjs → chunk-LLHR6QW3.cjs} +3 -3
  67. package/dist/{chunk-DG3O5NV4.cjs.map → chunk-LLHR6QW3.cjs.map} +1 -1
  68. package/dist/{chunk-GDRLVX2A.js → chunk-LXRNFQEI.js} +4 -4
  69. package/dist/{chunk-VXC7Z7XB.cjs → chunk-MKQVDEHI.cjs} +5 -6
  70. package/dist/chunk-MKQVDEHI.cjs.map +1 -0
  71. package/dist/{chunk-TNQ2ZZ7W.cjs → chunk-MUMTPMWD.cjs} +7 -7
  72. package/dist/{chunk-TNQ2ZZ7W.cjs.map → chunk-MUMTPMWD.cjs.map} +1 -1
  73. package/dist/{chunk-RHWZX7PB.js → chunk-NONYIHXD.js} +4 -4
  74. package/dist/{chunk-XPG56DLQ.cjs → chunk-NSA7ASZ7.cjs} +8 -8
  75. package/dist/{chunk-XPG56DLQ.cjs.map → chunk-NSA7ASZ7.cjs.map} +1 -1
  76. package/dist/{chunk-6NAOAKII.js → chunk-NWFGXLQP.js} +2 -2
  77. package/dist/{chunk-HLI4SOH3.cjs → chunk-NYGRVB2J.cjs} +45 -45
  78. package/dist/{chunk-HLI4SOH3.cjs.map → chunk-NYGRVB2J.cjs.map} +1 -1
  79. package/dist/{chunk-UUT2VEN5.cjs → chunk-OC2OBBGM.cjs} +7 -8
  80. package/dist/chunk-OC2OBBGM.cjs.map +1 -0
  81. package/dist/{chunk-3X6QVHTD.js → chunk-OERK3T7E.js} +3 -4
  82. package/dist/chunk-OERK3T7E.js.map +1 -0
  83. package/dist/{chunk-ZJWQPZ7E.js → chunk-OQWG7NLI.js} +3 -11
  84. package/dist/chunk-OQWG7NLI.js.map +1 -0
  85. package/dist/{chunk-U34INRFO.js → chunk-PP6HS4GR.js} +5 -16
  86. package/dist/chunk-PP6HS4GR.js.map +1 -0
  87. package/dist/{chunk-OGGZIFTI.cjs → chunk-PVNBH7XN.cjs} +36 -36
  88. package/dist/{chunk-OGGZIFTI.cjs.map → chunk-PVNBH7XN.cjs.map} +1 -1
  89. package/dist/{chunk-H46ZLPNJ.cjs → chunk-QDZVZY53.cjs} +7 -7
  90. package/dist/{chunk-H46ZLPNJ.cjs.map → chunk-QDZVZY53.cjs.map} +1 -1
  91. package/dist/{chunk-ENMDOQQO.cjs → chunk-R5WI5IGR.cjs} +6 -17
  92. package/dist/{chunk-ENMDOQQO.cjs.map → chunk-R5WI5IGR.cjs.map} +1 -1
  93. package/dist/{chunk-UTYY35QX.cjs → chunk-RZMQCVAS.cjs} +3 -3
  94. package/dist/{chunk-UTYY35QX.cjs.map → chunk-RZMQCVAS.cjs.map} +1 -1
  95. package/dist/{chunk-7FV2X62W.cjs → chunk-SJKD3WCV.cjs} +7 -7
  96. package/dist/{chunk-7FV2X62W.cjs.map → chunk-SJKD3WCV.cjs.map} +1 -1
  97. package/dist/{chunk-LUDK44NZ.cjs → chunk-SJPCBRKR.cjs} +3 -3
  98. package/dist/{chunk-LUDK44NZ.cjs.map → chunk-SJPCBRKR.cjs.map} +1 -1
  99. package/dist/{chunk-3TF2GZSG.js → chunk-SONL2RCW.js} +7 -7
  100. package/dist/{chunk-2IXCEKLI.js → chunk-SOS4K7VC.js} +2 -2
  101. package/dist/{chunk-WHQGJHMD.js → chunk-TOLNPD7S.js} +4 -4
  102. package/dist/{chunk-FE7S4RSK.js → chunk-U5KD4BWL.js} +7 -7
  103. package/dist/{chunk-FHOD3FUN.js → chunk-UTOTOWPS.js} +4 -4
  104. package/dist/{chunk-YIOHKQ6Y.cjs → chunk-VCG647BY.cjs} +5 -13
  105. package/dist/chunk-VCG647BY.cjs.map +1 -0
  106. package/dist/{chunk-N5NXKVFJ.cjs → chunk-VPN7AR7T.cjs} +10 -10
  107. package/dist/{chunk-N5NXKVFJ.cjs.map → chunk-VPN7AR7T.cjs.map} +1 -1
  108. package/dist/{chunk-6FXFKMJ5.js → chunk-XBIMNWE6.js} +3 -3
  109. package/dist/{chunk-Z3IJWYUD.js → chunk-XOUNVK45.js} +2 -2
  110. package/dist/{chunk-3VXUOAIJ.cjs → chunk-XR72A66Q.cjs} +3 -7
  111. package/dist/chunk-XR72A66Q.cjs.map +1 -0
  112. package/dist/{chunk-ULKWUKD2.cjs → chunk-YHSCUPP6.cjs} +22 -23
  113. package/dist/chunk-YHSCUPP6.cjs.map +1 -0
  114. package/dist/{chunk-S5CMZFX6.js → chunk-YPEJH57Z.js} +6 -7
  115. package/dist/chunk-YPEJH57Z.js.map +1 -0
  116. package/dist/{chunk-BO3KK3ZQ.js → chunk-YPPG7NLW.js} +2 -6
  117. package/dist/chunk-YPPG7NLW.js.map +1 -0
  118. package/dist/{chunk-PE2SLXUS.cjs → chunk-YWXS4IPH.cjs} +5 -5
  119. package/dist/{chunk-PE2SLXUS.cjs.map → chunk-YWXS4IPH.cjs.map} +1 -1
  120. package/dist/{chunk-UC4NYF6T.js → chunk-YYA5SWXD.js} +2 -2
  121. package/dist/{chunk-JFV56ISS.cjs → chunk-YZEALKC4.cjs} +6 -6
  122. package/dist/{chunk-JFV56ISS.cjs.map → chunk-YZEALKC4.cjs.map} +1 -1
  123. package/dist/{chunk-IHPSRTVW.js → chunk-Z3OEYDNI.js} +4 -7
  124. package/dist/chunk-Z3OEYDNI.js.map +1 -0
  125. package/dist/{chunk-MKC6V3SY.cjs → chunk-Z6FZ7GI5.cjs} +6 -6
  126. package/dist/{chunk-MKC6V3SY.cjs.map → chunk-Z6FZ7GI5.cjs.map} +1 -1
  127. package/dist/{chunk-NFD7MPX4.cjs → chunk-ZVA5KJAJ.cjs} +11 -11
  128. package/dist/{chunk-NFD7MPX4.cjs.map → chunk-ZVA5KJAJ.cjs.map} +1 -1
  129. package/dist/color-picker/index.cjs +4 -4
  130. package/dist/color-picker/index.js +3 -3
  131. package/dist/combobox/index.cjs +6 -6
  132. package/dist/combobox/index.js +5 -5
  133. package/dist/command-palette/index.cjs +3 -3
  134. package/dist/command-palette/index.js +2 -2
  135. package/dist/context-menu/index.cjs +6 -6
  136. package/dist/context-menu/index.js +5 -5
  137. package/dist/conversation/index.cjs +8 -8
  138. package/dist/conversation/index.js +7 -7
  139. package/dist/data-grid/index.cjs +15 -15
  140. package/dist/data-grid/index.js +14 -14
  141. package/dist/date-picker/index.cjs +8 -8
  142. package/dist/date-picker/index.js +7 -7
  143. package/dist/drawer/index.cjs +5 -5
  144. package/dist/drawer/index.js +4 -4
  145. package/dist/dropdown/index.cjs +3 -3
  146. package/dist/dropdown/index.js +2 -2
  147. package/dist/header/index.cjs +6 -6
  148. package/dist/header/index.js +5 -5
  149. package/dist/index.cjs +38 -38
  150. package/dist/index.js +37 -37
  151. package/dist/inline-edit/index.cjs +5 -5
  152. package/dist/inline-edit/index.js +4 -4
  153. package/dist/input/index.cjs +4 -4
  154. package/dist/input/index.js +3 -3
  155. package/dist/menu/index.cjs +5 -5
  156. package/dist/menu/index.js +4 -4
  157. package/dist/modal/index.cjs +5 -5
  158. package/dist/modal/index.js +4 -4
  159. package/dist/navigation/index.cjs +5 -5
  160. package/dist/navigation/index.js +4 -4
  161. package/dist/number-input/index.cjs +2 -4
  162. package/dist/number-input/index.cjs.map +1 -1
  163. package/dist/number-input/index.js +1 -3
  164. package/dist/page-layout/index.cjs +12 -12
  165. package/dist/page-layout/index.js +11 -11
  166. package/dist/pagination/index.cjs +8 -8
  167. package/dist/pagination/index.js +7 -7
  168. package/dist/popover/index.cjs +3 -3
  169. package/dist/popover/index.d.cts +1 -3
  170. package/dist/popover/index.d.ts +1 -3
  171. package/dist/popover/index.js +2 -2
  172. package/dist/segmented-control/index.cjs +4 -4
  173. package/dist/segmented-control/index.js +3 -3
  174. package/dist/select/index.cjs +6 -6
  175. package/dist/select/index.js +5 -5
  176. package/dist/snackbar/index.cjs +5 -5
  177. package/dist/snackbar/index.js +4 -4
  178. package/dist/split-button/index.cjs +6 -6
  179. package/dist/split-button/index.js +5 -5
  180. package/dist/split-chip/index.cjs +5 -5
  181. package/dist/split-chip/index.js +4 -4
  182. package/dist/table/index.cjs +13 -13
  183. package/dist/table/index.js +12 -12
  184. package/dist/tabs/index.cjs +3 -3
  185. package/dist/tabs/index.js +2 -2
  186. package/dist/tag-input/index.cjs +6 -6
  187. package/dist/tag-input/index.js +5 -5
  188. package/dist/textarea/index.cjs +4 -4
  189. package/dist/textarea/index.js +3 -3
  190. package/dist/theme-editor/index.cjs +11 -11
  191. package/dist/theme-editor/index.js +10 -10
  192. package/dist/theme-provider/index.cjs +3 -3
  193. package/dist/theme-provider/index.js +2 -2
  194. package/dist/toolbar/index.cjs +8 -8
  195. package/dist/toolbar/index.js +7 -7
  196. package/dist/tooltip/index.cjs +3 -3
  197. package/dist/tooltip/index.js +2 -2
  198. package/package.json +4 -2
  199. package/dist/chunk-3VXUOAIJ.cjs.map +0 -1
  200. package/dist/chunk-3X6QVHTD.js.map +0 -1
  201. package/dist/chunk-4HZIXRAJ.cjs.map +0 -1
  202. package/dist/chunk-4S57PE43.js.map +0 -1
  203. package/dist/chunk-B2OHBIAL.cjs.map +0 -1
  204. package/dist/chunk-BO3KK3ZQ.js.map +0 -1
  205. package/dist/chunk-CFVUUMQA.cjs.map +0 -1
  206. package/dist/chunk-IHPSRTVW.js.map +0 -1
  207. package/dist/chunk-P6OJQ2RN.js.map +0 -1
  208. package/dist/chunk-S5CMZFX6.js.map +0 -1
  209. package/dist/chunk-SLHIVEFW.cjs.map +0 -1
  210. package/dist/chunk-U34INRFO.js.map +0 -1
  211. package/dist/chunk-ULKWUKD2.cjs.map +0 -1
  212. package/dist/chunk-UUT2VEN5.cjs.map +0 -1
  213. package/dist/chunk-VXC7Z7XB.cjs.map +0 -1
  214. package/dist/chunk-XIUZT4TO.js.map +0 -1
  215. package/dist/chunk-XWMXEJVZ.js.map +0 -1
  216. package/dist/chunk-YIOHKQ6Y.cjs.map +0 -1
  217. package/dist/chunk-ZJWQPZ7E.js.map +0 -1
  218. /package/dist/{chunk-V5CM5TH3.js.map → chunk-2OBOD3GO.js.map} +0 -0
  219. /package/dist/{chunk-V64DICJK.js.map → chunk-363IKX3C.js.map} +0 -0
  220. /package/dist/{chunk-IC2PIK3E.js.map → chunk-43DJ3GGR.js.map} +0 -0
  221. /package/dist/{chunk-L6ERHCQ2.js.map → chunk-57BVERWD.js.map} +0 -0
  222. /package/dist/{chunk-IKXXXVUO.js.map → chunk-7TQUJ6BJ.js.map} +0 -0
  223. /package/dist/{chunk-U4SVBE2M.js.map → chunk-AWPJH3UB.js.map} +0 -0
  224. /package/dist/{chunk-MCPGI6EI.js.map → chunk-BUSMGQJ4.js.map} +0 -0
  225. /package/dist/{chunk-H3C6YECZ.js.map → chunk-D2PXPX56.js.map} +0 -0
  226. /package/dist/{chunk-L6YJ6QTZ.js.map → chunk-DCUIT7SI.js.map} +0 -0
  227. /package/dist/{chunk-HYRLK462.js.map → chunk-EDPCI2JC.js.map} +0 -0
  228. /package/dist/{chunk-DPTTDHZ5.js.map → chunk-FAGQGGT3.js.map} +0 -0
  229. /package/dist/{chunk-CNTG7OOO.js.map → chunk-FAXDWZQH.js.map} +0 -0
  230. /package/dist/{chunk-JY77VJAZ.js.map → chunk-GHUEVNNU.js.map} +0 -0
  231. /package/dist/{chunk-4V2XYUQL.js.map → chunk-GLEPKX2R.js.map} +0 -0
  232. /package/dist/{chunk-2TIMJD4K.js.map → chunk-IBT535UH.js.map} +0 -0
  233. /package/dist/{chunk-TJQNGJHP.js.map → chunk-KLHC5BHS.js.map} +0 -0
  234. /package/dist/{chunk-GDRLVX2A.js.map → chunk-LXRNFQEI.js.map} +0 -0
  235. /package/dist/{chunk-RHWZX7PB.js.map → chunk-NONYIHXD.js.map} +0 -0
  236. /package/dist/{chunk-6NAOAKII.js.map → chunk-NWFGXLQP.js.map} +0 -0
  237. /package/dist/{chunk-3TF2GZSG.js.map → chunk-SONL2RCW.js.map} +0 -0
  238. /package/dist/{chunk-2IXCEKLI.js.map → chunk-SOS4K7VC.js.map} +0 -0
  239. /package/dist/{chunk-WHQGJHMD.js.map → chunk-TOLNPD7S.js.map} +0 -0
  240. /package/dist/{chunk-FE7S4RSK.js.map → chunk-U5KD4BWL.js.map} +0 -0
  241. /package/dist/{chunk-FHOD3FUN.js.map → chunk-UTOTOWPS.js.map} +0 -0
  242. /package/dist/{chunk-6FXFKMJ5.js.map → chunk-XBIMNWE6.js.map} +0 -0
  243. /package/dist/{chunk-Z3IJWYUD.js.map → chunk-XOUNVK45.js.map} +0 -0
  244. /package/dist/{chunk-UC4NYF6T.js.map → chunk-YYA5SWXD.js.map} +0 -0
package/README.md CHANGED
@@ -82,8 +82,8 @@ registerIcons({ Plus, Download });
82
82
  ```
83
83
 
84
84
  `import 'eidos-ui/lucide-icons'` registers every Lucide icon by name, at the cost of
85
- the whole icon set in your bundle. Resolving an _unregistered_ Lucide name is
86
- deprecated and is removed in 4.0.
85
+ the whole icon set in your bundle. An unregistered name is treated as icon-font
86
+ classes.
87
87
 
88
88
  ## Components
89
89
 
@@ -1,15 +1,15 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkPE2SLXUScjs = require('../chunk-PE2SLXUS.cjs');
4
- require('../chunk-XPG56DLQ.cjs');
3
+ var _chunkYWXS4IPHcjs = require('../chunk-YWXS4IPH.cjs');
4
+ require('../chunk-NSA7ASZ7.cjs');
5
5
  require('../chunk-I6UOIS4J.cjs');
6
- require('../chunk-UTYY35QX.cjs');
7
- require('../chunk-ENMDOQQO.cjs');
6
+ require('../chunk-RZMQCVAS.cjs');
7
+ require('../chunk-R5WI5IGR.cjs');
8
8
  require('../chunk-CJT7L764.cjs');
9
9
  require('../chunk-KXDGW6LJ.cjs');
10
10
  require('../chunk-75Q5OS7L.cjs');
11
11
  require('../chunk-DZUJEN5N.cjs');
12
12
 
13
13
 
14
- exports.Alert = _chunkPE2SLXUScjs.Alert;
14
+ exports.Alert = _chunkYWXS4IPHcjs.Alert;
15
15
  //# sourceMappingURL=index.cjs.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Alert
3
- } from "../chunk-6FXFKMJ5.js";
4
- import "../chunk-JY77VJAZ.js";
3
+ } from "../chunk-XBIMNWE6.js";
4
+ import "../chunk-GHUEVNNU.js";
5
5
  import "../chunk-66R54X6R.js";
6
- import "../chunk-MCPGI6EI.js";
7
- import "../chunk-U34INRFO.js";
6
+ import "../chunk-BUSMGQJ4.js";
7
+ import "../chunk-PP6HS4GR.js";
8
8
  import "../chunk-V3T7RO4F.js";
9
9
  import "../chunk-BDH2MXJW.js";
10
10
  import "../chunk-U32K2H3N.js";
@@ -2,10 +2,10 @@
2
2
 
3
3
 
4
4
 
5
- var _chunkXPG56DLQcjs = require('../chunk-XPG56DLQ.cjs');
5
+ var _chunkNSA7ASZ7cjs = require('../chunk-NSA7ASZ7.cjs');
6
6
  require('../chunk-I6UOIS4J.cjs');
7
- require('../chunk-UTYY35QX.cjs');
8
- require('../chunk-ENMDOQQO.cjs');
7
+ require('../chunk-RZMQCVAS.cjs');
8
+ require('../chunk-R5WI5IGR.cjs');
9
9
  require('../chunk-CJT7L764.cjs');
10
10
  require('../chunk-KXDGW6LJ.cjs');
11
11
  require('../chunk-75Q5OS7L.cjs');
@@ -13,5 +13,5 @@ require('../chunk-DZUJEN5N.cjs');
13
13
 
14
14
 
15
15
 
16
- exports.Button = _chunkXPG56DLQcjs.Button; exports.IconButton = _chunkXPG56DLQcjs.IconButton;
16
+ exports.Button = _chunkNSA7ASZ7cjs.Button; exports.IconButton = _chunkNSA7ASZ7cjs.IconButton;
17
17
  //# sourceMappingURL=index.cjs.map
@@ -2,10 +2,10 @@ import "../chunk-N5JDL4VE.js";
2
2
  import {
3
3
  Button,
4
4
  IconButton
5
- } from "../chunk-JY77VJAZ.js";
5
+ } from "../chunk-GHUEVNNU.js";
6
6
  import "../chunk-66R54X6R.js";
7
- import "../chunk-MCPGI6EI.js";
8
- import "../chunk-U34INRFO.js";
7
+ import "../chunk-BUSMGQJ4.js";
8
+ import "../chunk-PP6HS4GR.js";
9
9
  import "../chunk-V3T7RO4F.js";
10
10
  import "../chunk-BDH2MXJW.js";
11
11
  import "../chunk-U32K2H3N.js";
@@ -1,14 +1,14 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('../chunk-FQZ6F7FQ.cjs');
2
2
 
3
3
 
4
- var _chunkWR77IZUUcjs = require('../chunk-WR77IZUU.cjs');
5
- require('../chunk-UTYY35QX.cjs');
6
- require('../chunk-ENMDOQQO.cjs');
4
+ var _chunkBPVOQLCAcjs = require('../chunk-BPVOQLCA.cjs');
5
+ require('../chunk-RZMQCVAS.cjs');
6
+ require('../chunk-R5WI5IGR.cjs');
7
7
  require('../chunk-CJT7L764.cjs');
8
8
  require('../chunk-KXDGW6LJ.cjs');
9
9
  require('../chunk-75Q5OS7L.cjs');
10
10
  require('../chunk-DZUJEN5N.cjs');
11
11
 
12
12
 
13
- exports.Chip = _chunkWR77IZUUcjs.Chip;
13
+ exports.Chip = _chunkBPVOQLCAcjs.Chip;
14
14
  //# sourceMappingURL=index.cjs.map
@@ -1,9 +1,9 @@
1
1
  import "../chunk-TPNCV7KA.js";
2
2
  import {
3
3
  Chip
4
- } from "../chunk-2TIMJD4K.js";
5
- import "../chunk-MCPGI6EI.js";
6
- import "../chunk-U34INRFO.js";
4
+ } from "../chunk-IBT535UH.js";
5
+ import "../chunk-BUSMGQJ4.js";
6
+ import "../chunk-PP6HS4GR.js";
7
7
  import "../chunk-V3T7RO4F.js";
8
8
  import "../chunk-BDH2MXJW.js";
9
9
  import "../chunk-U32K2H3N.js";
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  Button
3
- } from "./chunk-JY77VJAZ.js";
3
+ } from "./chunk-GHUEVNNU.js";
4
4
  import {
5
5
  renderIcon,
6
6
  useDialogFocus,
7
7
  useIsClient
8
- } from "./chunk-U34INRFO.js";
8
+ } from "./chunk-PP6HS4GR.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-V5CM5TH3.js.map
123
+ //# sourceMappingURL=chunk-2OBOD3GO.js.map
@@ -1,8 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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
-
4
-
5
- var _chunkENMDOQQOcjs = require('./chunk-ENMDOQQO.cjs');
3
+ var _chunkR5WI5IGRcjs = require('./chunk-R5WI5IGR.cjs');
6
4
 
7
5
  // src/components/Tabs/Tabs.component.tsx
8
6
  var _react = require('react'); var _react2 = _interopRequireDefault(_react);
@@ -47,7 +45,7 @@ var Tab = ({
47
45
  `eidos-tab--${size}`,
48
46
  isActive && "eidos-tab--active",
49
47
  disabled && "eidos-tab--disabled",
50
- fullWidth && _chunkENMDOQQOcjs.fullWidthModifier.call(void 0, "eidos-tab"),
48
+ fullWidth && "eidos-tab--full-width",
51
49
  className
52
50
  ].filter(Boolean).join(" ");
53
51
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
@@ -64,7 +62,7 @@ var Tab = ({
64
62
  onKeyDown: handleKeyDown,
65
63
  type: "button",
66
64
  children: [
67
- icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-icon", children: _chunkENMDOQQOcjs.renderIcon.call(void 0, icon, "eidos-tab-icon-svg") }),
65
+ icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-icon", children: _chunkR5WI5IGRcjs.renderIcon.call(void 0, icon, "eidos-tab-icon-svg") }),
68
66
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-label", children })
69
67
  ]
70
68
  }
@@ -188,11 +186,11 @@ var Tabs = ({
188
186
  const listClasses = [
189
187
  "eidos-tabs-list",
190
188
  `eidos-tabs-list--${size}`,
191
- fullWidth && _chunkENMDOQQOcjs.fullWidthModifier.call(void 0, "eidos-tabs-list"),
189
+ fullWidth && "eidos-tabs-list--full-width",
192
190
  // With buttons, they are the affordance - a native scrollbar underneath
193
191
  // them is redundant, and on a space-taking one it would also sit over the
194
192
  // `line` variant's rule.
195
- hasScrollButtons && _chunkENMDOQQOcjs.dualModifier.call(void 0, "eidos-tabs-list", "hide-scrollbar", "hideScrollbar")
193
+ hasScrollButtons && "eidos-tabs-list--hide-scrollbar"
196
194
  ].filter(Boolean).join(" ");
197
195
  const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;
198
196
  const showNextButton = hasScrollButtons && scrollState.canScrollNext;
@@ -251,4 +249,4 @@ Tabs.displayName = "Tabs";
251
249
 
252
250
 
253
251
  exports.Tab = Tab; exports.TabPanel = TabPanel; exports.Tabs = Tabs;
254
- //# sourceMappingURL=chunk-CFVUUMQA.cjs.map
252
+ //# sourceMappingURL=chunk-2URFSWJT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-2URFSWJT.cjs","../src/components/Tabs/Tabs.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-2URFSWJT.cjs","sourcesContent":[null,"import React, { useState, useRef, useContext, useEffect, useLayoutEffect } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { renderIcon } from '../../utils';\nimport type { TabsProps, TabProps, TabPanelProps, TabsContextValue } from './Tabs.types';\n\n// ============================================================================\n// CONTEXT\n// ============================================================================\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\n\nconst useTabsContext = (): TabsContextValue => {\n const ctx = useContext(TabsContext);\n if (!ctx) throw new Error('Tab/TabPanel must be used inside <Tabs>');\n return ctx;\n};\n\n// ============================================================================\n// TAB - individual tab trigger button\n// Defined before Tabs so Tabs can use `child.type === Tab` for child separation.\n// ============================================================================\n\nexport const Tab: React.FC<TabProps> = ({\n value,\n children,\n disabled = false,\n icon,\n className = '',\n}) => {\n const { activeValue, onSelect, size, fullWidth, listRef } = useTabsContext();\n const isActive = activeValue === value;\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLButtonElement>) => {\n const list = listRef.current;\n if (!list) return;\n\n const allTabs = Array.from(\n list.querySelectorAll('[role=\"tab\"]:not([disabled])'),\n ) as HTMLElement[];\n const currentIndex = allTabs.indexOf(e.currentTarget);\n if (currentIndex === -1) return;\n\n let targetIndex = -1;\n if (e.key === 'ArrowRight') targetIndex = (currentIndex + 1) % allTabs.length;\n else if (e.key === 'ArrowLeft')\n targetIndex = (currentIndex - 1 + allTabs.length) % allTabs.length;\n else if (e.key === 'Home') targetIndex = 0;\n else if (e.key === 'End') targetIndex = allTabs.length - 1;\n\n if (targetIndex !== -1) {\n e.preventDefault();\n allTabs[targetIndex].focus();\n }\n };\n\n const tabClasses = [\n 'eidos-tab',\n `eidos-tab--${size}`,\n isActive && 'eidos-tab--active',\n disabled && 'eidos-tab--disabled',\n fullWidth && 'eidos-tab--full-width',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <button\n id={`eidos-tab-${value}`}\n role=\"tab\"\n aria-selected={isActive}\n aria-controls={`eidos-tabpanel-${value}`}\n tabIndex={isActive ? 0 : -1}\n disabled={disabled}\n className={tabClasses}\n onClick={() => !disabled && onSelect(value)}\n onKeyDown={handleKeyDown}\n type=\"button\"\n >\n {icon && <span className=\"eidos-tab-icon\">{renderIcon(icon, 'eidos-tab-icon-svg')}</span>}\n <span className=\"eidos-tab-label\">{children}</span>\n </button>\n );\n};\n\nTab.displayName = 'Tab';\n\n// ============================================================================\n// TAB PANEL - content region shown when its value matches the active tab\n// Defined before Tabs for the same `child.type === TabPanel` check.\n// ============================================================================\n\nexport const TabPanel: React.FC<TabPanelProps> = ({ value, children, className = '' }) => {\n const { activeValue } = useTabsContext();\n const isActive = activeValue === value;\n\n if (!isActive) return null;\n\n return (\n <div\n id={`eidos-tabpanel-${value}`}\n role=\"tabpanel\"\n aria-labelledby={`eidos-tab-${value}`}\n tabIndex={0}\n className={['eidos-tab-panel', className].filter(Boolean).join(' ')}\n >\n {children}\n </div>\n );\n};\n\nTabPanel.displayName = 'TabPanel';\n\n// ============================================================================\n// TABS - root container; provides context, separates tab/panel children\n// ============================================================================\n\nexport const Tabs: React.FC<TabsProps> = ({\n value,\n defaultValue,\n onChange,\n variant = 'line',\n size = 'md',\n color = 'primary',\n fullWidth = false,\n scrollButtons = 'auto',\n className = '',\n children,\n}) => {\n const isControlled = value !== undefined;\n const [localValue, setLocalValue] = useState(defaultValue ?? '');\n const activeValue = isControlled ? value! : localValue;\n\n // Separate Tab and TabPanel children so the list and panels render in\n // distinct DOM regions, regardless of how the consumer orders them.\n const tabChildren: React.ReactElement[] = [];\n const panelChildren: React.ReactElement[] = [];\n\n React.Children.forEach(children, (child) => {\n if (!React.isValidElement(child)) return;\n if (child.type === Tab) {\n tabChildren.push(child);\n } else if (child.type === TabPanel) {\n panelChildren.push(child);\n }\n });\n\n const listRef = useRef<HTMLDivElement>(null);\n const indicatorRef = useRef<HTMLSpanElement>(null);\n // Tracks whether the indicator has been positioned at least once so we can\n // skip the CSS transition on the very first render and avoid it animating\n // from the top-left corner to the initial tab.\n const hasPositioned = useRef(false);\n\n useLayoutEffect(() => {\n if (variant !== 'line') return;\n const list = listRef.current;\n const indicator = indicatorRef.current;\n if (!list || !indicator) return;\n\n const activeTab = list.querySelector('[aria-selected=\"true\"]') as HTMLElement | null;\n if (!activeTab) return;\n\n // Suppress the CSS transition on the initial paint so the indicator snaps\n // into place rather than sliding from 0.\n if (!hasPositioned.current) {\n indicator.style.transition = 'none';\n }\n\n indicator.style.left = `${activeTab.offsetLeft}px`;\n indicator.style.width = `${activeTab.offsetWidth}px`;\n\n if (!hasPositioned.current) {\n // Force a synchronous reflow so the browser commits the no-transition\n // position before we re-enable the transition for future clicks.\n void indicator.offsetWidth;\n indicator.style.transition = '';\n hasPositioned.current = true;\n }\n }, [activeValue, variant, fullWidth]);\n\n // The list scrolls horizontally when the strip is wider than its container,\n // so an activated tab can sit outside the scrollport - reachable by keyboard\n // (`End`) or by a controlled `value` change, but invisible. `scrollLeft` is\n // adjusted directly rather than via `scrollIntoView`, which walks the whole\n // ancestor chain and would scroll the page vertically when the strip is below\n // the fold.\n useLayoutEffect(() => {\n const list = listRef.current;\n if (!list) return;\n\n const activeTab = list.querySelector('[aria-selected=\"true\"]') as HTMLElement | null;\n if (!activeTab) return;\n\n const left = activeTab.offsetLeft;\n const right = left + activeTab.offsetWidth;\n\n if (left < list.scrollLeft) {\n list.scrollLeft = left;\n } else if (right > list.scrollLeft + list.clientWidth) {\n list.scrollLeft = right - list.clientWidth;\n }\n }, [activeValue]);\n\n // Whether either end of the strip has content hidden past it. Drives both\n // the presence of the scroll buttons (neither end scrollable = the strip\n // fits, so no buttons) and their disabled state at the extremes.\n const [scrollState, setScrollState] = useState({ canScrollPrev: false, canScrollNext: false });\n const hasScrollButtons = scrollButtons !== 'none';\n\n useEffect(() => {\n if (!hasScrollButtons) return;\n const list = listRef.current;\n if (!list) return;\n\n const update = () => {\n const maxScroll = list.scrollWidth - list.clientWidth;\n // 1px of tolerance: fractional layout widths leave a sub-pixel remainder\n // at either end that would otherwise keep a button enabled for a scroll\n // that can no longer move anything.\n const canScrollPrev = list.scrollLeft > 1;\n const canScrollNext = list.scrollLeft < maxScroll - 1;\n setScrollState((previous) =>\n previous.canScrollPrev === canScrollPrev && previous.canScrollNext === canScrollNext\n ? previous\n : { canScrollPrev, canScrollNext },\n );\n };\n\n update();\n list.addEventListener('scroll', update, { passive: true });\n\n // The list's own box stays the same width when a tab's label reflows or a\n // font finishes loading, so the tabs have to be observed as well as the\n // container - only their sizes tell us the strip started overflowing.\n const observer = new ResizeObserver(update);\n observer.observe(list);\n Array.from(list.children).forEach((child) => observer.observe(child));\n\n return () => {\n list.removeEventListener('scroll', update);\n observer.disconnect();\n };\n }, [hasScrollButtons, tabChildren.length, size, variant, fullWidth]);\n\n const scrollByStep = (direction: -1 | 1) => {\n const list = listRef.current;\n if (!list) return;\n\n // A step just short of a full page keeps a tab of context on screen, the\n // same way a paged scrollbar click does.\n const step = list.clientWidth * 0.8;\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n list.scrollBy({ left: direction * step, behavior: reducedMotion ? 'auto' : 'smooth' });\n };\n\n const onSelect = (newValue: string) => {\n if (!isControlled) {\n setLocalValue(newValue);\n }\n onChange?.(newValue);\n };\n\n const rootClasses = ['eidos-tabs', `eidos-tabs--${variant}`, `eidos-tabs--${color}`, className]\n .filter(Boolean)\n .join(' ');\n\n const listClasses = [\n 'eidos-tabs-list',\n `eidos-tabs-list--${size}`,\n fullWidth && 'eidos-tabs-list--full-width',\n // With buttons, they are the affordance - a native scrollbar underneath\n // them is redundant, and on a space-taking one it would also sit over the\n // `line` variant's rule.\n hasScrollButtons && 'eidos-tabs-list--hide-scrollbar',\n ]\n .filter(Boolean)\n .join(' ');\n\n // Each button exists only while its own direction has somewhere to go: none\n // at all when the strip fits, and none at the end you have reached. A\n // disabled button would be pointing at nothing. They are positioned\n // absolutely, so appearing and disappearing never moves the tabs.\n const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;\n const showNextButton = hasScrollButtons && scrollState.canScrollNext;\n\n const scrollButtonClasses = (direction: 'prev' | 'next') =>\n [\n 'eidos-tabs-scroll-button',\n `eidos-tabs-scroll-button--${direction}`,\n `eidos-tabs-scroll-button--${size}`,\n ].join(' ');\n\n const contextValue: TabsContextValue = {\n activeValue,\n onSelect,\n variant,\n size,\n color,\n fullWidth,\n listRef,\n };\n\n return (\n <TabsContext.Provider value={contextValue}>\n <div className={rootClasses}>\n {/* The buttons are siblings of the tab list, never children of it:\n `role=\"tablist\"` only accepts tabs. They are also hidden from\n assistive tech and skipped by Tab, because they are a pointer\n affordance for something the keyboard already does - arrow keys\n move between tabs and scroll the active one into view. */}\n <div className=\"eidos-tabs-bar\">\n {showPrevButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('prev')}\n onClick={() => scrollByStep(-1)}\n // `tabIndex={-1}` keeps these out of the tab order but does not\n // stop a click from focusing them, and focus inside an\n // `aria-hidden` subtree is an error the browser reports\n // (\"Blocked aria-hidden on an element because its descendant\n // retained focus\"). Suppressing the default mousedown keeps\n // them unfocusable by pointer too; the click still fires.\n // `inert` would prevent the click as well, so it is no help.\n onMouseDown={(event) => event.preventDefault()}\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronLeft className=\"eidos-tabs-scroll-button-icon\" />\n </button>\n )}\n\n <div ref={listRef} className={listClasses} role=\"tablist\">\n {tabChildren}\n {variant === 'line' && (\n <span ref={indicatorRef} className=\"eidos-tabs-indicator\" aria-hidden=\"true\" />\n )}\n </div>\n\n {showNextButton && (\n <button\n type=\"button\"\n className={scrollButtonClasses('next')}\n onClick={() => scrollByStep(1)}\n onMouseDown={(event) => event.preventDefault()} // see the prev button\n tabIndex={-1}\n aria-hidden=\"true\"\n >\n <ChevronRight className=\"eidos-tabs-scroll-button-icon\" />\n </button>\n )}\n </div>\n\n <div className=\"eidos-tabs-panels\">{panelChildren}</div>\n </div>\n </TabsContext.Provider>\n );\n};\n\nTabs.displayName = 'Tabs';\n"]}
@@ -1,14 +1,13 @@
1
1
  import {
2
2
  Input
3
- } from "./chunk-XIUZT4TO.js";
3
+ } from "./chunk-GE3QCXT7.js";
4
4
  import {
5
5
  Dropdown
6
- } from "./chunk-3X6QVHTD.js";
6
+ } from "./chunk-OERK3T7E.js";
7
7
  import {
8
8
  devWarn,
9
- fullWidthModifier,
10
9
  renderIcon
11
- } from "./chunk-U34INRFO.js";
10
+ } from "./chunk-PP6HS4GR.js";
12
11
 
13
12
  // src/components/Select/Select.component.tsx
14
13
  import React, { useState, useCallback, useRef, useEffect, useMemo } from "react";
@@ -292,7 +291,7 @@ var Select = React.forwardRef(
292
291
  "div",
293
292
  {
294
293
  ref: triggerRef,
295
- className: `eidos-select-trigger ${fullWidth ? fullWidthModifier("eidos-select-trigger") : ""}`,
294
+ className: `eidos-select-trigger ${fullWidth ? "eidos-select-trigger--full-width" : ""}`,
296
295
  onKeyDown: handleKeyDown,
297
296
  tabIndex: disabled ? -1 : void 0,
298
297
  role: "combobox",
@@ -327,7 +326,7 @@ var Select = React.forwardRef(
327
326
  "div",
328
327
  {
329
328
  ref,
330
- className: `${"eidos-select-container"} ${fullWidth ? fullWidthModifier("eidos-select-container") : ""} ${className}`,
329
+ className: `${"eidos-select-container"} ${fullWidth ? "eidos-select-container--full-width" : ""} ${className}`,
331
330
  children: /* @__PURE__ */ jsx(
332
331
  Dropdown,
333
332
  {
@@ -354,4 +353,4 @@ Select.displayName = "Select";
354
353
  export {
355
354
  Select
356
355
  };
357
- //# sourceMappingURL=chunk-4S57PE43.js.map
356
+ //# sourceMappingURL=chunk-2WDL2ZVP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Select/Select.component.tsx"],"sourcesContent":["import React, { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport { X, Check } from 'lucide-react';\nimport { Input } from '../Input/Input.component';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport type { SelectProps, SelectOption } from './Select.types';\nimport { renderIcon, devWarn } from '../../utils';\n\nexport const Select = React.forwardRef<HTMLDivElement, SelectProps>(\n (\n {\n options = [],\n value,\n defaultValue,\n onChange,\n className = '',\n multiple = false,\n label,\n placeholder = 'Select an option...',\n disabled = false,\n inputProps = {},\n name,\n id,\n required = false,\n fullWidth = false,\n minWidth,\n maxWidth,\n minHeight,\n maxHeight = '300px',\n autoWidth = true,\n clearable = true,\n autoOpen = false,\n dropdownProps = {},\n },\n ref,\n ) => {\n const isControlled = value !== undefined;\n\n // Lazy initializer: seed from defaultValue in uncontrolled mode.\n const [selectedValues, setSelectedValues] = useState<Set<string>>(() => {\n if (defaultValue !== undefined) {\n const vals = Array.isArray(defaultValue) ? defaultValue : [defaultValue];\n return new Set(vals.filter((v) => v !== ''));\n }\n return new Set();\n });\n\n const [focusedIndex, setFocusedIndex] = useState(-1);\n // `Select` owns the open state and hands it to `Dropdown` as a controlled\n // value. It used to keep this flag *and* force the dropdown closed by\n // remounting it through a changing `key`, because `Dropdown`'s own state was\n // private - which meant this flag drove the ARIA attributes while reaching\n // nothing that renders, so the keyboard could not open the listbox at all.\n const [isOpen, setIsOpen] = useState(autoOpen);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const optionRefs = useRef<(HTMLDivElement | null)[]>([]);\n\n // Kept in sync every render so the mount-only callback ref below can\n // read the latest values without needing them in its dependency array\n // (see `handleOptionsMount`).\n const optionsRef = useRef(options);\n optionsRef.current = options;\n const selectedValuesRef = useRef(selectedValues);\n selectedValuesRef.current = selectedValues;\n\n useEffect(() => {\n if (value !== undefined) {\n const values = Array.isArray(value) ? value : [value];\n\n const validValues = values.filter((v) => v !== '');\n setSelectedValues(new Set(validValues));\n }\n }, [value]);\n\n useEffect(() => {\n setFocusedIndex(-1);\n }, [options]);\n\n useEffect(() => {\n optionRefs.current = optionRefs.current.slice(0, options.length);\n }, [options.length]);\n\n const handleOptionSelect = useCallback(\n (option: SelectOption) => {\n if (option.disabled) return;\n\n const newSelectedValues = new Set(selectedValues);\n\n if (multiple) {\n if (newSelectedValues.has(option.value)) {\n newSelectedValues.delete(option.value);\n } else {\n newSelectedValues.add(option.value);\n }\n } else {\n if (newSelectedValues.has(option.value)) {\n newSelectedValues.clear();\n } else {\n newSelectedValues.clear();\n newSelectedValues.add(option.value);\n }\n }\n\n // In uncontrolled mode, own the state directly.\n // In controlled mode, let the parent drive via value prop + useEffect sync.\n if (!isControlled) {\n setSelectedValues(newSelectedValues);\n }\n\n if (onChange) {\n const newValue = multiple\n ? Array.from(newSelectedValues)\n : Array.from(newSelectedValues)[0] || '';\n onChange(newValue);\n }\n\n if (!multiple) {\n setIsOpen(false);\n // Focus is returned explicitly because a click lands on an option\n // `div`, which is not focusable - without this, choosing with the\n // mouse would leave focus on `<body>` and the field would be\n // unreachable by keyboard until tabbed to again.\n inputRef.current?.focus();\n }\n },\n [multiple, onChange, selectedValues, isControlled],\n );\n\n const handleClear = useCallback(\n (e?: React.MouseEvent) => {\n if (e) {\n e.stopPropagation();\n }\n if (!isControlled) {\n setSelectedValues(new Set());\n }\n\n setIsOpen(false);\n inputRef.current?.focus();\n if (onChange) {\n onChange(multiple ? [] : '');\n }\n },\n [multiple, onChange, isControlled],\n );\n\n // A form control with no accessible name is announced as just \"combobox\".\n // `Select` was the only field in the library that could not be labelled\n // without knowing about `inputProps`, and three call sites duly shipped\n // without one - so the gap is closed from both ends: a first-class `label`\n // prop, and this warning.\n //\n // Measured from the DOM rather than from props, because a caller may name\n // the field with an external `<label for>` - `Pagination`'s page-size\n // picker does exactly that, and a props-only check would cry wolf at it.\n // `HTMLInputElement.labels` covers both wrapping and `for` labels.\n useEffect(() => {\n const element = inputRef.current;\n if (!element) return;\n const named =\n (element.labels?.length ?? 0) > 0 ||\n element.hasAttribute('aria-label') ||\n element.hasAttribute('aria-labelledby');\n if (!named) {\n devWarn(\n 'select-missing-label',\n 'Select: no accessible name. Pass `label` for a visible one, or `inputProps={{ \"aria-label\": \"...\" }}` where it must stay visually unlabelled - otherwise the field is announced as just \"combobox\". A placeholder is not a label, and disappears as soon as something is chosen.',\n );\n }\n }, []);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (disabled) return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(0);\n } else {\n setFocusedIndex((prev) => {\n const nextIndex = prev < options.length - 1 ? prev + 1 : 0;\n\n setTimeout(() => {\n optionRefs.current[nextIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }, 0);\n return nextIndex;\n });\n }\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(options.length - 1);\n } else {\n setFocusedIndex((prev) => {\n const nextIndex = prev > 0 ? prev - 1 : options.length - 1;\n\n setTimeout(() => {\n optionRefs.current[nextIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }, 0);\n return nextIndex;\n });\n }\n break;\n\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setFocusedIndex(0);\n } else if (focusedIndex >= 0 && focusedIndex < options.length) {\n const focusedOption = options[focusedIndex];\n handleOptionSelect(focusedOption);\n }\n break;\n\n case 'Escape':\n e.preventDefault();\n if (isOpen) {\n setIsOpen(false);\n setFocusedIndex(-1);\n }\n break;\n\n case 'Home':\n e.preventDefault();\n if (isOpen) {\n setFocusedIndex(0);\n optionRefs.current[0]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n break;\n\n case 'End':\n e.preventDefault();\n if (isOpen) {\n const lastIndex = options.length - 1;\n setFocusedIndex(lastIndex);\n optionRefs.current[lastIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n break;\n\n default:\n if (isOpen && e.key.length === 1 && /[a-zA-Z0-9]/.test(e.key)) {\n const searchChar = e.key.toLowerCase();\n const foundIndex = options.findIndex(\n (option, index) =>\n index > focusedIndex && option.label.toLowerCase().startsWith(searchChar),\n );\n\n if (foundIndex !== -1) {\n setFocusedIndex(foundIndex);\n optionRefs.current[foundIndex]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n } else {\n const foundFromStart = options.findIndex((option) =>\n option.label.toLowerCase().startsWith(searchChar),\n );\n if (foundFromStart !== -1) {\n setFocusedIndex(foundFromStart);\n optionRefs.current[foundFromStart]?.scrollIntoView({\n block: 'nearest',\n behavior: 'smooth',\n });\n }\n }\n }\n break;\n }\n },\n [disabled, isOpen, options, focusedIndex, handleOptionSelect],\n );\n\n // Scrolls the first selected option into view. Attached as the options\n // list's own ref below with an empty dependency array, so its identity\n // never changes and React only invokes it on genuine DOM mount/unmount -\n // i.e. exactly when the dropdown opens/closes (Dropdown unmounts its\n // `content` entirely while closed), not on every re-render while open.\n const handleOptionsMount = useCallback((el: HTMLDivElement | null) => {\n if (!el) return;\n const idx = optionsRef.current.findIndex((option) =>\n selectedValuesRef.current.has(option.value),\n );\n if (idx === -1) return;\n optionRefs.current[idx]?.scrollIntoView({ block: 'nearest' });\n }, []);\n\n // Past this many selections the full comma-joined label list becomes\n // unreadable in the trigger, so we switch to a compact \"N selected\" label.\n const COMPACT_LABEL_THRESHOLD = 2;\n\n const displayValue = useMemo(() => {\n if (selectedValues.size === 0) return '';\n\n if (multiple && selectedValues.size > COMPACT_LABEL_THRESHOLD) {\n return `${selectedValues.size} selected`;\n }\n\n const selectedOptions = options.filter((option) => selectedValues.has(option.value));\n const text = selectedOptions.map((option) => option.label).join(', ');\n return text;\n }, [options, selectedValues, multiple]);\n\n const selectContent = useMemo(\n () => (\n <div className={'eidos-select-options'} ref={handleOptionsMount}>\n {options.map((option, index) => {\n const isSelected = selectedValues.has(option.value);\n const isFocused = index === focusedIndex;\n return (\n <div\n key={option.id}\n // The trigger points `aria-activedescendant` at\n // `${id}-option-${focusedIndex}`, and nothing carried that id -\n // so the moment an option was hovered or arrowed to, the\n // attribute referenced an element that did not exist\n // (`aria-valid-attr-value`, critical). Invisible to axe until a\n // story left the listbox open, because the attribute is only\n // set once something is focused.\n id={`${id || 'select'}-option-${index}`}\n ref={(el) => {\n optionRefs.current[index] = el;\n }}\n className={`\n\t\t\t\t\t\t\t\t\t\t${'eidos-select-option'}\n\t\t\t\t\t\t\t\t\t\t${isSelected ? 'eidos-select-option--selected' : ''}\n\t\t\t\t\t\t\t\t\t\t${option.disabled ? 'eidos-select-option--disabled' : ''}\n\t\t\t\t\t\t\t\t\t\t${isFocused ? 'eidos-select-option--focused' : ''}\n\t\t\t\t\t\t\t\t\t`.trim()}\n onClick={() => handleOptionSelect(option)}\n onMouseEnter={() => setFocusedIndex(index)}\n role=\"option\"\n aria-selected={isSelected}\n aria-disabled={option.disabled}\n >\n {option.icon && renderIcon(option.icon, 'eidos-select-option-icon')}\n <span className={'eidos-select-option-label'}>{option.label}</span>\n {isSelected && <Check className={'eidos-select-option-check-icon'} />}\n </div>\n );\n })}\n </div>\n ),\n [options, selectedValues, focusedIndex, handleOptionSelect, handleOptionsMount, id],\n );\n\n const triggerElement = (\n <div\n ref={triggerRef}\n className={`eidos-select-trigger ${fullWidth ? 'eidos-select-trigger--full-width' : ''}`}\n onKeyDown={handleKeyDown}\n tabIndex={disabled ? -1 : undefined}\n role=\"combobox\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n // Only while the listbox exists. An `aria-controls` pointing at an id\n // that is not in the document is invalid, and the listbox only renders\n // while open - `Combobox`, `TagInput` and `CommandPalette` already gate\n // theirs this way. It could not be gated here before, because `isOpen`\n // did not track whether the panel had actually rendered.\n aria-controls={isOpen ? `${id || 'select'}-options` : undefined}\n aria-activedescendant={\n focusedIndex >= 0 ? `${id || 'select'}-option-${focusedIndex}` : undefined\n }\n >\n <Input\n ref={inputRef}\n value={selectedValues.size > 0 ? displayValue : ''}\n placeholder={selectedValues.size === 0 ? placeholder : ''}\n posIcon={selectedValues.size > 0 && clearable ? X : undefined}\n posIconButton={selectedValues.size > 0 && clearable}\n onPosIconClick={selectedValues.size > 0 && clearable ? handleClear : undefined}\n posIconLabel=\"Clear selection\"\n disabled={disabled}\n readOnly={true}\n isSelect={true}\n label={label}\n name={name}\n id={id}\n required={required}\n fullWidth={fullWidth}\n {...inputProps}\n />\n </div>\n );\n\n return (\n <div\n ref={ref}\n className={`${'eidos-select-container'} ${\n fullWidth ? 'eidos-select-container--full-width' : ''\n } ${className}`}\n >\n <Dropdown\n open={isOpen}\n onOpenChange={setIsOpen}\n trigger={triggerElement}\n content={\n <div id={`${id || 'select'}-options`} role=\"listbox\" aria-multiselectable={multiple}>\n {selectContent}\n </div>\n }\n minWidth={minWidth}\n maxWidth={maxWidth}\n minHeight={minHeight}\n maxHeight={maxHeight}\n autoWidth={autoWidth}\n fullWidth={fullWidth}\n triggerRef={triggerRef as React.RefObject<HTMLElement | null>}\n {...dropdownProps}\n />\n </div>\n );\n },\n);\n\nSelect.displayName = 'Select';\n"],"mappings":"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","names":[]}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  Tooltip
3
- } from "./chunk-MCPGI6EI.js";
3
+ } from "./chunk-BUSMGQJ4.js";
4
4
  import {
5
5
  devWarn,
6
6
  renderIcon
7
- } from "./chunk-U34INRFO.js";
7
+ } from "./chunk-PP6HS4GR.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-V64DICJK.js.map
194
+ //# sourceMappingURL=chunk-363IKX3C.js.map
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
2
2
 
3
- var _chunkWR77IZUUcjs = require('./chunk-WR77IZUU.cjs');
3
+ var _chunkBPVOQLCAcjs = require('./chunk-BPVOQLCA.cjs');
4
4
 
5
5
  // src/components/SplitChip/SplitChip.utils.ts
6
6
  var hasVisibleBorder = (segment) => segment.variant === "outlined" || segment.disabled;
@@ -52,7 +52,7 @@ var SplitChip = ({
52
52
  }));
53
53
  const edges = resolveSegmentEdges(resolved, showDividers);
54
54
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: classes, ...rest, children: segments.map((segment, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
55
- _chunkWR77IZUUcjs.Chip,
55
+ _chunkBPVOQLCAcjs.Chip,
56
56
  {
57
57
  variant: resolved[index].variant,
58
58
  color: _nullishCoalesce(segment.color, () => ( color)),
@@ -79,4 +79,4 @@ var SplitChip = ({
79
79
 
80
80
 
81
81
  exports.SplitChip = SplitChip;
82
- //# sourceMappingURL=chunk-LWCFT5SP.cjs.map
82
+ //# sourceMappingURL=chunk-3QBMSZSE.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-LWCFT5SP.cjs","../src/components/SplitChip/SplitChip.utils.ts","../src/components/SplitChip/SplitChip.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACiBA,IAAM,iBAAA,EAAmB,CAAC,OAAA,EAAA,GACxB,OAAA,CAAQ,QAAA,IAAY,WAAA,GAAc,OAAA,CAAQ,QAAA;AAsBrC,IAAM,oBAAA,EAAsB,CACjC,QAAA,EACA,YAAA,EAAA,GACmB;AACnB,EAAA,MAAM,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,EAAA,GAAA,CAAO,EAAE,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AAE3F,EAAA,IAAA,CAAA,IAAS,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,QAAA,CAAS,OAAA,EAAS,CAAA,EAAG,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,EAAA,EAAI,gBAAA,CAAiB,QAAA,CAAS,CAAC,CAAC,CAAA;AACtC,IAAA,MAAM,EAAA,EAAI,gBAAA,CAAiB,QAAA,CAAS,EAAA,EAAI,CAAC,CAAC,CAAA;AAI1C,IAAA,MAAM,YAAA,EAAc,QAAA,CAAS,CAAC,CAAA,CAAE,SAAA,IAAa,QAAA,CAAS,EAAA,EAAI,CAAC,CAAA,CAAE,QAAA;AAE7D,IAAA,GAAA,CAAI,EAAA,GAAK,CAAA,EAAG;AACV,MAAA,KAAA,CAAM,CAAC,CAAA,CAAE,UAAA,EAAY,CAAC,aAAA,GAAgB,WAAA;AACtC,MAAA,KAAA,CAAM,EAAA,EAAI,CAAC,CAAA,CAAE,YAAA,EAAc,IAAA;AAAA,IAC7B,EAAA,KAAA,GAAA,CAAW,CAAA,EAAG;AACZ,MAAA,KAAA,CAAM,EAAA,EAAI,CAAC,CAAA,CAAE,YAAA,EAAc,IAAA;AAAA,IAC7B,EAAA,KAAA,GAAA,CAAW,CAAA,EAAG;AACZ,MAAA,KAAA,CAAM,CAAC,CAAA,CAAE,UAAA,EAAY,IAAA;AAAA,IACvB,EAAA,KAAO;AACL,MAAA,KAAA,CAAM,CAAC,CAAA,CAAE,UAAA,EAAY,IAAA;AACrB,MAAA,KAAA,CAAM,EAAA,EAAI,CAAC,CAAA,CAAE,YAAA,EAAc,CAAC,YAAA;AAC5B,MAAA,KAAA,CAAM,EAAA,EAAI,CAAC,CAAA,CAAE,QAAA,EAAU,YAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;AD9CA;AACA;AE2BQ,+CAAA;AA9BD,IAAM,UAAA,EAAsC,CAAC;AAAA,EAClD,QAAA;AAAA,EACA,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,KAAA;AAAA,EACX,aAAA,EAAe,KAAA;AAAA,EACf,UAAA,EAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,QAAA,EAAU;AAAA,IACd,kBAAA;AAAA,IACA,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAA;AACT,IAAA;AACJ,IAAA;AACZ,IAAA;AAGS,EAAA;AAEgB,EAAA;AACD,EAAA;AACP,IAAA;AACO,IAAA;AACxB,EAAA;AACY,EAAA;AAGX,EAAA;AAEI,IAAA;AAAA,IAAA;AAEwB,MAAA;AACC,MAAA;AACxB,MAAA;AACwB,MAAA;AACP,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AAKN,MAAA;AACT,QAAA;AACe,QAAA;AACL,QAAA;AACG,QAAA;AACA,QAAA;AACA,QAAA;AAGP,MAAA;AAEC,MAAA;AAAA,IAAA;AAxBI,IAAA;AA2BnB,EAAA;AAEJ;AFR8B;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-LWCFT5SP.cjs","sourcesContent":[null,"import type { ChipVariantProps } from '../Chip/Chip.types';\n\nexport interface SeamSegment {\n variant: ChipVariantProps;\n disabled: boolean;\n}\n\nexport interface SegmentEdges {\n /** Drop the leading (left) border. */\n joinedStart: boolean;\n /** Drop the trailing (right) border. */\n joinedEnd: boolean;\n /** Draw a divider as the leading border, in the segment's own colour. */\n divided: boolean;\n}\n\n/**\n * A segment \"owns\" a visible border when it is `outlined`, or when it is\n * disabled - the disabled Chip style paints a grey border on every variant.\n * `filled` and `text` borders are transparent.\n */\nconst hasVisibleBorder = (segment: SeamSegment) =>\n segment.variant === 'outlined' || segment.disabled;\n\n/**\n * Decides, per seam, which of the two neighbouring edges survives.\n *\n * Each seam is resolved from **both** sides at once. The first version decided\n * each edge from one side only (\"drop it if the neighbour is not `text`\"),\n * which broke two ways: an `outlined` segment beside a disabled one dropped\n * its edge while the disabled segment dropped its own too, leaving the seam\n * open; and with dividers, an `outlined` segment gave up its own border to a\n * divider drawn in the *neighbour's* colour.\n *\n * The rules, for a seam between A (left) and B (right):\n *\n * - Both have visible borders: if they are the same kind (both enabled\n * `outlined`, or both disabled), seamless by default - both edges drop, so\n * the run reads as one outline. With dividers, or when the kinds differ,\n * A's own edge is the seam and B's drops.\n * - Only one has a visible border: that edge is the seam; the other drops, so\n * there is never a double line and never an open side.\n * - Neither has one: both drop; with dividers, B draws one in its own colour.\n */\nexport const resolveSegmentEdges = (\n segments: SeamSegment[],\n showDividers: boolean,\n): SegmentEdges[] => {\n const edges = segments.map(() => ({ joinedStart: false, joinedEnd: false, divided: false }));\n\n for (let i = 0; i < segments.length - 1; i++) {\n const a = hasVisibleBorder(segments[i]);\n const b = hasVisibleBorder(segments[i + 1]);\n // Two borders only merge into one outline when they are the same kind:\n // both enabled `outlined`, or both disabled. An outlined segment beside a\n // disabled one would otherwise lose the seam against a near-white surface.\n const sameOutline = segments[i].disabled === segments[i + 1].disabled;\n\n if (a && b) {\n edges[i].joinedEnd = !showDividers && sameOutline;\n edges[i + 1].joinedStart = true;\n } else if (a) {\n edges[i + 1].joinedStart = true;\n } else if (b) {\n edges[i].joinedEnd = true;\n } else {\n edges[i].joinedEnd = true;\n edges[i + 1].joinedStart = !showDividers;\n edges[i + 1].divided = showDividers;\n }\n }\n\n return edges;\n};\n","import React from 'react';\nimport { Chip } from '../Chip/Chip.component';\nimport type { SplitChipProps } from './SplitChip.types';\nimport { resolveSegmentEdges } from './SplitChip.utils';\n\n/**\n * SplitChip - one chip split into independent segments, each with its own\n * label, variant, colour and optional click handler.\n *\n * Every segment is a real `Chip`, the same way `SplitButton` is built from\n * `Button`, so variants, sizes, icons, tooltips, disabled styling and the\n * \"hover only when clickable\" rule cannot drift between the two. This\n * component only adds the join: collapsed inner borders, radii on the outer\n * ends, and optional dividers.\n *\n * @example\n * ```tsx\n * <SplitChip\n * segments={[\n * { id: 'label', label: 'Status', variant: 'outlined' },\n * { id: 'value', label: 'Open', color: 'success', onClick: openFilter },\n * ]}\n * />\n * ```\n */\nexport const SplitChip: React.FC<SplitChipProps> = ({\n segments,\n variant = 'filled',\n color = 'primary',\n size = 'md',\n disabled = false,\n showDividers = false,\n className = '',\n ...rest\n}) => {\n const classes = [\n 'eidos-split-chip',\n `eidos-split-chip--${size}`,\n showDividers && 'eidos-split-chip--dividers',\n disabled && 'eidos-split-chip--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const lastIndex = segments.length - 1;\n const resolved = segments.map((segment) => ({\n variant: segment.variant ?? variant,\n disabled: disabled || !!segment.disabled,\n }));\n const edges = resolveSegmentEdges(resolved, showDividers);\n\n return (\n <div className={classes} {...rest}>\n {segments.map((segment, index) => (\n <Chip\n key={segment.id}\n variant={resolved[index].variant}\n color={segment.color ?? color}\n size={size}\n disabled={resolved[index].disabled}\n onClick={segment.onClick}\n tooltip={segment.tooltip}\n preIcon={segment.preIcon}\n posIcon={segment.posIcon}\n // Position comes from the index, not `:first-child`/`:last-child`:\n // a segment with a `tooltip` is wrapped in the Tooltip's trigger\n // `div`, so the chip is no longer a direct child of this container\n // and structural pseudo-classes would round the wrong corners.\n className={[\n 'eidos-split-chip__segment',\n index === 0 && 'eidos-split-chip__segment--first',\n index === lastIndex && 'eidos-split-chip__segment--last',\n edges[index].joinedStart && 'eidos-split-chip__segment--joined-start',\n edges[index].joinedEnd && 'eidos-split-chip__segment--joined-end',\n edges[index].divided && 'eidos-split-chip__segment--divided',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {segment.label}\n </Chip>\n ))}\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-3QBMSZSE.cjs","../src/components/SplitChip/SplitChip.utils.ts","../src/components/SplitChip/SplitChip.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACiBA,IAAM,iBAAA,EAAmB,CAAC,OAAA,EAAA,GACxB,OAAA,CAAQ,QAAA,IAAY,WAAA,GAAc,OAAA,CAAQ,QAAA;AAsBrC,IAAM,oBAAA,EAAsB,CACjC,QAAA,EACA,YAAA,EAAA,GACmB;AACnB,EAAA,MAAM,MAAA,EAAQ,QAAA,CAAS,GAAA,CAAI,CAAA,EAAA,GAAA,CAAO,EAAE,WAAA,EAAa,KAAA,EAAO,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AAE3F,EAAA,IAAA,CAAA,IAAS,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,QAAA,CAAS,OAAA,EAAS,CAAA,EAAG,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,EAAA,EAAI,gBAAA,CAAiB,QAAA,CAAS,CAAC,CAAC,CAAA;AACtC,IAAA,MAAM,EAAA,EAAI,gBAAA,CAAiB,QAAA,CAAS,EAAA,EAAI,CAAC,CAAC,CAAA;AAI1C,IAAA,MAAM,YAAA,EAAc,QAAA,CAAS,CAAC,CAAA,CAAE,SAAA,IAAa,QAAA,CAAS,EAAA,EAAI,CAAC,CAAA,CAAE,QAAA;AAE7D,IAAA,GAAA,CAAI,EAAA,GAAK,CAAA,EAAG;AACV,MAAA,KAAA,CAAM,CAAC,CAAA,CAAE,UAAA,EAAY,CAAC,aAAA,GAAgB,WAAA;AACtC,MAAA,KAAA,CAAM,EAAA,EAAI,CAAC,CAAA,CAAE,YAAA,EAAc,IAAA;AAAA,IAC7B,EAAA,KAAA,GAAA,CAAW,CAAA,EAAG;AACZ,MAAA,KAAA,CAAM,EAAA,EAAI,CAAC,CAAA,CAAE,YAAA,EAAc,IAAA;AAAA,IAC7B,EAAA,KAAA,GAAA,CAAW,CAAA,EAAG;AACZ,MAAA,KAAA,CAAM,CAAC,CAAA,CAAE,UAAA,EAAY,IAAA;AAAA,IACvB,EAAA,KAAO;AACL,MAAA,KAAA,CAAM,CAAC,CAAA,CAAE,UAAA,EAAY,IAAA;AACrB,MAAA,KAAA,CAAM,EAAA,EAAI,CAAC,CAAA,CAAE,YAAA,EAAc,CAAC,YAAA;AAC5B,MAAA,KAAA,CAAM,EAAA,EAAI,CAAC,CAAA,CAAE,QAAA,EAAU,YAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;AD9CA;AACA;AE2BQ,+CAAA;AA9BD,IAAM,UAAA,EAAsC,CAAC;AAAA,EAClD,QAAA;AAAA,EACA,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,SAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,SAAA,EAAW,KAAA;AAAA,EACX,aAAA,EAAe,KAAA;AAAA,EACf,UAAA,EAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,QAAA,EAAU;AAAA,IACd,kBAAA;AAAA,IACA,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAA;AACT,IAAA;AACJ,IAAA;AACZ,IAAA;AAGS,EAAA;AAEgB,EAAA;AACD,EAAA;AACP,IAAA;AACO,IAAA;AACxB,EAAA;AACY,EAAA;AAGX,EAAA;AAEI,IAAA;AAAA,IAAA;AAEwB,MAAA;AACC,MAAA;AACxB,MAAA;AACwB,MAAA;AACP,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AAKN,MAAA;AACT,QAAA;AACe,QAAA;AACL,QAAA;AACG,QAAA;AACA,QAAA;AACA,QAAA;AAGP,MAAA;AAEC,MAAA;AAAA,IAAA;AAxBI,IAAA;AA2BnB,EAAA;AAEJ;AFR8B;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-3QBMSZSE.cjs","sourcesContent":[null,"import type { ChipVariantProps } from '../Chip/Chip.types';\n\nexport interface SeamSegment {\n variant: ChipVariantProps;\n disabled: boolean;\n}\n\nexport interface SegmentEdges {\n /** Drop the leading (left) border. */\n joinedStart: boolean;\n /** Drop the trailing (right) border. */\n joinedEnd: boolean;\n /** Draw a divider as the leading border, in the segment's own colour. */\n divided: boolean;\n}\n\n/**\n * A segment \"owns\" a visible border when it is `outlined`, or when it is\n * disabled - the disabled Chip style paints a grey border on every variant.\n * `filled` and `text` borders are transparent.\n */\nconst hasVisibleBorder = (segment: SeamSegment) =>\n segment.variant === 'outlined' || segment.disabled;\n\n/**\n * Decides, per seam, which of the two neighbouring edges survives.\n *\n * Each seam is resolved from **both** sides at once. The first version decided\n * each edge from one side only (\"drop it if the neighbour is not `text`\"),\n * which broke two ways: an `outlined` segment beside a disabled one dropped\n * its edge while the disabled segment dropped its own too, leaving the seam\n * open; and with dividers, an `outlined` segment gave up its own border to a\n * divider drawn in the *neighbour's* colour.\n *\n * The rules, for a seam between A (left) and B (right):\n *\n * - Both have visible borders: if they are the same kind (both enabled\n * `outlined`, or both disabled), seamless by default - both edges drop, so\n * the run reads as one outline. With dividers, or when the kinds differ,\n * A's own edge is the seam and B's drops.\n * - Only one has a visible border: that edge is the seam; the other drops, so\n * there is never a double line and never an open side.\n * - Neither has one: both drop; with dividers, B draws one in its own colour.\n */\nexport const resolveSegmentEdges = (\n segments: SeamSegment[],\n showDividers: boolean,\n): SegmentEdges[] => {\n const edges = segments.map(() => ({ joinedStart: false, joinedEnd: false, divided: false }));\n\n for (let i = 0; i < segments.length - 1; i++) {\n const a = hasVisibleBorder(segments[i]);\n const b = hasVisibleBorder(segments[i + 1]);\n // Two borders only merge into one outline when they are the same kind:\n // both enabled `outlined`, or both disabled. An outlined segment beside a\n // disabled one would otherwise lose the seam against a near-white surface.\n const sameOutline = segments[i].disabled === segments[i + 1].disabled;\n\n if (a && b) {\n edges[i].joinedEnd = !showDividers && sameOutline;\n edges[i + 1].joinedStart = true;\n } else if (a) {\n edges[i + 1].joinedStart = true;\n } else if (b) {\n edges[i].joinedEnd = true;\n } else {\n edges[i].joinedEnd = true;\n edges[i + 1].joinedStart = !showDividers;\n edges[i + 1].divided = showDividers;\n }\n }\n\n return edges;\n};\n","import React from 'react';\nimport { Chip } from '../Chip/Chip.component';\nimport type { SplitChipProps } from './SplitChip.types';\nimport { resolveSegmentEdges } from './SplitChip.utils';\n\n/**\n * SplitChip - one chip split into independent segments, each with its own\n * label, variant, colour and optional click handler.\n *\n * Every segment is a real `Chip`, the same way `SplitButton` is built from\n * `Button`, so variants, sizes, icons, tooltips, disabled styling and the\n * \"hover only when clickable\" rule cannot drift between the two. This\n * component only adds the join: collapsed inner borders, radii on the outer\n * ends, and optional dividers.\n *\n * @example\n * ```tsx\n * <SplitChip\n * segments={[\n * { id: 'label', label: 'Status', variant: 'outlined' },\n * { id: 'value', label: 'Open', color: 'success', onClick: openFilter },\n * ]}\n * />\n * ```\n */\nexport const SplitChip: React.FC<SplitChipProps> = ({\n segments,\n variant = 'filled',\n color = 'primary',\n size = 'md',\n disabled = false,\n showDividers = false,\n className = '',\n ...rest\n}) => {\n const classes = [\n 'eidos-split-chip',\n `eidos-split-chip--${size}`,\n showDividers && 'eidos-split-chip--dividers',\n disabled && 'eidos-split-chip--disabled',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const lastIndex = segments.length - 1;\n const resolved = segments.map((segment) => ({\n variant: segment.variant ?? variant,\n disabled: disabled || !!segment.disabled,\n }));\n const edges = resolveSegmentEdges(resolved, showDividers);\n\n return (\n <div className={classes} {...rest}>\n {segments.map((segment, index) => (\n <Chip\n key={segment.id}\n variant={resolved[index].variant}\n color={segment.color ?? color}\n size={size}\n disabled={resolved[index].disabled}\n onClick={segment.onClick}\n tooltip={segment.tooltip}\n preIcon={segment.preIcon}\n posIcon={segment.posIcon}\n // Position comes from the index, not `:first-child`/`:last-child`:\n // a segment with a `tooltip` is wrapped in the Tooltip's trigger\n // `div`, so the chip is no longer a direct child of this container\n // and structural pseudo-classes would round the wrong corners.\n className={[\n 'eidos-split-chip__segment',\n index === 0 && 'eidos-split-chip__segment--first',\n index === lastIndex && 'eidos-split-chip__segment--last',\n edges[index].joinedStart && 'eidos-split-chip__segment--joined-start',\n edges[index].joinedEnd && 'eidos-split-chip__segment--joined-end',\n edges[index].divided && 'eidos-split-chip__segment--divided',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {segment.label}\n </Chip>\n ))}\n </div>\n );\n};\n"]}
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  Toolbar
3
- } from "./chunk-U4SVBE2M.js";
3
+ } from "./chunk-AWPJH3UB.js";
4
4
  import {
5
5
  Header
6
- } from "./chunk-RHWZX7PB.js";
6
+ } from "./chunk-NONYIHXD.js";
7
7
  import {
8
8
  Navigation
9
- } from "./chunk-TJQNGJHP.js";
9
+ } from "./chunk-KLHC5BHS.js";
10
10
  import {
11
11
  Footer
12
12
  } from "./chunk-W2F6WDUX.js";
@@ -96,4 +96,4 @@ var PageLayout = ({
96
96
  export {
97
97
  PageLayout
98
98
  };
99
- //# sourceMappingURL=chunk-IC2PIK3E.js.map
99
+ //# sourceMappingURL=chunk-43DJ3GGR.js.map
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Chip
3
- } from "./chunk-2TIMJD4K.js";
3
+ } from "./chunk-IBT535UH.js";
4
4
  import {
5
5
  Dropdown
6
- } from "./chunk-3X6QVHTD.js";
6
+ } from "./chunk-OERK3T7E.js";
7
7
 
8
8
  // src/components/TagInput/TagInput.component.tsx
9
9
  import { useState, useId, useRef, useCallback, useMemo, useEffect } from "react";
@@ -288,4 +288,4 @@ TagInput.displayName = "TagInput";
288
288
  export {
289
289
  TagInput
290
290
  };
291
- //# sourceMappingURL=chunk-L6ERHCQ2.js.map
291
+ //# sourceMappingURL=chunk-57BVERWD.js.map
@@ -1,6 +1,6 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkN5NXKVFJcjs = require('./chunk-N5NXKVFJ.cjs');
3
+ var _chunkVPN7AR7Tcjs = require('./chunk-VPN7AR7T.cjs');
4
4
 
5
5
  // src/components/ContextMenu/ContextMenu.component.tsx
6
6
  var _react = require('react');
@@ -92,7 +92,7 @@ var ContextMenu = ({
92
92
  top: position.y,
93
93
  left: position.x
94
94
  },
95
- children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkN5NXKVFJcjs.MenuPanel, { items, onItemClick: handleItemClick })
95
+ children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkVPN7AR7Tcjs.MenuPanel, { items, onItemClick: handleItemClick })
96
96
  }
97
97
  ),
98
98
  document.body
@@ -103,4 +103,4 @@ var ContextMenu = ({
103
103
 
104
104
 
105
105
  exports.ContextMenu = ContextMenu;
106
- //# sourceMappingURL=chunk-AUNDBUHM.cjs.map
106
+ //# sourceMappingURL=chunk-5HRVHEHE.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-AUNDBUHM.cjs","../src/components/ContextMenu/ContextMenu.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,8BAAgE;AAChE,qCAA6B;AAkHzB,+CAAA;AAnFG,IAAM,YAAA,EAA0C,CAAC;AAAA,EACtD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,EAAA,EAAI,6BAAA,KAAc,CAAA;AAC1C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,EAAA,EAAI,6BAAA,EAAyB,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAE,CAAC,CAAA;AACrE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,EAAA,EAAI,6BAAA,KAAc,CAAA;AACtD,EAAA,MAAM,QAAA,EAAU,2BAAA,IAA2B,CAAA;AAE3C,EAAA,MAAM,MAAA,EAAQ,gCAAA,CAAY,EAAA,GAAM;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,CAAC,CAAA;AAGL,EAAA,8BAAA,CAAU,EAAA,GAAM;AACd,IAAA,GAAA,CAAI,CAAC,OAAA,GAAU,CAAC,OAAA,CAAQ,OAAA,EAAS,MAAA;AAEjC,IAAA,MAAM,KAAA,EAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,MAAM,EAAE,KAAA,EAAO,OAAO,EAAA,EAAI,IAAA,CAAK,qBAAA,CAAsB,CAAA;AACrD,IAAA,MAAM,GAAA,EAAK,MAAA,CAAO,UAAA;AAClB,IAAA,MAAM,GAAA,EAAK,MAAA,CAAO,WAAA;AAClB,IAAA,MAAM,IAAA,EAAM,CAAA;AAEZ,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,MAAA,EAAQ,GAAG,CAAA;AACtD,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAEvD,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAA,EAAA;AACD,IAAA;AACD,IAAA;AACG,EAAA;AAGL,EAAA;AACD,IAAA;AAEP,IAAA;AACQ,MAAA;AACJ,QAAA;AACR,MAAA;AACF,IAAA;AAES,IAAA;AACI,IAAA;AACG,EAAA;AAGF,EAAA;AACD,IAAA;AAEP,IAAA;AACU,MAAA;AAChB,IAAA;AAEM,IAAA;AAEG,IAAA;AACF,IAAA;AACM,IAAA;AACF,MAAA;AACF,MAAA;AACT,IAAA;AACgB,EAAA;AAEZ,EAAA;AACU,IAAA;AACG,IAAA;AACC,IAAA;AACJ,IAAA;AACE,IAAA;AACG,IAAA;AACrB,EAAA;AAEM,EAAA;AACiB,IAAA;AACb,MAAA;AACR,IAAA;AACM,IAAA;AACR,EAAA;AAGE,EAAA;AACE,oBAAA;AAAC,MAAA;AAAA,MAAA;AACa,QAAA;AACG,QAAA;AAEd,QAAA;AAAA,MAAA;AACH,IAAA;AAGE,IAAA;AACE,sBAAA;AAAC,QAAA;AAAA,QAAA;AACM,UAAA;AACM,UAAA;AACT,YAAA;AACA,YAAA;AAEQ,UAAA;AAEH,UAAA;AACA,YAAA;AACC,YAAA;AACR,UAAA;AAEA,UAAA;AAAuD,QAAA;AACzD,MAAA;AACS,MAAA;AACX,IAAA;AACJ,EAAA;AAEJ;AD3CuB;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-AUNDBUHM.cjs","sourcesContent":[null,"import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuPanel } from '../Menu';\nimport type { MenuItem } from '../Menu';\nimport type { ContextMenuProps } from './ContextMenu.types';\n\ninterface MenuPosition {\n x: number;\n y: number;\n}\n\n/**\n * ContextMenu - wraps any content and attaches a right-click (or long-press)\n * triggered menu positioned at the cursor.\n *\n * The browser's native context menu is suppressed when `disabled` is false.\n * The menu closes on: click outside, item selection, Escape, and scroll.\n *\n * @example\n * ```tsx\n * <ContextMenu\n * items={[\n * { type: 'item', id: 'copy', label: 'Copy', icon: Copy, onClick: () => copy() },\n * { type: 'item', id: 'cut', label: 'Cut', icon: Scissors, onClick: () => cut() },\n * { type: 'separator', id: 'sep1' },\n * { type: 'item', id: 'delete', label: 'Delete', icon: Trash2, onClick: () => remove(), disabled: true },\n * ]}\n * >\n * <div className=\"canvas-area\">...</div>\n * </ContextMenu>\n * ```\n */\nexport const ContextMenu: React.FC<ContextMenuProps> = ({\n items,\n children,\n disabled = false,\n className = '',\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState<MenuPosition>({ x: 0, y: 0 });\n const [isPositioned, setIsPositioned] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setIsPositioned(false);\n }, []);\n\n // Measure the menu panel after it renders and clamp to viewport edges.\n useEffect(() => {\n if (!isOpen || !menuRef.current) return;\n\n const menu = menuRef.current;\n const { width, height } = menu.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const GAP = 4; // px clearance from viewport edge\n\n const clampedX = Math.min(position.x, vw - width - GAP);\n const clampedY = Math.min(position.y, vh - height - GAP);\n\n menu.style.left = `${Math.max(GAP, clampedX)}px`;\n menu.style.top = `${Math.max(GAP, clampedY)}px`;\n setIsPositioned(true);\n }, [isOpen, position]);\n\n // Close on click outside.\n useEffect(() => {\n if (!isOpen) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n close();\n }\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [isOpen, close]);\n\n // Close on Escape or scroll.\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close();\n };\n\n const handleScroll = () => close();\n\n document.addEventListener('keydown', handleKeyDown);\n window.addEventListener('scroll', handleScroll, true); // capture: catches nested scrollers\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('scroll', handleScroll, true);\n };\n }, [isOpen, close]);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n e.stopPropagation();\n setIsOpen(true);\n setIsPositioned(false);\n setPosition({ x: e.clientX, y: e.clientY });\n };\n\n const handleItemClick = useCallback(\n (_item: MenuItem) => {\n close();\n },\n [close],\n );\n\n return (\n <>\n <div\n className={['eidos-context-menu-target', className].filter(Boolean).join(' ')}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n\n {isOpen &&\n createPortal(\n <div\n ref={menuRef}\n className={[\n 'eidos-context-menu-panel',\n isPositioned && 'eidos-context-menu-panel--positioned',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n top: position.y,\n left: position.x,\n }}\n >\n <MenuPanel items={items} onItemClick={handleItemClick} />\n </div>,\n document.body,\n )}\n </>\n );\n};\n"]}
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-5HRVHEHE.cjs","../src/components/ContextMenu/ContextMenu.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,8BAAgE;AAChE,qCAA6B;AAkHzB,+CAAA;AAnFG,IAAM,YAAA,EAA0C,CAAC;AAAA,EACtD,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,EACX,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,EAAA,EAAI,6BAAA,KAAc,CAAA;AAC1C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,EAAA,EAAI,6BAAA,EAAyB,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAE,CAAC,CAAA;AACrE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,EAAA,EAAI,6BAAA,KAAc,CAAA;AACtD,EAAA,MAAM,QAAA,EAAU,2BAAA,IAA2B,CAAA;AAE3C,EAAA,MAAM,MAAA,EAAQ,gCAAA,CAAY,EAAA,GAAM;AAC9B,IAAA,SAAA,CAAU,KAAK,CAAA;AACf,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,CAAC,CAAA;AAGL,EAAA,8BAAA,CAAU,EAAA,GAAM;AACd,IAAA,GAAA,CAAI,CAAC,OAAA,GAAU,CAAC,OAAA,CAAQ,OAAA,EAAS,MAAA;AAEjC,IAAA,MAAM,KAAA,EAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,MAAM,EAAE,KAAA,EAAO,OAAO,EAAA,EAAI,IAAA,CAAK,qBAAA,CAAsB,CAAA;AACrD,IAAA,MAAM,GAAA,EAAK,MAAA,CAAO,UAAA;AAClB,IAAA,MAAM,GAAA,EAAK,MAAA,CAAO,WAAA;AAClB,IAAA,MAAM,IAAA,EAAM,CAAA;AAEZ,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,MAAA,EAAQ,GAAG,CAAA;AACtD,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,GAAA,EAAK,OAAA,EAAS,GAAG,CAAA;AAEvD,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,CAAA,EAAA;AACD,IAAA;AACD,IAAA;AACG,EAAA;AAGL,EAAA;AACD,IAAA;AAEP,IAAA;AACQ,MAAA;AACJ,QAAA;AACR,MAAA;AACF,IAAA;AAES,IAAA;AACI,IAAA;AACG,EAAA;AAGF,EAAA;AACD,IAAA;AAEP,IAAA;AACU,MAAA;AAChB,IAAA;AAEM,IAAA;AAEG,IAAA;AACF,IAAA;AACM,IAAA;AACF,MAAA;AACF,MAAA;AACT,IAAA;AACgB,EAAA;AAEZ,EAAA;AACU,IAAA;AACG,IAAA;AACC,IAAA;AACJ,IAAA;AACE,IAAA;AACG,IAAA;AACrB,EAAA;AAEM,EAAA;AACiB,IAAA;AACb,MAAA;AACR,IAAA;AACM,IAAA;AACR,EAAA;AAGE,EAAA;AACE,oBAAA;AAAC,MAAA;AAAA,MAAA;AACa,QAAA;AACG,QAAA;AAEd,QAAA;AAAA,MAAA;AACH,IAAA;AAGE,IAAA;AACE,sBAAA;AAAC,QAAA;AAAA,QAAA;AACM,UAAA;AACM,UAAA;AACT,YAAA;AACA,YAAA;AAEQ,UAAA;AAEH,UAAA;AACA,YAAA;AACC,YAAA;AACR,UAAA;AAEA,UAAA;AAAuD,QAAA;AACzD,MAAA;AACS,MAAA;AACX,IAAA;AACJ,EAAA;AAEJ;AD3CuB;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-5HRVHEHE.cjs","sourcesContent":[null,"import React, { useState, useEffect, useRef, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { MenuPanel } from '../Menu';\nimport type { MenuItem } from '../Menu';\nimport type { ContextMenuProps } from './ContextMenu.types';\n\ninterface MenuPosition {\n x: number;\n y: number;\n}\n\n/**\n * ContextMenu - wraps any content and attaches a right-click (or long-press)\n * triggered menu positioned at the cursor.\n *\n * The browser's native context menu is suppressed when `disabled` is false.\n * The menu closes on: click outside, item selection, Escape, and scroll.\n *\n * @example\n * ```tsx\n * <ContextMenu\n * items={[\n * { type: 'item', id: 'copy', label: 'Copy', icon: Copy, onClick: () => copy() },\n * { type: 'item', id: 'cut', label: 'Cut', icon: Scissors, onClick: () => cut() },\n * { type: 'separator', id: 'sep1' },\n * { type: 'item', id: 'delete', label: 'Delete', icon: Trash2, onClick: () => remove(), disabled: true },\n * ]}\n * >\n * <div className=\"canvas-area\">...</div>\n * </ContextMenu>\n * ```\n */\nexport const ContextMenu: React.FC<ContextMenuProps> = ({\n items,\n children,\n disabled = false,\n className = '',\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [position, setPosition] = useState<MenuPosition>({ x: 0, y: 0 });\n const [isPositioned, setIsPositioned] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => {\n setIsOpen(false);\n setIsPositioned(false);\n }, []);\n\n // Measure the menu panel after it renders and clamp to viewport edges.\n useEffect(() => {\n if (!isOpen || !menuRef.current) return;\n\n const menu = menuRef.current;\n const { width, height } = menu.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const GAP = 4; // px clearance from viewport edge\n\n const clampedX = Math.min(position.x, vw - width - GAP);\n const clampedY = Math.min(position.y, vh - height - GAP);\n\n menu.style.left = `${Math.max(GAP, clampedX)}px`;\n menu.style.top = `${Math.max(GAP, clampedY)}px`;\n setIsPositioned(true);\n }, [isOpen, position]);\n\n // Close on click outside.\n useEffect(() => {\n if (!isOpen) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n close();\n }\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [isOpen, close]);\n\n // Close on Escape or scroll.\n useEffect(() => {\n if (!isOpen) return;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') close();\n };\n\n const handleScroll = () => close();\n\n document.addEventListener('keydown', handleKeyDown);\n window.addEventListener('scroll', handleScroll, true); // capture: catches nested scrollers\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('scroll', handleScroll, true);\n };\n }, [isOpen, close]);\n\n const handleContextMenu = (e: React.MouseEvent) => {\n if (disabled) return;\n e.preventDefault();\n e.stopPropagation();\n setIsOpen(true);\n setIsPositioned(false);\n setPosition({ x: e.clientX, y: e.clientY });\n };\n\n const handleItemClick = useCallback(\n (_item: MenuItem) => {\n close();\n },\n [close],\n );\n\n return (\n <>\n <div\n className={['eidos-context-menu-target', className].filter(Boolean).join(' ')}\n onContextMenu={handleContextMenu}\n >\n {children}\n </div>\n\n {isOpen &&\n createPortal(\n <div\n ref={menuRef}\n className={[\n 'eidos-context-menu-panel',\n isPositioned && 'eidos-context-menu-panel--positioned',\n ]\n .filter(Boolean)\n .join(' ')}\n style={{\n top: position.y,\n left: position.x,\n }}\n >\n <MenuPanel items={items} onItemClick={handleItemClick} />\n </div>,\n document.body,\n )}\n </>\n );\n};\n"]}
@@ -1,9 +1,9 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkB2OHBIALcjs = require('./chunk-B2OHBIAL.cjs');
3
+ var _chunkBKUZF7CWcjs = require('./chunk-BKUZF7CW.cjs');
4
4
 
5
5
 
6
- var _chunkXPG56DLQcjs = require('./chunk-XPG56DLQ.cjs');
6
+ var _chunkNSA7ASZ7cjs = require('./chunk-NSA7ASZ7.cjs');
7
7
 
8
8
  // src/components/Pagination/Pagination.component.tsx
9
9
  var _react = require('react');
@@ -79,7 +79,7 @@ var Pagination = ({
79
79
  ].filter(Boolean).join(" ");
80
80
  const nav = /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "nav", { "aria-label": "Pagination", className: "eidos-pagination-nav", children: [
81
81
  showFirstLast && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
82
- _chunkXPG56DLQcjs.Button,
82
+ _chunkNSA7ASZ7cjs.Button,
83
83
  {
84
84
  variant: "text",
85
85
  size,
@@ -90,7 +90,7 @@ var Pagination = ({
90
90
  }
91
91
  ),
92
92
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
93
- _chunkXPG56DLQcjs.Button,
93
+ _chunkNSA7ASZ7cjs.Button,
94
94
  {
95
95
  variant: "text",
96
96
  size,
@@ -146,7 +146,7 @@ var Pagination = ({
146
146
  )
147
147
  ),
148
148
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
149
- _chunkXPG56DLQcjs.Button,
149
+ _chunkNSA7ASZ7cjs.Button,
150
150
  {
151
151
  variant: "text",
152
152
  size,
@@ -157,7 +157,7 @@ var Pagination = ({
157
157
  }
158
158
  ),
159
159
  showFirstLast && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
160
- _chunkXPG56DLQcjs.Button,
160
+ _chunkNSA7ASZ7cjs.Button,
161
161
  {
162
162
  variant: "text",
163
163
  size,
@@ -185,7 +185,7 @@ var Pagination = ({
185
185
  hasPageSize && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-pagination-size", children: [
186
186
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "label", { className: "eidos-pagination-size-label", htmlFor: pageSizeId, children: "Show:" }),
187
187
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
188
- _chunkB2OHBIALcjs.Select,
188
+ _chunkBKUZF7CWcjs.Select,
189
189
  {
190
190
  value: String(pageSize),
191
191
  onChange: (val) => onPageSizeChange(Number(val)),
@@ -209,4 +209,4 @@ Pagination.displayName = "Pagination";
209
209
 
210
210
 
211
211
  exports.Pagination = Pagination;
212
- //# sourceMappingURL=chunk-6IB27I5K.cjs.map
212
+ //# sourceMappingURL=chunk-6JYXGRJ3.cjs.map