eidos-ui 3.1.1 → 3.2.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 (258) hide show
  1. package/README.md +4 -0
  2. package/dist/Header.types-0XovUp0T.d.ts +79 -0
  3. package/dist/Header.types-Ce5Cj301.d.cts +79 -0
  4. package/dist/{Navigation.types-CpS3EYNz.d.ts → Navigation.types-By5HfPTi.d.ts} +8 -0
  5. package/dist/{Navigation.types-sUO9wqOp.d.cts → Navigation.types-_MrYqqUI.d.cts} +8 -0
  6. package/dist/{SegmentedControl.types-Dm4SnwCK.d.cts → SegmentedControl.types-BofrEYyd.d.cts} +16 -1
  7. package/dist/{SegmentedControl.types-CK8EiShd.d.ts → SegmentedControl.types-cjLwwBAm.d.ts} +16 -1
  8. package/dist/alert/index.cjs +4 -4
  9. package/dist/alert/index.js +3 -3
  10. package/dist/button/index.cjs +3 -3
  11. package/dist/button/index.js +2 -2
  12. package/dist/chip/index.cjs +3 -3
  13. package/dist/chip/index.js +2 -2
  14. package/dist/{chunk-RWOX2NJN.js → chunk-25PSIDPC.js} +2 -2
  15. package/dist/{chunk-IFVT5UCY.js → chunk-2QEKSRVX.js} +14 -10
  16. package/dist/chunk-2QEKSRVX.js.map +1 -0
  17. package/dist/{chunk-4BKTBV2I.js → chunk-2R77XZEP.js} +6 -2
  18. package/dist/chunk-2R77XZEP.js.map +1 -0
  19. package/dist/{chunk-SYWSXSHY.js → chunk-2WP27QAN.js} +8 -8
  20. package/dist/{chunk-EXITZVB2.js → chunk-3RLGH45H.js} +6 -6
  21. package/dist/{chunk-442U3W6R.cjs → chunk-4MZ7HEQC.cjs} +5 -5
  22. package/dist/{chunk-442U3W6R.cjs.map → chunk-4MZ7HEQC.cjs.map} +1 -1
  23. package/dist/{chunk-R4PU2TBM.js → chunk-4ZWAJTNH.js} +3 -3
  24. package/dist/{chunk-RHOT7AEI.cjs → chunk-55J4LEKT.cjs} +8 -7
  25. package/dist/chunk-55J4LEKT.cjs.map +1 -0
  26. package/dist/{chunk-REVK7IGN.js → chunk-5WH3JMR5.js} +8 -7
  27. package/dist/chunk-5WH3JMR5.js.map +1 -0
  28. package/dist/{chunk-GT22EGJP.cjs → chunk-65PC3YDT.cjs} +14 -10
  29. package/dist/chunk-65PC3YDT.cjs.map +1 -0
  30. package/dist/{chunk-KQD7CQ4Z.cjs → chunk-6CSUUQ5M.cjs} +10 -6
  31. package/dist/chunk-6CSUUQ5M.cjs.map +1 -0
  32. package/dist/{chunk-GR2PMCVN.cjs → chunk-75TDY7XF.cjs} +5 -5
  33. package/dist/{chunk-GR2PMCVN.cjs.map → chunk-75TDY7XF.cjs.map} +1 -1
  34. package/dist/{chunk-FRUOA2QU.cjs → chunk-75VXB3H2.cjs} +7 -3
  35. package/dist/chunk-75VXB3H2.cjs.map +1 -0
  36. package/dist/{chunk-F26VIKNF.js → chunk-ATL7325T.js} +3 -3
  37. package/dist/{chunk-TEJIPPZR.js → chunk-BC5I2MYB.js} +7 -4
  38. package/dist/chunk-BC5I2MYB.js.map +1 -0
  39. package/dist/{chunk-GHQ6SQPI.js → chunk-BHVHM66Z.js} +6 -6
  40. package/dist/{chunk-N2IGZIEX.cjs → chunk-CJGFRPAS.cjs} +3 -3
  41. package/dist/{chunk-N2IGZIEX.cjs.map → chunk-CJGFRPAS.cjs.map} +1 -1
  42. package/dist/{chunk-GEHL4LKK.cjs → chunk-CUJBNRJJ.cjs} +8 -2
  43. package/dist/chunk-CUJBNRJJ.cjs.map +1 -0
  44. package/dist/{chunk-DAXZRNNO.cjs → chunk-D2SKXRKP.cjs} +8 -8
  45. package/dist/{chunk-DAXZRNNO.cjs.map → chunk-D2SKXRKP.cjs.map} +1 -1
  46. package/dist/{chunk-KBG77JHC.js → chunk-EAJHEYZM.js} +8 -2
  47. package/dist/chunk-EAJHEYZM.js.map +1 -0
  48. package/dist/{chunk-G77YR73R.cjs → chunk-EBSKRZXI.cjs} +8 -8
  49. package/dist/{chunk-G77YR73R.cjs.map → chunk-EBSKRZXI.cjs.map} +1 -1
  50. package/dist/{chunk-B5G5XVFJ.cjs → chunk-EH42ND5Q.cjs} +5 -5
  51. package/dist/{chunk-B5G5XVFJ.cjs.map → chunk-EH42ND5Q.cjs.map} +1 -1
  52. package/dist/{chunk-WUBQJVB7.cjs → chunk-EL3YXTOW.cjs} +9 -6
  53. package/dist/chunk-EL3YXTOW.cjs.map +1 -0
  54. package/dist/{chunk-Y53HCLGW.js → chunk-FALDCW2E.js} +2 -2
  55. package/dist/{chunk-D5IY2HUV.cjs → chunk-FXZJL2AM.cjs} +5 -5
  56. package/dist/{chunk-D5IY2HUV.cjs.map → chunk-FXZJL2AM.cjs.map} +1 -1
  57. package/dist/{chunk-KJZUYC4X.cjs → chunk-HI6WCX4T.cjs} +10 -9
  58. package/dist/chunk-HI6WCX4T.cjs.map +1 -0
  59. package/dist/{chunk-LFWPQYWX.cjs → chunk-I3CSPYHG.cjs} +3 -3
  60. package/dist/{chunk-LFWPQYWX.cjs.map → chunk-I3CSPYHG.cjs.map} +1 -1
  61. package/dist/{chunk-EZME5CLK.cjs → chunk-J5RMLZ4P.cjs} +3 -3
  62. package/dist/{chunk-EZME5CLK.cjs.map → chunk-J5RMLZ4P.cjs.map} +1 -1
  63. package/dist/{chunk-VHMOKXUT.js → chunk-JRLUZDKA.js} +8 -7
  64. package/dist/chunk-JRLUZDKA.js.map +1 -0
  65. package/dist/{chunk-LIFUHQH5.cjs → chunk-KBGFDHKD.cjs} +19 -19
  66. package/dist/{chunk-LIFUHQH5.cjs.map → chunk-KBGFDHKD.cjs.map} +1 -1
  67. package/dist/{chunk-ZHFPV43D.js → chunk-KNQ6NN6L.js} +5 -5
  68. package/dist/{chunk-GWQEADRJ.js → chunk-KQJ3IAFT.js} +2 -2
  69. package/dist/{chunk-74MBKLYI.js → chunk-L23WWO3D.js} +9 -5
  70. package/dist/chunk-L23WWO3D.js.map +1 -0
  71. package/dist/{chunk-YJXZR7RL.js → chunk-L5Q6UDY3.js} +4 -4
  72. package/dist/{chunk-5BX4Q76D.cjs → chunk-LVHZBCTA.cjs} +3 -3
  73. package/dist/{chunk-5BX4Q76D.cjs.map → chunk-LVHZBCTA.cjs.map} +1 -1
  74. package/dist/{chunk-SENVA467.js → chunk-M7PF4FKQ.js} +6 -2
  75. package/dist/chunk-M7PF4FKQ.js.map +1 -0
  76. package/dist/chunk-ND526PMG.cjs +145 -0
  77. package/dist/chunk-ND526PMG.cjs.map +1 -0
  78. package/dist/{chunk-TRLBYA5G.cjs → chunk-NEYLNRVG.cjs} +5 -5
  79. package/dist/{chunk-TRLBYA5G.cjs.map → chunk-NEYLNRVG.cjs.map} +1 -1
  80. package/dist/{chunk-ZEZK664O.js → chunk-NWJ6NETE.js} +13 -13
  81. package/dist/{chunk-SEDKUITE.cjs → chunk-NZO2I5AL.cjs} +7 -7
  82. package/dist/{chunk-SEDKUITE.cjs.map → chunk-NZO2I5AL.cjs.map} +1 -1
  83. package/dist/{chunk-5ZL6PYU3.js → chunk-O2AACVSF.js} +3 -3
  84. package/dist/chunk-O3LG7B2J.cjs +186 -0
  85. package/dist/chunk-O3LG7B2J.cjs.map +1 -0
  86. package/dist/{chunk-SHYSLWQG.js → chunk-OAK7HFOJ.js} +4 -4
  87. package/dist/{chunk-QF2RAUPB.cjs → chunk-OAPOGYA5.cjs} +7 -3
  88. package/dist/chunk-OAPOGYA5.cjs.map +1 -0
  89. package/dist/{chunk-SKEWTQJ7.cjs → chunk-OMLXP2CK.cjs} +7 -7
  90. package/dist/{chunk-SKEWTQJ7.cjs.map → chunk-OMLXP2CK.cjs.map} +1 -1
  91. package/dist/{chunk-VSTQEHVZ.js → chunk-PR7CVQ4R.js} +10 -7
  92. package/dist/chunk-PR7CVQ4R.js.map +1 -0
  93. package/dist/{chunk-6HUHH6Y4.cjs → chunk-Q6ICDKQZ.cjs} +22 -19
  94. package/dist/chunk-Q6ICDKQZ.cjs.map +1 -0
  95. package/dist/{chunk-NGVOXM7P.js → chunk-QIITXVRG.js} +4 -4
  96. package/dist/{chunk-GI6VJYOS.js → chunk-QUDVJUZU.js} +3 -3
  97. package/dist/chunk-QZX3A4FX.js +886 -0
  98. package/dist/chunk-QZX3A4FX.js.map +1 -0
  99. package/dist/chunk-R3WPVTGY.cjs +886 -0
  100. package/dist/chunk-R3WPVTGY.cjs.map +1 -0
  101. package/dist/{chunk-SN6EWQDJ.js → chunk-RYOQYYDO.js} +3 -3
  102. package/dist/chunk-S4S4LB63.js +186 -0
  103. package/dist/chunk-S4S4LB63.js.map +1 -0
  104. package/dist/{chunk-67RFMV6K.js → chunk-T2KB3DJJ.js} +2 -2
  105. package/dist/{chunk-5VM2256W.cjs → chunk-TEVZHN5I.cjs} +11 -10
  106. package/dist/chunk-TEVZHN5I.cjs.map +1 -0
  107. package/dist/{chunk-RKA2OJRT.js → chunk-TJC7UELT.js} +18 -18
  108. package/dist/{chunk-SKTDGCWJ.cjs → chunk-UOOGS6N7.cjs} +48 -48
  109. package/dist/{chunk-SKTDGCWJ.cjs.map → chunk-UOOGS6N7.cjs.map} +1 -1
  110. package/dist/{chunk-JRYTZ5B2.cjs → chunk-VRQBDTLT.cjs} +32 -32
  111. package/dist/{chunk-JRYTZ5B2.cjs.map → chunk-VRQBDTLT.cjs.map} +1 -1
  112. package/dist/{chunk-AXBYJ2OY.cjs → chunk-WFEORBLC.cjs} +8 -8
  113. package/dist/{chunk-AXBYJ2OY.cjs.map → chunk-WFEORBLC.cjs.map} +1 -1
  114. package/dist/chunk-WKDT2XFQ.js +145 -0
  115. package/dist/chunk-WKDT2XFQ.js.map +1 -0
  116. package/dist/{chunk-APK5OQRV.cjs → chunk-WWYJNWJY.cjs} +6 -6
  117. package/dist/{chunk-APK5OQRV.cjs.map → chunk-WWYJNWJY.cjs.map} +1 -1
  118. package/dist/{chunk-A7WQINIG.js → chunk-X3U7SDOZ.js} +7 -6
  119. package/dist/chunk-X3U7SDOZ.js.map +1 -0
  120. package/dist/{chunk-LEMCJW57.js → chunk-YDPEHUMH.js} +2 -2
  121. package/dist/{chunk-GGSII6Y2.cjs → chunk-ZGT4LT5Y.cjs} +33 -33
  122. package/dist/{chunk-GGSII6Y2.cjs.map → chunk-ZGT4LT5Y.cjs.map} +1 -1
  123. package/dist/{chunk-LUL6RZ4M.cjs → chunk-ZNWIHUHZ.cjs} +3 -3
  124. package/dist/{chunk-LUL6RZ4M.cjs.map → chunk-ZNWIHUHZ.cjs.map} +1 -1
  125. package/dist/{chunk-S3CT536K.js → chunk-ZPDETHQ7.js} +2 -2
  126. package/dist/color-picker/index.cjs +4 -3
  127. package/dist/color-picker/index.cjs.map +1 -1
  128. package/dist/color-picker/index.js +3 -2
  129. package/dist/combobox/index.cjs +5 -5
  130. package/dist/combobox/index.js +4 -4
  131. package/dist/context-menu/index.cjs +5 -5
  132. package/dist/context-menu/index.js +4 -4
  133. package/dist/conversation/index.cjs +28 -0
  134. package/dist/conversation/index.cjs.map +1 -0
  135. package/dist/conversation/index.d.cts +254 -0
  136. package/dist/conversation/index.d.ts +254 -0
  137. package/dist/conversation/index.js +28 -0
  138. package/dist/conversation/index.js.map +1 -0
  139. package/dist/data-grid/index.cjs +16 -16
  140. package/dist/data-grid/index.d.cts +1 -1
  141. package/dist/data-grid/index.d.ts +1 -1
  142. package/dist/data-grid/index.js +15 -15
  143. package/dist/date-picker/index.cjs +7 -7
  144. package/dist/date-picker/index.js +6 -6
  145. package/dist/drawer/index.cjs +4 -4
  146. package/dist/drawer/index.js +3 -3
  147. package/dist/dropdown/index.cjs +3 -2
  148. package/dist/dropdown/index.cjs.map +1 -1
  149. package/dist/dropdown/index.js +2 -1
  150. package/dist/header/index.cjs +8 -4
  151. package/dist/header/index.cjs.map +1 -1
  152. package/dist/header/index.d.cts +35 -4
  153. package/dist/header/index.d.ts +35 -4
  154. package/dist/header/index.js +9 -5
  155. package/dist/index.cjs +66 -56
  156. package/dist/index.cjs.map +1 -1
  157. package/dist/index.css +1015 -167
  158. package/dist/index.d.cts +5 -4
  159. package/dist/index.d.ts +5 -4
  160. package/dist/index.js +84 -74
  161. package/dist/inline-edit/index.cjs +4 -4
  162. package/dist/inline-edit/index.js +3 -3
  163. package/dist/input/index.cjs +3 -3
  164. package/dist/input/index.js +2 -2
  165. package/dist/menu/index.cjs +4 -4
  166. package/dist/menu/index.js +3 -3
  167. package/dist/modal/index.cjs +4 -4
  168. package/dist/modal/index.js +3 -3
  169. package/dist/navigation/index.cjs +4 -4
  170. package/dist/navigation/index.d.cts +2 -2
  171. package/dist/navigation/index.d.ts +2 -2
  172. package/dist/navigation/index.js +3 -3
  173. package/dist/number-input/index.cjs +3 -2
  174. package/dist/number-input/index.cjs.map +1 -1
  175. package/dist/number-input/index.js +2 -1
  176. package/dist/page-layout/index.cjs +10 -9
  177. package/dist/page-layout/index.cjs.map +1 -1
  178. package/dist/page-layout/index.d.cts +2 -2
  179. package/dist/page-layout/index.d.ts +2 -2
  180. package/dist/page-layout/index.js +9 -8
  181. package/dist/pagination/index.cjs +7 -7
  182. package/dist/pagination/index.js +6 -6
  183. package/dist/segmented-control/index.cjs +3 -3
  184. package/dist/segmented-control/index.d.cts +2 -2
  185. package/dist/segmented-control/index.d.ts +2 -2
  186. package/dist/segmented-control/index.js +2 -2
  187. package/dist/select/index.cjs +5 -5
  188. package/dist/select/index.js +4 -4
  189. package/dist/snackbar/index.cjs +4 -4
  190. package/dist/snackbar/index.js +3 -3
  191. package/dist/split-button/index.cjs +5 -5
  192. package/dist/split-button/index.js +4 -4
  193. package/dist/table/index.cjs +16 -16
  194. package/dist/table/index.cjs.map +1 -1
  195. package/dist/table/index.js +15 -15
  196. package/dist/tabs/index.cjs +3 -3
  197. package/dist/tabs/index.js +2 -2
  198. package/dist/tag-input/index.cjs +5 -5
  199. package/dist/tag-input/index.js +4 -4
  200. package/dist/textarea/index.cjs +3 -3
  201. package/dist/textarea/index.js +2 -2
  202. package/dist/theme-editor/index.cjs +11 -11
  203. package/dist/theme-editor/index.js +10 -10
  204. package/dist/theme-provider/index.cjs +3 -3
  205. package/dist/theme-provider/index.js +2 -2
  206. package/dist/toolbar/index.cjs +6 -6
  207. package/dist/toolbar/index.js +5 -5
  208. package/package.json +1 -1
  209. package/dist/Header.types-B3QtuiL-.d.cts +0 -21
  210. package/dist/Header.types-C6w0FBY8.d.ts +0 -21
  211. package/dist/chunk-4BKTBV2I.js.map +0 -1
  212. package/dist/chunk-5VM2256W.cjs.map +0 -1
  213. package/dist/chunk-6HUHH6Y4.cjs.map +0 -1
  214. package/dist/chunk-74MBKLYI.js.map +0 -1
  215. package/dist/chunk-A7WQINIG.js.map +0 -1
  216. package/dist/chunk-AAA6TR5I.cjs +0 -67
  217. package/dist/chunk-AAA6TR5I.cjs.map +0 -1
  218. package/dist/chunk-FRUOA2QU.cjs.map +0 -1
  219. package/dist/chunk-GEHL4LKK.cjs.map +0 -1
  220. package/dist/chunk-GT22EGJP.cjs.map +0 -1
  221. package/dist/chunk-IFVT5UCY.js.map +0 -1
  222. package/dist/chunk-KBG77JHC.js.map +0 -1
  223. package/dist/chunk-KJZUYC4X.cjs.map +0 -1
  224. package/dist/chunk-KQD7CQ4Z.cjs.map +0 -1
  225. package/dist/chunk-O5WEKLNF.js +0 -21
  226. package/dist/chunk-O5WEKLNF.js.map +0 -1
  227. package/dist/chunk-P7IQY5YH.js +0 -67
  228. package/dist/chunk-P7IQY5YH.js.map +0 -1
  229. package/dist/chunk-QF2RAUPB.cjs.map +0 -1
  230. package/dist/chunk-REVK7IGN.js.map +0 -1
  231. package/dist/chunk-RHOT7AEI.cjs.map +0 -1
  232. package/dist/chunk-SENVA467.js.map +0 -1
  233. package/dist/chunk-TEJIPPZR.js.map +0 -1
  234. package/dist/chunk-VHMOKXUT.js.map +0 -1
  235. package/dist/chunk-VSTQEHVZ.js.map +0 -1
  236. package/dist/chunk-WUBQJVB7.cjs.map +0 -1
  237. package/dist/chunk-Z4SLV6WG.cjs +0 -21
  238. package/dist/chunk-Z4SLV6WG.cjs.map +0 -1
  239. /package/dist/{chunk-RWOX2NJN.js.map → chunk-25PSIDPC.js.map} +0 -0
  240. /package/dist/{chunk-SYWSXSHY.js.map → chunk-2WP27QAN.js.map} +0 -0
  241. /package/dist/{chunk-EXITZVB2.js.map → chunk-3RLGH45H.js.map} +0 -0
  242. /package/dist/{chunk-R4PU2TBM.js.map → chunk-4ZWAJTNH.js.map} +0 -0
  243. /package/dist/{chunk-F26VIKNF.js.map → chunk-ATL7325T.js.map} +0 -0
  244. /package/dist/{chunk-GHQ6SQPI.js.map → chunk-BHVHM66Z.js.map} +0 -0
  245. /package/dist/{chunk-Y53HCLGW.js.map → chunk-FALDCW2E.js.map} +0 -0
  246. /package/dist/{chunk-ZHFPV43D.js.map → chunk-KNQ6NN6L.js.map} +0 -0
  247. /package/dist/{chunk-GWQEADRJ.js.map → chunk-KQJ3IAFT.js.map} +0 -0
  248. /package/dist/{chunk-YJXZR7RL.js.map → chunk-L5Q6UDY3.js.map} +0 -0
  249. /package/dist/{chunk-ZEZK664O.js.map → chunk-NWJ6NETE.js.map} +0 -0
  250. /package/dist/{chunk-5ZL6PYU3.js.map → chunk-O2AACVSF.js.map} +0 -0
  251. /package/dist/{chunk-SHYSLWQG.js.map → chunk-OAK7HFOJ.js.map} +0 -0
  252. /package/dist/{chunk-NGVOXM7P.js.map → chunk-QIITXVRG.js.map} +0 -0
  253. /package/dist/{chunk-GI6VJYOS.js.map → chunk-QUDVJUZU.js.map} +0 -0
  254. /package/dist/{chunk-SN6EWQDJ.js.map → chunk-RYOQYYDO.js.map} +0 -0
  255. /package/dist/{chunk-67RFMV6K.js.map → chunk-T2KB3DJJ.js.map} +0 -0
  256. /package/dist/{chunk-RKA2OJRT.js.map → chunk-TJC7UELT.js.map} +0 -0
  257. /package/dist/{chunk-LEMCJW57.js.map → chunk-YDPEHUMH.js.map} +0 -0
  258. /package/dist/{chunk-S3CT536K.js.map → chunk-ZPDETHQ7.js.map} +0 -0
@@ -1,9 +1,9 @@
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 _chunkTRLBYA5Gcjs = require('./chunk-TRLBYA5G.cjs');
3
+ var _chunkNEYLNRVGcjs = require('./chunk-NEYLNRVG.cjs');
4
4
 
5
5
 
6
- var _chunkFRUOA2QUcjs = require('./chunk-FRUOA2QU.cjs');
6
+ var _chunk75VXB3H2cjs = require('./chunk-75VXB3H2.cjs');
7
7
 
8
8
  // src/components/TagInput/TagInput.component.tsx
9
9
  var _react = require('react');
@@ -206,7 +206,7 @@ var TagInput = ({
206
206
  label && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "label", { htmlFor: inputId, className: "eidos-tag-input-label", children: label }),
207
207
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: fieldClasses, onClick: handleFieldClick, ref: fieldRef, children: [
208
208
  tags.map((tag, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
209
- _chunkTRLBYA5Gcjs.Chip,
209
+ _chunkNEYLNRVGcjs.Chip,
210
210
  {
211
211
  variant: "filled",
212
212
  color: "primary",
@@ -238,7 +238,7 @@ var TagInput = ({
238
238
  }
239
239
  ),
240
240
  hasSuggestions && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
241
- _chunkFRUOA2QUcjs.Dropdown,
241
+ _chunk75VXB3H2cjs.Dropdown,
242
242
  {
243
243
  trigger: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
244
244
  "span",
@@ -296,4 +296,4 @@ TagInput.displayName = "TagInput";
296
296
 
297
297
 
298
298
  exports.TagInput = TagInput;
299
- //# sourceMappingURL=chunk-442U3W6R.cjs.map
299
+ //# sourceMappingURL=chunk-4MZ7HEQC.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-442U3W6R.cjs","../src/components/TagInput/TagInput.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-442U3W6R.cjs","sourcesContent":[null,"import React, { useState, useId, useRef, useCallback, useMemo, useEffect } from 'react';\nimport { CircleAlert } from 'lucide-react';\nimport { Chip } from '../Chip/Chip.component';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport type { TagInputProps } from './TagInput.types';\nimport './TagInput.scss';\n\nexport const TagInput: React.FC<TagInputProps> = ({\n value,\n defaultValue = [],\n onChange,\n placeholder = 'Add tag…',\n size = 'md',\n disabled = false,\n label,\n error,\n hint,\n allowDuplicates = false,\n maxTags,\n separators = ['Enter', ',', 'Tab'],\n validate,\n className = '',\n fullWidth = false,\n suggestions,\n onSearch,\n suggestionsEmptyText = 'No matches',\n}) => {\n const generatedId = useId();\n const inputId = `tag-input-${generatedId}`;\n const inputRef = useRef<HTMLInputElement>(null);\n\n /** Entire component wrapper - used for click-outside detection on the suggestions dropdown */\n const containerRef = useRef<HTMLDivElement>(null);\n\n /** The field wrapper - passed to Dropdown as externalTriggerRef for width/anchoring */\n const fieldRef = useRef<HTMLDivElement>(null);\n\n /** The 0-height span that IS the Dropdown trigger element - programmatically clicked to open */\n const dropdownSpanRef = useRef<HTMLSpanElement>(null);\n\n const hasSuggestions = suggestions !== undefined;\n const isSuggestionsOpenRef = useRef(false);\n const [isSuggestionsOpen, setIsSuggestionsOpen] = useState(false);\n const [suggestionsMenuKey, setSuggestionsMenuKey] = useState(0);\n const [focusedSuggestionIndex, setFocusedSuggestionIndex] = useState(-1);\n\n const isControlled = value !== undefined;\n\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue);\n const [inputValue, setInputValue] = useState('');\n const [isFocused, setIsFocused] = useState(false);\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const tags = isControlled ? (value as string[]) : internalTags;\n\n const updateTags = useCallback(\n (newTags: string[]) => {\n if (!isControlled) {\n setInternalTags(newTags);\n }\n onChange?.(newTags);\n },\n [isControlled, onChange],\n );\n\n const addTag = useCallback(\n (rawTag: string) => {\n const tag = rawTag.trim();\n\n if (!tag) return;\n\n if (!allowDuplicates && tags.includes(tag)) return;\n\n if (maxTags !== undefined && tags.length >= maxTags) return;\n\n if (validate) {\n const result = validate(tag);\n if (result === false) return;\n if (typeof result === 'string') {\n setValidationError(result);\n return;\n }\n // result === true → valid, fall through\n }\n\n setValidationError(null);\n updateTags([...tags, tag]);\n setInputValue('');\n },\n [tags, allowDuplicates, maxTags, validate, updateTags],\n );\n\n const removeTag = useCallback(\n (index: number) => {\n updateTags(tags.filter((_, i) => i !== index));\n },\n [tags, updateTags],\n );\n\n // ─── Suggestions dropdown (autocomplete) ───────────────────────────────────\n\n const filteredSuggestions = useMemo<string[]>(() => {\n if (!suggestions) return [];\n const query = inputValue.trim().toLowerCase();\n return suggestions.filter((suggestion) => {\n if (!allowDuplicates && tags.includes(suggestion)) return false;\n if (!query) return true;\n return suggestion.toLowerCase().includes(query);\n });\n }, [suggestions, inputValue, tags, allowDuplicates]);\n\n useEffect(() => {\n setFocusedSuggestionIndex(-1);\n }, [filteredSuggestions]);\n\n const openSuggestions = useCallback(() => {\n if (isSuggestionsOpenRef.current || disabled || !hasSuggestions) return;\n dropdownSpanRef.current?.click(); // opens the Dropdown (bubbles to trigger)\n isSuggestionsOpenRef.current = true;\n setIsSuggestionsOpen(true);\n }, [disabled, hasSuggestions]);\n\n const closeSuggestions = useCallback(() => {\n isSuggestionsOpenRef.current = false;\n setIsSuggestionsOpen(false);\n setFocusedSuggestionIndex(-1);\n setSuggestionsMenuKey((prev) => prev + 1);\n }, []);\n\n const selectSuggestion = useCallback(\n (suggestion: string) => {\n addTag(suggestion);\n closeSuggestions();\n inputRef.current?.focus();\n },\n [addTag, closeSuggestions],\n );\n\n // Click-outside detection for the suggestions dropdown.\n useEffect(() => {\n if (!hasSuggestions) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n if (!isSuggestionsOpenRef.current) return;\n if (e.defaultPrevented) return; // click inside the portal-rendered listbox\n if (containerRef.current?.contains(e.target as Node)) return;\n closeSuggestions();\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [hasSuggestions, closeSuggestions]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (hasSuggestions && isSuggestionsOpenRef.current && filteredSuggestions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedSuggestionIndex((prev) => (prev + 1 < filteredSuggestions.length ? prev + 1 : 0));\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedSuggestionIndex((prev) => (prev > 0 ? prev - 1 : filteredSuggestions.length - 1));\n return;\n }\n if (e.key === 'Enter' && focusedSuggestionIndex >= 0) {\n e.preventDefault();\n selectSuggestion(filteredSuggestions[focusedSuggestionIndex]);\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n closeSuggestions();\n return;\n }\n }\n\n if (separators.includes(e.key)) {\n e.preventDefault();\n addTag(inputValue);\n return;\n }\n\n if (e.key === 'Backspace' && inputValue === '' && tags.length > 0) {\n e.preventDefault();\n removeTag(tags.length - 1);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setInputValue(query);\n if (validationError) {\n setValidationError(null);\n }\n onSearch?.(query);\n if (hasSuggestions && !isSuggestionsOpenRef.current) openSuggestions();\n };\n\n const handleInputFocus = () => {\n setIsFocused(true);\n if (hasSuggestions) openSuggestions();\n };\n\n const handleFieldClick = (e: React.MouseEvent<HTMLDivElement>) => {\n // Don't steal focus from interactive child elements\n if ((e.target as HTMLElement).closest('button, input')) return;\n if (!disabled) {\n inputRef.current?.focus();\n }\n };\n\n const displayError = validationError ?? error;\n const hasError = !!displayError;\n const errorId = `${inputId}-error`;\n const hintId = `${inputId}-hint`;\n\n const containerClasses = [\n 'eidos-tag-input',\n hasError && 'eidos-tag-input--error',\n disabled && 'eidos-tag-input--disabled',\n fullWidth && 'eidos-tag-input--full-width',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const fieldClasses = [\n 'eidos-tag-input-field',\n `eidos-tag-input-field--${size}`,\n isFocused && 'eidos-tag-input-field--focused',\n hasError && 'eidos-tag-input-field--error',\n disabled && 'eidos-tag-input-field--disabled',\n ]\n .filter(Boolean)\n .join(' ');\n\n const uid = generatedId;\n\n return (\n <div\n className={containerClasses}\n ref={containerRef}\n aria-expanded={hasSuggestions ? isSuggestionsOpen : undefined}\n aria-haspopup={hasSuggestions ? 'listbox' : undefined}\n >\n {label && (\n <label htmlFor={inputId} className=\"eidos-tag-input-label\">\n {label}\n </label>\n )}\n\n <div className={fieldClasses} onClick={handleFieldClick} ref={fieldRef}>\n {tags.map((tag, index) => (\n <Chip\n key={`${tag}-${index}`}\n variant=\"filled\"\n color=\"primary\"\n size={size}\n onRemove={disabled ? undefined : () => removeTag(index)}\n >\n {tag}\n </Chip>\n ))}\n\n <input\n ref={inputRef}\n id={inputId}\n className=\"eidos-tag-input-input\"\n type=\"text\"\n value={inputValue}\n placeholder={tags.length === 0 ? placeholder : undefined}\n disabled={disabled}\n onKeyDown={handleKeyDown}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={() => setIsFocused(false)}\n aria-label={label ? undefined : 'Tag input'}\n aria-describedby={hasError ? errorId : hint ? hintId : undefined}\n aria-autocomplete={hasSuggestions ? 'list' : undefined}\n aria-controls={hasSuggestions ? `${uid}-tag-suggestions` : undefined}\n aria-activedescendant={\n hasSuggestions && focusedSuggestionIndex >= 0\n ? `${uid}-tag-suggestion-${focusedSuggestionIndex}`\n : undefined\n }\n />\n\n {hasSuggestions && (\n <Dropdown\n key={suggestionsMenuKey}\n trigger={\n <span\n ref={dropdownSpanRef}\n className=\"eidos-tag-input-dropdown-anchor\"\n aria-hidden=\"true\"\n />\n }\n content={\n <div\n id={`${uid}-tag-suggestions`}\n className=\"eidos-tag-input-suggestions\"\n role=\"listbox\"\n aria-label={label ?? 'Suggestions'}\n onMouseDown={(e) => e.preventDefault()}\n >\n {filteredSuggestions.length === 0 ? (\n <div className=\"eidos-tag-input-suggestions-empty\">{suggestionsEmptyText}</div>\n ) : (\n filteredSuggestions.map((suggestion, index) => (\n <div\n key={suggestion}\n id={`${uid}-tag-suggestion-${index}`}\n className={[\n 'eidos-tag-input-suggestion',\n index === focusedSuggestionIndex && 'eidos-tag-input-suggestion--focused',\n ]\n .filter(Boolean)\n .join(' ')}\n role=\"option\"\n aria-selected={index === focusedSuggestionIndex}\n onClick={() => selectSuggestion(suggestion)}\n onMouseEnter={() => setFocusedSuggestionIndex(index)}\n >\n {suggestion}\n </div>\n ))\n )}\n </div>\n }\n triggerRef={fieldRef as React.RefObject<HTMLElement | null>}\n autoWidth\n closeOnClickOutside={false}\n closeOnEscape={false}\n />\n )}\n </div>\n\n {hint && !hasError && (\n <p className=\"eidos-tag-input-hint\" id={hintId}>\n {hint}\n </p>\n )}\n\n {hasError && (\n <p className=\"eidos-tag-input-error-message\" id={errorId} role=\"alert\">\n <CircleAlert />\n {displayError}\n </p>\n )}\n </div>\n );\n};\n\nTagInput.displayName = 'TagInput';\n"]}
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-4MZ7HEQC.cjs","../src/components/TagInput/TagInput.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-4MZ7HEQC.cjs","sourcesContent":[null,"import React, { useState, useId, useRef, useCallback, useMemo, useEffect } from 'react';\nimport { CircleAlert } from 'lucide-react';\nimport { Chip } from '../Chip/Chip.component';\nimport { Dropdown } from '../Dropdown/Dropdown.component';\nimport type { TagInputProps } from './TagInput.types';\nimport './TagInput.scss';\n\nexport const TagInput: React.FC<TagInputProps> = ({\n value,\n defaultValue = [],\n onChange,\n placeholder = 'Add tag…',\n size = 'md',\n disabled = false,\n label,\n error,\n hint,\n allowDuplicates = false,\n maxTags,\n separators = ['Enter', ',', 'Tab'],\n validate,\n className = '',\n fullWidth = false,\n suggestions,\n onSearch,\n suggestionsEmptyText = 'No matches',\n}) => {\n const generatedId = useId();\n const inputId = `tag-input-${generatedId}`;\n const inputRef = useRef<HTMLInputElement>(null);\n\n /** Entire component wrapper - used for click-outside detection on the suggestions dropdown */\n const containerRef = useRef<HTMLDivElement>(null);\n\n /** The field wrapper - passed to Dropdown as externalTriggerRef for width/anchoring */\n const fieldRef = useRef<HTMLDivElement>(null);\n\n /** The 0-height span that IS the Dropdown trigger element - programmatically clicked to open */\n const dropdownSpanRef = useRef<HTMLSpanElement>(null);\n\n const hasSuggestions = suggestions !== undefined;\n const isSuggestionsOpenRef = useRef(false);\n const [isSuggestionsOpen, setIsSuggestionsOpen] = useState(false);\n const [suggestionsMenuKey, setSuggestionsMenuKey] = useState(0);\n const [focusedSuggestionIndex, setFocusedSuggestionIndex] = useState(-1);\n\n const isControlled = value !== undefined;\n\n const [internalTags, setInternalTags] = useState<string[]>(defaultValue);\n const [inputValue, setInputValue] = useState('');\n const [isFocused, setIsFocused] = useState(false);\n const [validationError, setValidationError] = useState<string | null>(null);\n\n const tags = isControlled ? (value as string[]) : internalTags;\n\n const updateTags = useCallback(\n (newTags: string[]) => {\n if (!isControlled) {\n setInternalTags(newTags);\n }\n onChange?.(newTags);\n },\n [isControlled, onChange],\n );\n\n const addTag = useCallback(\n (rawTag: string) => {\n const tag = rawTag.trim();\n\n if (!tag) return;\n\n if (!allowDuplicates && tags.includes(tag)) return;\n\n if (maxTags !== undefined && tags.length >= maxTags) return;\n\n if (validate) {\n const result = validate(tag);\n if (result === false) return;\n if (typeof result === 'string') {\n setValidationError(result);\n return;\n }\n // result === true → valid, fall through\n }\n\n setValidationError(null);\n updateTags([...tags, tag]);\n setInputValue('');\n },\n [tags, allowDuplicates, maxTags, validate, updateTags],\n );\n\n const removeTag = useCallback(\n (index: number) => {\n updateTags(tags.filter((_, i) => i !== index));\n },\n [tags, updateTags],\n );\n\n // ─── Suggestions dropdown (autocomplete) ───────────────────────────────────\n\n const filteredSuggestions = useMemo<string[]>(() => {\n if (!suggestions) return [];\n const query = inputValue.trim().toLowerCase();\n return suggestions.filter((suggestion) => {\n if (!allowDuplicates && tags.includes(suggestion)) return false;\n if (!query) return true;\n return suggestion.toLowerCase().includes(query);\n });\n }, [suggestions, inputValue, tags, allowDuplicates]);\n\n useEffect(() => {\n setFocusedSuggestionIndex(-1);\n }, [filteredSuggestions]);\n\n const openSuggestions = useCallback(() => {\n if (isSuggestionsOpenRef.current || disabled || !hasSuggestions) return;\n dropdownSpanRef.current?.click(); // opens the Dropdown (bubbles to trigger)\n isSuggestionsOpenRef.current = true;\n setIsSuggestionsOpen(true);\n }, [disabled, hasSuggestions]);\n\n const closeSuggestions = useCallback(() => {\n isSuggestionsOpenRef.current = false;\n setIsSuggestionsOpen(false);\n setFocusedSuggestionIndex(-1);\n setSuggestionsMenuKey((prev) => prev + 1);\n }, []);\n\n const selectSuggestion = useCallback(\n (suggestion: string) => {\n addTag(suggestion);\n closeSuggestions();\n inputRef.current?.focus();\n },\n [addTag, closeSuggestions],\n );\n\n // Click-outside detection for the suggestions dropdown.\n useEffect(() => {\n if (!hasSuggestions) return;\n\n const handleMouseDown = (e: MouseEvent) => {\n if (!isSuggestionsOpenRef.current) return;\n if (e.defaultPrevented) return; // click inside the portal-rendered listbox\n if (containerRef.current?.contains(e.target as Node)) return;\n closeSuggestions();\n };\n\n document.addEventListener('mousedown', handleMouseDown);\n return () => document.removeEventListener('mousedown', handleMouseDown);\n }, [hasSuggestions, closeSuggestions]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (hasSuggestions && isSuggestionsOpenRef.current && filteredSuggestions.length > 0) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedSuggestionIndex((prev) => (prev + 1 < filteredSuggestions.length ? prev + 1 : 0));\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedSuggestionIndex((prev) => (prev > 0 ? prev - 1 : filteredSuggestions.length - 1));\n return;\n }\n if (e.key === 'Enter' && focusedSuggestionIndex >= 0) {\n e.preventDefault();\n selectSuggestion(filteredSuggestions[focusedSuggestionIndex]);\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n closeSuggestions();\n return;\n }\n }\n\n if (separators.includes(e.key)) {\n e.preventDefault();\n addTag(inputValue);\n return;\n }\n\n if (e.key === 'Backspace' && inputValue === '' && tags.length > 0) {\n e.preventDefault();\n removeTag(tags.length - 1);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const query = e.target.value;\n setInputValue(query);\n if (validationError) {\n setValidationError(null);\n }\n onSearch?.(query);\n if (hasSuggestions && !isSuggestionsOpenRef.current) openSuggestions();\n };\n\n const handleInputFocus = () => {\n setIsFocused(true);\n if (hasSuggestions) openSuggestions();\n };\n\n const handleFieldClick = (e: React.MouseEvent<HTMLDivElement>) => {\n // Don't steal focus from interactive child elements\n if ((e.target as HTMLElement).closest('button, input')) return;\n if (!disabled) {\n inputRef.current?.focus();\n }\n };\n\n const displayError = validationError ?? error;\n const hasError = !!displayError;\n const errorId = `${inputId}-error`;\n const hintId = `${inputId}-hint`;\n\n const containerClasses = [\n 'eidos-tag-input',\n hasError && 'eidos-tag-input--error',\n disabled && 'eidos-tag-input--disabled',\n fullWidth && 'eidos-tag-input--full-width',\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n const fieldClasses = [\n 'eidos-tag-input-field',\n `eidos-tag-input-field--${size}`,\n isFocused && 'eidos-tag-input-field--focused',\n hasError && 'eidos-tag-input-field--error',\n disabled && 'eidos-tag-input-field--disabled',\n ]\n .filter(Boolean)\n .join(' ');\n\n const uid = generatedId;\n\n return (\n <div\n className={containerClasses}\n ref={containerRef}\n aria-expanded={hasSuggestions ? isSuggestionsOpen : undefined}\n aria-haspopup={hasSuggestions ? 'listbox' : undefined}\n >\n {label && (\n <label htmlFor={inputId} className=\"eidos-tag-input-label\">\n {label}\n </label>\n )}\n\n <div className={fieldClasses} onClick={handleFieldClick} ref={fieldRef}>\n {tags.map((tag, index) => (\n <Chip\n key={`${tag}-${index}`}\n variant=\"filled\"\n color=\"primary\"\n size={size}\n onRemove={disabled ? undefined : () => removeTag(index)}\n >\n {tag}\n </Chip>\n ))}\n\n <input\n ref={inputRef}\n id={inputId}\n className=\"eidos-tag-input-input\"\n type=\"text\"\n value={inputValue}\n placeholder={tags.length === 0 ? placeholder : undefined}\n disabled={disabled}\n onKeyDown={handleKeyDown}\n onChange={handleInputChange}\n onFocus={handleInputFocus}\n onBlur={() => setIsFocused(false)}\n aria-label={label ? undefined : 'Tag input'}\n aria-describedby={hasError ? errorId : hint ? hintId : undefined}\n aria-autocomplete={hasSuggestions ? 'list' : undefined}\n aria-controls={hasSuggestions ? `${uid}-tag-suggestions` : undefined}\n aria-activedescendant={\n hasSuggestions && focusedSuggestionIndex >= 0\n ? `${uid}-tag-suggestion-${focusedSuggestionIndex}`\n : undefined\n }\n />\n\n {hasSuggestions && (\n <Dropdown\n key={suggestionsMenuKey}\n trigger={\n <span\n ref={dropdownSpanRef}\n className=\"eidos-tag-input-dropdown-anchor\"\n aria-hidden=\"true\"\n />\n }\n content={\n <div\n id={`${uid}-tag-suggestions`}\n className=\"eidos-tag-input-suggestions\"\n role=\"listbox\"\n aria-label={label ?? 'Suggestions'}\n onMouseDown={(e) => e.preventDefault()}\n >\n {filteredSuggestions.length === 0 ? (\n <div className=\"eidos-tag-input-suggestions-empty\">{suggestionsEmptyText}</div>\n ) : (\n filteredSuggestions.map((suggestion, index) => (\n <div\n key={suggestion}\n id={`${uid}-tag-suggestion-${index}`}\n className={[\n 'eidos-tag-input-suggestion',\n index === focusedSuggestionIndex && 'eidos-tag-input-suggestion--focused',\n ]\n .filter(Boolean)\n .join(' ')}\n role=\"option\"\n aria-selected={index === focusedSuggestionIndex}\n onClick={() => selectSuggestion(suggestion)}\n onMouseEnter={() => setFocusedSuggestionIndex(index)}\n >\n {suggestion}\n </div>\n ))\n )}\n </div>\n }\n triggerRef={fieldRef as React.RefObject<HTMLElement | null>}\n autoWidth\n closeOnClickOutside={false}\n closeOnEscape={false}\n />\n )}\n </div>\n\n {hint && !hasError && (\n <p className=\"eidos-tag-input-hint\" id={hintId}>\n {hint}\n </p>\n )}\n\n {hasError && (\n <p className=\"eidos-tag-input-error-message\" id={errorId} role=\"alert\">\n <CircleAlert />\n {displayError}\n </p>\n )}\n </div>\n );\n};\n\nTagInput.displayName = 'TagInput';\n"]}
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  Chip
3
- } from "./chunk-SHYSLWQG.js";
3
+ } from "./chunk-OAK7HFOJ.js";
4
4
  import {
5
5
  Dropdown
6
- } from "./chunk-4BKTBV2I.js";
6
+ } from "./chunk-2R77XZEP.js";
7
7
 
8
8
  // src/components/TagInput/TagInput.component.tsx
9
9
  import { useState, useId, useRef, useCallback, useMemo, useEffect } from "react";
@@ -296,4 +296,4 @@ TagInput.displayName = "TagInput";
296
296
  export {
297
297
  TagInput
298
298
  };
299
- //# sourceMappingURL=chunk-R4PU2TBM.js.map
299
+ //# sourceMappingURL=chunk-4ZWAJTNH.js.map
@@ -1,9 +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 _chunkGEHL4LKKcjs = require('./chunk-GEHL4LKK.cjs');
3
+ var _chunkZ5U4NJTWcjs = require('./chunk-Z5U4NJTW.cjs');
4
4
 
5
5
 
6
- var _chunkZ5U4NJTWcjs = require('./chunk-Z5U4NJTW.cjs');
6
+
7
+ var _chunkCUJBNRJJcjs = require('./chunk-CUJBNRJJ.cjs');
7
8
 
8
9
  // src/components/Textarea/Textarea.component.tsx
9
10
  var _react = require('react');
@@ -47,7 +48,7 @@ var Textarea = _react.forwardRef.call(void 0,
47
48
  };
48
49
  const containerClasses = [
49
50
  "eidos-textarea-container",
50
- fullWidth && "eidos-textarea-container--fullWidth",
51
+ fullWidth && _chunkCUJBNRJJcjs.fullWidthModifier.call(void 0, "eidos-textarea-container"),
51
52
  className
52
53
  ].filter(Boolean).join(" ");
53
54
  const wrapperClasses = [
@@ -55,7 +56,7 @@ var Textarea = _react.forwardRef.call(void 0,
55
56
  `eidos-textarea-wrapper--${variant}`,
56
57
  `eidos-textarea-wrapper--${color}`,
57
58
  `eidos-textarea-wrapper--${size}`,
58
- fullWidth && "eidos-textarea-wrapper--fullWidth",
59
+ fullWidth && _chunkCUJBNRJJcjs.fullWidthModifier.call(void 0, "eidos-textarea-wrapper"),
59
60
  loading && "eidos-textarea-wrapper--loading",
60
61
  isFocused && "eidos-textarea-wrapper--focused",
61
62
  error && "eidos-textarea-wrapper--error"
@@ -66,7 +67,7 @@ var Textarea = _react.forwardRef.call(void 0,
66
67
  `eidos-textarea--${color}`,
67
68
  `eidos-textarea--${size}`,
68
69
  `eidos-textarea--resize-${resize}`,
69
- fullWidth && "eidos-textarea--fullWidth",
70
+ fullWidth && _chunkCUJBNRJJcjs.fullWidthModifier.call(void 0, "eidos-textarea"),
70
71
  loading && "eidos-textarea--loading",
71
72
  error && "eidos-textarea--error"
72
73
  ].filter(Boolean).join(" ");
@@ -80,7 +81,7 @@ var Textarea = _react.forwardRef.call(void 0,
80
81
  label && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "label", { htmlFor: textareaId, className: labelClasses, children: [
81
82
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-label-text", children: label }),
82
83
  isRequired && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-required-asterisk", children: "*" }),
83
- disclaimerIcon && (disclaimerContent ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZ5U4NJTWcjs.Tooltip, { message: disclaimerContent, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-disclaimer-icon", children: _chunkGEHL4LKKcjs.renderIcon.call(void 0, disclaimerIcon, "eidos-textarea-disclaimer-icon-svg") }) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-disclaimer-icon", children: _chunkGEHL4LKKcjs.renderIcon.call(void 0, disclaimerIcon, "eidos-textarea-disclaimer-icon-svg") }))
84
+ disclaimerIcon && (disclaimerContent ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZ5U4NJTWcjs.Tooltip, { message: disclaimerContent, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-disclaimer-icon", children: _chunkCUJBNRJJcjs.renderIcon.call(void 0, disclaimerIcon, "eidos-textarea-disclaimer-icon-svg") }) }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-textarea-disclaimer-icon", children: _chunkCUJBNRJJcjs.renderIcon.call(void 0, disclaimerIcon, "eidos-textarea-disclaimer-icon-svg") }))
84
85
  ] }),
85
86
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: wrapperClasses, children: [
86
87
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
@@ -123,4 +124,4 @@ Textarea.displayName = "Textarea";
123
124
 
124
125
 
125
126
  exports.Textarea = Textarea;
126
- //# sourceMappingURL=chunk-RHOT7AEI.cjs.map
127
+ //# sourceMappingURL=chunk-55J4LEKT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-55J4LEKT.cjs","../src/components/Textarea/Textarea.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACA;ACRA,8BAAmD;AACnD,2CAA4B;AAyGlB,+CAAA;AApGH,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;AAKD,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;AACX,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;AAGO,MAAA;AACU,wBAAA;AACN,wBAAA;AACT,MAAA;AAEJ,IAAA;AAEJ,EAAA;AACF;AAEuB;ADzC8B;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-55J4LEKT.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\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 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 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,9 +1,10 @@
1
- import {
2
- renderIcon
3
- } from "./chunk-KBG77JHC.js";
4
1
  import {
5
2
  Tooltip
6
3
  } from "./chunk-YV57RSPD.js";
4
+ import {
5
+ fullWidthModifier,
6
+ renderIcon
7
+ } from "./chunk-EAJHEYZM.js";
7
8
 
8
9
  // src/components/Textarea/Textarea.component.tsx
9
10
  import { forwardRef, useState, useId } from "react";
@@ -47,7 +48,7 @@ var Textarea = forwardRef(
47
48
  };
48
49
  const containerClasses = [
49
50
  "eidos-textarea-container",
50
- fullWidth && "eidos-textarea-container--fullWidth",
51
+ fullWidth && fullWidthModifier("eidos-textarea-container"),
51
52
  className
52
53
  ].filter(Boolean).join(" ");
53
54
  const wrapperClasses = [
@@ -55,7 +56,7 @@ var Textarea = forwardRef(
55
56
  `eidos-textarea-wrapper--${variant}`,
56
57
  `eidos-textarea-wrapper--${color}`,
57
58
  `eidos-textarea-wrapper--${size}`,
58
- fullWidth && "eidos-textarea-wrapper--fullWidth",
59
+ fullWidth && fullWidthModifier("eidos-textarea-wrapper"),
59
60
  loading && "eidos-textarea-wrapper--loading",
60
61
  isFocused && "eidos-textarea-wrapper--focused",
61
62
  error && "eidos-textarea-wrapper--error"
@@ -66,7 +67,7 @@ var Textarea = forwardRef(
66
67
  `eidos-textarea--${color}`,
67
68
  `eidos-textarea--${size}`,
68
69
  `eidos-textarea--resize-${resize}`,
69
- fullWidth && "eidos-textarea--fullWidth",
70
+ fullWidth && fullWidthModifier("eidos-textarea"),
70
71
  loading && "eidos-textarea--loading",
71
72
  error && "eidos-textarea--error"
72
73
  ].filter(Boolean).join(" ");
@@ -123,4 +124,4 @@ Textarea.displayName = "Textarea";
123
124
  export {
124
125
  Textarea
125
126
  };
126
- //# sourceMappingURL=chunk-REVK7IGN.js.map
127
+ //# sourceMappingURL=chunk-5WH3JMR5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Textarea/Textarea.component.tsx"],"sourcesContent":["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\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 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 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"],"mappings":"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","names":[]}
@@ -3,13 +3,13 @@
3
3
  var _chunkQ3GNKF74cjs = require('./chunk-Q3GNKF74.cjs');
4
4
 
5
5
 
6
- var _chunkAPK5OQRVcjs = require('./chunk-APK5OQRV.cjs');
6
+ var _chunkWWYJNWJYcjs = require('./chunk-WWYJNWJY.cjs');
7
7
 
8
8
 
9
- var _chunkGEHL4LKKcjs = require('./chunk-GEHL4LKK.cjs');
9
+ var _chunkZ5U4NJTWcjs = require('./chunk-Z5U4NJTW.cjs');
10
10
 
11
11
 
12
- var _chunkZ5U4NJTWcjs = require('./chunk-Z5U4NJTW.cjs');
12
+ var _chunkCUJBNRJJcjs = require('./chunk-CUJBNRJJ.cjs');
13
13
 
14
14
  // src/components/Navigation/Navigation.component.tsx
15
15
  var _react = require('react');
@@ -40,15 +40,19 @@ var Navigation = ({
40
40
  const toggleCollapsed = _react.useCallback.call(void 0, () => {
41
41
  applyCollapsed(!collapsed);
42
42
  }, [applyCollapsed, collapsed]);
43
+ const applyCollapsedRef = _react.useRef.call(void 0, applyCollapsed);
44
+ _react.useEffect.call(void 0, () => {
45
+ applyCollapsedRef.current = applyCollapsed;
46
+ });
43
47
  _react.useEffect.call(void 0, () => {
44
- if (collapseBelow === void 0) return;
48
+ if (!collapseBelow) return;
45
49
  if (typeof window === "undefined" || !window.matchMedia) return;
46
50
  const query = window.matchMedia(`(max-width: ${collapseBelow}px)`);
47
- applyCollapsed(query.matches);
48
- const handleChange = (e) => applyCollapsed(e.matches);
51
+ if (query.matches) applyCollapsedRef.current(true);
52
+ const handleChange = (event) => applyCollapsedRef.current(event.matches);
49
53
  query.addEventListener("change", handleChange);
50
54
  return () => query.removeEventListener("change", handleChange);
51
- }, [collapseBelow, applyCollapsed]);
55
+ }, [collapseBelow]);
52
56
  const classes = ["eidos-navigation", collapsed && "eidos-navigation--collapsed", className].filter(Boolean).join(" ");
53
57
  const brandClasses = [
54
58
  "eidos-navigation__brand",
@@ -97,14 +101,14 @@ var Navigation = ({
97
101
  "aria-current": item.active ? "page" : void 0,
98
102
  "aria-label": collapsed ? item.label : void 0,
99
103
  children: [
100
- item.icon && _chunkGEHL4LKKcjs.renderIcon.call(void 0, item.icon, "eidos-navigation__item-icon"),
104
+ item.icon && _chunkCUJBNRJJcjs.renderIcon.call(void 0, item.icon, "eidos-navigation__item-icon"),
101
105
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-navigation__item-label", "aria-hidden": collapsed || void 0, children: item.label })
102
106
  ]
103
107
  }
104
108
  ) }) }, item.id)) }),
105
109
  footer && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-navigation__footer", children: footer }),
106
110
  collapsible && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-navigation__toggle", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
107
- _chunkAPK5OQRVcjs.IconButton,
111
+ _chunkWWYJNWJYcjs.IconButton,
108
112
  {
109
113
  icon: collapsed ? _lucidereact.SquareChevronRight : _lucidereact.SquareChevronLeft,
110
114
  variant: "text",
@@ -122,4 +126,4 @@ Navigation.displayName = "Navigation";
122
126
 
123
127
 
124
128
  exports.Navigation = Navigation;
125
- //# sourceMappingURL=chunk-GT22EGJP.cjs.map
129
+ //# sourceMappingURL=chunk-65PC3YDT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-65PC3YDT.cjs","../src/components/Navigation/Navigation.component.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-65PC3YDT.cjs","sourcesContent":[null,"import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { SquareChevronLeft, SquareChevronRight } from 'lucide-react';\nimport type { NavigationLogo, NavigationProps } from './Navigation.types';\nimport { Avatar } from '../Avatar';\nimport { IconButton } from '../Button';\nimport { Tooltip } from '../Tooltip';\nimport { renderIcon } from '../../utils';\nimport './Navigation.scss';\n\n/**\n * Renders a custom brand logo, guaranteeing correct aspect-ratio rendering\n * regardless of whether the source image is vertical, horizontal, or square\n * - and regardless of how much width is actually available, expanded or\n * collapsed. Deliberately no JS sizing/measurement at all: a fixed `height`,\n * `width: auto` (derived from the image's own intrinsic ratio), a `max-width`\n * expressed as `min(72px, 100%)` (see `.eidos-navigation__brand-logo` in\n * Navigation.scss) so it never renders wider than whatever space its\n * container - the rail, expanded or collapsed - actually has, and\n * `object-fit: contain` so it's letterboxed rather than distorted if that\n * ever clamps it below its natural width-at-32px-tall. Centering is handled\n * separately, at the row level - see `&__brand--logo-only` in Navigation.scss.\n */\nconst NavigationBrandLogo: React.FC<{ logo: NavigationLogo }> = ({ logo }) => (\n <img src={logo.src} alt={logo.alt} className=\"eidos-navigation__brand-logo\" />\n);\n\nexport const Navigation: React.FC<NavigationProps> = ({\n brand,\n items,\n footer,\n collapsed: collapsedProp,\n defaultCollapsed = false,\n onCollapsedChange,\n collapseBelow = 768,\n collapsible = true,\n className = '',\n}) => {\n // ── Controlled / uncontrolled collapsed state ─────────────────────────────\n // Mirrors CommandPalette's `open`/`defaultOpen` pattern - omitting\n // `collapsed` lets Navigation own its state entirely, while passing it\n // (+ `onCollapsedChange`) keeps full external control for consumers who\n // need to persist the preference or drive it from a responsive breakpoint.\n const isControlled = collapsedProp !== undefined;\n const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);\n const collapsed = isControlled ? collapsedProp : internalCollapsed;\n\n // Shared by the manual toggle button and `collapseBelow` below - uncontrolled\n // flips the internal state directly, controlled defers to `onCollapsedChange`\n // since Navigation can't change `collapsed` itself.\n const applyCollapsed = useCallback(\n (next: boolean) => {\n if (!isControlled) setInternalCollapsed(next);\n onCollapsedChange?.(next);\n },\n [isControlled, onCollapsedChange],\n );\n\n const toggleCollapsed = useCallback(() => {\n applyCollapsed(!collapsed);\n }, [applyCollapsed, collapsed]);\n\n // Read by the breakpoint effect below so it does not depend on\n // `applyCollapsed`'s identity. A consumer passing an inline\n // `onCollapsedChange` gives that callback a new identity every render,\n // which would re-run the effect - and re-apply the media query's answer -\n // on every render, overriding any manual toggle made in between crossings.\n // That is the one thing `collapseBelow` is documented not to do.\n const applyCollapsedRef = useRef(applyCollapsed);\n useEffect(() => {\n applyCollapsedRef.current = applyCollapsed;\n });\n\n // Auto-collapse/expand at a viewport breakpoint. `matchMedia`'s `change`\n // event only fires exactly at the crossing point, not on every resize\n // tick, so a manual toggle in between crossings is left alone until the\n // viewport actually crosses the breakpoint again.\n useEffect(() => {\n // `0` opts out, as documented - and it has to be checked here rather\n // than relying on `(max-width: 0px)` never matching, because the mount\n // pass below would otherwise still run.\n if (!collapseBelow) return;\n if (typeof window === 'undefined' || !window.matchMedia) return;\n\n const query = window.matchMedia(`(max-width: ${collapseBelow}px)`);\n\n // On mount this may only *collapse*, never expand. `defaultCollapsed`\n // (or a controlled `collapsed`) is the consumer's stated starting point,\n // and applying `query.matches` unconditionally threw it away one commit\n // after the first paint: on any viewport wider than the breakpoint the\n // rail visibly started collapsed and then sprang open. Crossings below\n // still drive both directions, which is what \"collapses and re-expands\"\n // refers to.\n if (query.matches) applyCollapsedRef.current(true);\n\n const handleChange = (event: MediaQueryListEvent) => applyCollapsedRef.current(event.matches);\n query.addEventListener('change', handleChange);\n return () => query.removeEventListener('change', handleChange);\n }, [collapseBelow]);\n\n const classes = ['eidos-navigation', collapsed && 'eidos-navigation--collapsed', className]\n .filter(Boolean)\n .join(' ');\n\n // A `logo` brand has no `name` text alongside it (see the discriminated\n // union in Navigation.types.ts), so there's never a second, variable-width\n // sibling competing for space - unlike the `name` variant, it's always\n // safe to just center it outright, in both expanded and collapsed states,\n // with nothing further to compute. See `&__brand--logo-only` in\n // Navigation.scss.\n const brandClasses = [\n 'eidos-navigation__brand',\n brand.logo && 'eidos-navigation__brand--logo-only',\n brand.onClick && 'eidos-navigation__brand--clickable',\n ]\n .filter(Boolean)\n .join(' ');\n\n const brandAccessibleName = brand.logo ? brand.logo.alt : brand.name;\n\n return (\n <nav className={classes} aria-label=\"Main\">\n <div\n className={brandClasses}\n onClick={brand.onClick}\n role={brand.onClick ? 'button' : undefined}\n tabIndex={brand.onClick ? 0 : undefined}\n // Only a real interactive control (role=\"button\") reliably exposes\n // `aria-label` as its accessible name - a plain, non-interactive div\n // doesn't, so the visible (if currently faded) text remains the only\n // way assistive tech gets the brand name in that case.\n aria-label={brand.onClick ? brandAccessibleName : undefined}\n onKeyDown={\n brand.onClick\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n brand.onClick?.();\n }\n }\n : undefined\n }\n >\n {brand.logo ? (\n <NavigationBrandLogo logo={brand.logo} />\n ) : (\n <>\n <Avatar name={brand.name} shape=\"square\" size=\"sm\" />\n {/* Only redundant with the wrapper's own `aria-label` when\n `brand.onClick` is set (see the note on it above) - otherwise\n this is the only accessible text for the brand at all. */}\n <span\n className=\"eidos-navigation__brand-name\"\n aria-hidden={brand.onClick ? true : undefined}\n >\n {brand.name}\n </span>\n </>\n )}\n </div>\n\n <ul className=\"eidos-navigation__items\">\n {items.map((item) => (\n <li key={item.id} className=\"eidos-navigation__item-wrapper\">\n {/* Always wrapped (disabled rather than omitted while expanded)\n so the button underneath is never unmounted/remounted across\n a collapse toggle - that would otherwise reset its own CSS\n transitions (gap, padding, justify-content) partway through\n the rail's width animation, snapping instead of easing. */}\n <Tooltip message={item.label} placement=\"right\" disabled={!collapsed}>\n <button\n type=\"button\"\n className={[\n 'eidos-navigation__item',\n item.active && 'eidos-navigation__item--active',\n ]\n .filter(Boolean)\n .join(' ')}\n disabled={item.disabled}\n onClick={item.onClick}\n aria-current={item.active ? 'page' : undefined}\n // The label fades out visually while collapsed (see\n // `.eidos-navigation__item-label` in Navigation.scss) but\n // isn't removed from the DOM, so it's given directly as the\n // accessible name here instead of relying on the (also\n // fading) visible text, and hidden from assistive tech below\n // to avoid it being announced twice alongside the `Tooltip`.\n aria-label={collapsed ? item.label : undefined}\n >\n {item.icon && renderIcon(item.icon, 'eidos-navigation__item-icon')}\n <span className=\"eidos-navigation__item-label\" aria-hidden={collapsed || undefined}>\n {item.label}\n </span>\n </button>\n </Tooltip>\n </li>\n ))}\n </ul>\n\n {footer && <div className=\"eidos-navigation__footer\">{footer}</div>}\n\n {/* Floats half in/half out of the rail's right edge (see `&__toggle`\n in Navigation.scss) rather than sitting in its own row - a\n dedicated row reserved space in the flex column even when there\n were too few items to need it.\n\n The positioning has to live on this wrapping `<span>`, not on the\n `IconButton` itself: its `tooltip` prop makes `Button` wrap it in\n `Tooltip`'s own `.eidos-tooltip-trigger` div, which - not the\n button - is the actual flex child of `.eidos-navigation`. Removing\n only the inner button from flow left that outer wrapper still\n in-flow, still consuming space and still getting `gap` applied\n around it, which is exactly why a gap remained. */}\n {collapsible && (\n <span className=\"eidos-navigation__toggle\">\n <IconButton\n icon={collapsed ? SquareChevronRight : SquareChevronLeft}\n variant=\"text\"\n color=\"secondary\"\n size=\"sm\"\n tooltip={collapsed ? 'Expand navigation' : 'Collapse navigation'}\n aria-label={collapsed ? 'Expand navigation' : 'Collapse navigation'}\n onClick={toggleCollapsed}\n />\n </span>\n )}\n </nav>\n );\n};\n\nNavigation.displayName = 'Navigation';\n"]}
@@ -1,6 +1,8 @@
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
- var _chunkGEHL4LKKcjs = require('./chunk-GEHL4LKK.cjs');
3
+
4
+
5
+ var _chunkCUJBNRJJcjs = require('./chunk-CUJBNRJJ.cjs');
4
6
 
5
7
  // src/components/Tabs/Tabs.component.tsx
6
8
  var _react = require('react'); var _react2 = _interopRequireDefault(_react);
@@ -45,7 +47,7 @@ var Tab = ({
45
47
  `eidos-tab--${size}`,
46
48
  isActive && "eidos-tab--active",
47
49
  disabled && "eidos-tab--disabled",
48
- fullWidth && "eidos-tab--fullWidth",
50
+ fullWidth && _chunkCUJBNRJJcjs.fullWidthModifier.call(void 0, "eidos-tab"),
49
51
  className
50
52
  ].filter(Boolean).join(" ");
51
53
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
@@ -62,7 +64,7 @@ var Tab = ({
62
64
  onKeyDown: handleKeyDown,
63
65
  type: "button",
64
66
  children: [
65
- icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-icon", children: _chunkGEHL4LKKcjs.renderIcon.call(void 0, icon, "eidos-tab-icon-svg") }),
67
+ icon && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-icon", children: _chunkCUJBNRJJcjs.renderIcon.call(void 0, icon, "eidos-tab-icon-svg") }),
66
68
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "eidos-tab-label", children })
67
69
  ]
68
70
  }
@@ -186,11 +188,11 @@ var Tabs = ({
186
188
  const listClasses = [
187
189
  "eidos-tabs-list",
188
190
  `eidos-tabs-list--${size}`,
189
- fullWidth && "eidos-tabs-list--fullWidth",
191
+ fullWidth && _chunkCUJBNRJJcjs.fullWidthModifier.call(void 0, "eidos-tabs-list"),
190
192
  // With buttons, they are the affordance - a native scrollbar underneath
191
193
  // them is redundant, and on a space-taking one it would also sit over the
192
194
  // `line` variant's rule.
193
- hasScrollButtons && "eidos-tabs-list--hideScrollbar"
195
+ hasScrollButtons && _chunkCUJBNRJJcjs.dualModifier.call(void 0, "eidos-tabs-list", "hide-scrollbar", "hideScrollbar")
194
196
  ].filter(Boolean).join(" ");
195
197
  const showPrevButton = hasScrollButtons && scrollState.canScrollPrev;
196
198
  const showNextButton = hasScrollButtons && scrollState.canScrollNext;
@@ -216,6 +218,7 @@ var Tabs = ({
216
218
  type: "button",
217
219
  className: scrollButtonClasses("prev"),
218
220
  onClick: () => scrollByStep(-1),
221
+ onMouseDown: (event) => event.preventDefault(),
219
222
  tabIndex: -1,
220
223
  "aria-hidden": "true",
221
224
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft, { className: "eidos-tabs-scroll-button-icon" })
@@ -231,6 +234,7 @@ var Tabs = ({
231
234
  type: "button",
232
235
  className: scrollButtonClasses("next"),
233
236
  onClick: () => scrollByStep(1),
237
+ onMouseDown: (event) => event.preventDefault(),
234
238
  tabIndex: -1,
235
239
  "aria-hidden": "true",
236
240
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronRight, { className: "eidos-tabs-scroll-button-icon" })
@@ -247,4 +251,4 @@ Tabs.displayName = "Tabs";
247
251
 
248
252
 
249
253
  exports.Tab = Tab; exports.TabPanel = TabPanel; exports.Tabs = Tabs;
250
- //# sourceMappingURL=chunk-KQD7CQ4Z.cjs.map
254
+ //# sourceMappingURL=chunk-6CSUUQ5M.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-6CSUUQ5M.cjs","../src/components/Tabs/Tabs.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACNA,4EAAgF;AAChF,2CAA0C;AAkEtC,+CAAA;AA1DJ,IAAM,YAAA,EAAc,eAAA,CAAM,aAAA,CAAuC,IAAI,CAAA;AAErE,IAAM,eAAA,EAAiB,CAAA,EAAA,GAAwB;AAC7C,EAAA,MAAM,IAAA,EAAM,+BAAA,WAAsB,CAAA;AAClC,EAAA,GAAA,CAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,yCAAyC,CAAA;AACnE,EAAA,OAAO,GAAA;AACT,CAAA;AAOO,IAAM,IAAA,EAA0B,CAAC;AAAA,EACtC,KAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,EAAW,KAAA;AAAA,EACX,IAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,EAAE,WAAA,EAAa,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,QAAQ,EAAA,EAAI,cAAA,CAAe,CAAA;AAC3E,EAAA,MAAM,SAAA,EAAW,YAAA,IAAgB,KAAA;AAEjC,EAAA,MAAM,cAAA,EAAgB,CAAC,CAAA,EAAA,GAA8C;AACnE,IAAA,MAAM,KAAA,EAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,GAAA,CAAI,CAAC,IAAA,EAAM,MAAA;AAEX,IAAA,MAAM,QAAA,EAAU,KAAA,CAAM,IAAA;AAAA,MACpB,IAAA,CAAK,gBAAA,CAAiB,8BAA8B;AAAA,IACtD,CAAA;AACA,IAAA,MAAM,aAAA,EAAe,OAAA,CAAQ,OAAA,CAAQ,CAAA,CAAE,aAAa,CAAA;AACpD,IAAA,GAAA,CAAI,aAAA,IAAiB,CAAA,CAAA,EAAI,MAAA;AAEzB,IAAA,IAAI,YAAA,EAAc,CAAA,CAAA;AAClB,IAAA,GAAA,CAAI,CAAA,CAAE,IAAA,IAAQ,YAAA,EAAc,YAAA,EAAA,CAAe,aAAA,EAAe,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA;AAAA,IAAA,KAAA,GAAA,CAC9D,CAAA,CAAE,IAAA,IAAQ,WAAA;AACjB,MAAA,YAAA,EAAA,CAAe,aAAA,EAAe,EAAA,EAAI,OAAA,CAAQ,MAAA,EAAA,EAAU,OAAA,CAAQ,MAAA;AAAA,IAAA,KAAA,GAAA,CACrD,CAAA,CAAE,IAAA,IAAQ,MAAA,EAAQ,YAAA,EAAc,CAAA;AAAA,IAAA,KAAA,GAAA,CAChC,CAAA,CAAE,IAAA,IAAQ,KAAA,EAAO,YAAA,EAAc,OAAA,CAAQ,OAAA,EAAS,CAAA;AAEzD,IAAA,GAAA,CAAI,YAAA,IAAgB,CAAA,CAAA,EAAI;AACtB,MAAA,CAAA,CAAE,cAAA,CAAe,CAAA;AACjB,MAAA,OAAA,CAAQ,WAAW,CAAA,CAAE,KAAA,CAAM,CAAA;AAAA,IAC7B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,EAAa;AAAA,IACjB,WAAA;AAAA,IACA,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA;AACN,IAAA;AACA,IAAA;AACC,IAAA;AACb,IAAA;AAGC,EAAA;AAGD,EAAA;AAAC,IAAA;AAAA,IAAA;AACkB,MAAA;AACZ,MAAA;AACU,MAAA;AACA,MAAA;AACL,MAAA;AACV,MAAA;AACW,MAAA;AACK,MAAA;AACL,MAAA;AACN,MAAA;AAEJ,MAAA;AAAQ,QAAA;AACT,wBAAA;AAA4C,MAAA;AAAA,IAAA;AAC9C,EAAA;AAEJ;AAEkB;AAOkC;AAC9B,EAAA;AACH,EAAA;AAEF,EAAA;AAGb,EAAA;AAAC,IAAA;AAAA,IAAA;AACK,MAAA;AACC,MAAA;AACL,MAAA;AACU,MAAA;AACE,MAAA;AAEX,MAAA;AAAA,IAAA;AACH,EAAA;AAEJ;AAEuB;AAMmB;AACxC,EAAA;AACA,EAAA;AACA,EAAA;AACU,EAAA;AACH,EAAA;AACC,EAAA;AACI,EAAA;AACI,EAAA;AACJ,EAAA;AACZ,EAAA;AACI;AACiB,EAAA;AACF,EAAA;AACC,EAAA;AAIuB,EAAA;AACrC,EAAA;AAES,EAAA;AACF,IAAA;AACQ,IAAA;AACA,MAAA;AACF,IAAA;AACD,MAAA;AAChB,IAAA;AACD,EAAA;AAEe,EAAA;AACK,EAAA;AAIf,EAAA;AAEU,EAAA;AACE,IAAA;AACH,IAAA;AACK,IAAA;AACJ,IAAA;AAEI,IAAA;AACF,IAAA;AAIG,IAAA;AACD,MAAA;AAClB,IAAA;AAEgB,IAAA;AACA,IAAA;AAEG,IAAA;AAGF,MAAA;AACC,MAAA;AACF,MAAA;AAChB,IAAA;AACe,EAAA;AAQD,EAAA;AACD,IAAA;AACF,IAAA;AAEO,IAAA;AACF,IAAA;AAEH,IAAA;AACC,IAAA;AAEE,IAAA;AACT,MAAA;AACY,IAAA;AACZ,MAAA;AACP,IAAA;AACc,EAAA;AAKI,EAAA;AACd,EAAA;AAEU,EAAA;AACT,IAAA;AACQ,IAAA;AACF,IAAA;AAEI,IAAA;AACP,MAAA;AAIA,MAAA;AACA,MAAA;AACN,MAAA;AACE,QAAA;AAGF,MAAA;AACF,IAAA;AAEO,IAAA;AACF,IAAA;AAKY,IAAA;AACA,IAAA;AACD,IAAA;AAEH,IAAA;AACN,MAAA;AACI,MAAA;AACX,IAAA;AACE,EAAA;AAEiB,EAAA;AACN,IAAA;AACF,IAAA;AAIO,IAAA;AACZ,IAAA;AACU,IAAA;AAClB,EAAA;AAEkB,EAAA;AACG,IAAA;AACH,MAAA;AAChB,IAAA;AACmB,oBAAA;AACrB,EAAA;AAEqB,EAAA;AAID,EAAA;AAClB,IAAA;AACA,IAAA;AACa,IAAA;AAAmC;AAAA;AAAA;AAIhD,IAAA;AAGC,EAAA;AAMG,EAAA;AACA,EAAA;AAEA,EAAA;AAEF,IAAA;AACA,IAAA;AACA,IAAA;AACQ,EAAA;AAE2B,EAAA;AACrC,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AAGE,EAAA;AAOI,oBAAA;AACG,MAAA;AACE,QAAA;AAAA,QAAA;AACM,UAAA;AACM,UAAA;AACF,UAAA;AAQI,UAAA;AACH,UAAA;AACV,UAAA;AAEA,UAAA;AAAuD,QAAA;AACzD,MAAA;AAGF,sBAAA;AACG,QAAA;AACY,QAAA;AAGf,MAAA;AAEC,MAAA;AACE,QAAA;AAAA,QAAA;AACM,UAAA;AACM,UAAA;AACF,UAAA;AACI,UAAA;AACH,UAAA;AACV,UAAA;AAEA,UAAA;AAAwD,QAAA;AAC1D,MAAA;AAEJ,IAAA;AAEA,oBAAA;AAEJ,EAAA;AAEJ;AAEmB;ADhHI;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-6CSUUQ5M.cjs","sourcesContent":[null,"import React, { useState, useRef, useContext, useEffect, useLayoutEffect } from 'react';\nimport { ChevronLeft, ChevronRight } from 'lucide-react';\nimport { renderIcon, dualModifier, fullWidthModifier } 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 && fullWidthModifier('eidos-tab'),\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 && fullWidthModifier('eidos-tabs-list'),\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 && dualModifier('eidos-tabs-list', 'hide-scrollbar', 'hideScrollbar'),\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"]}
@@ -3,7 +3,7 @@
3
3
  var _chunk3EPND5M2cjs = require('./chunk-3EPND5M2.cjs');
4
4
 
5
5
 
6
- var _chunkDAXZRNNOcjs = require('./chunk-DAXZRNNO.cjs');
6
+ var _chunkD2SKXRKPcjs = require('./chunk-D2SKXRKP.cjs');
7
7
 
8
8
 
9
9
  var _chunkQ3GNKF74cjs = require('./chunk-Q3GNKF74.cjs');
@@ -12,7 +12,7 @@ var _chunkQ3GNKF74cjs = require('./chunk-Q3GNKF74.cjs');
12
12
  var _chunk5O73AALPcjs = require('./chunk-5O73AALP.cjs');
13
13
 
14
14
 
15
- var _chunkAPK5OQRVcjs = require('./chunk-APK5OQRV.cjs');
15
+ var _chunkWWYJNWJYcjs = require('./chunk-WWYJNWJY.cjs');
16
16
 
17
17
  // src/components/Toolbar/Toolbar.component.tsx
18
18
  var _jsxruntime = require('react/jsx-runtime');
@@ -33,8 +33,8 @@ var Toolbar = ({
33
33
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "eidos-toolbar__content", children: [
34
34
  content && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-toolbar__slot", children: content }),
35
35
  cmdPaletteItems && cmdPaletteItems.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk3EPND5M2cjs.CommandPalette, { trigger: true, triggerLabel: "Search", items: cmdPaletteItems }),
36
- actions && actions.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-toolbar__actions", children: actions.map((action, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkAPK5OQRVcjs.IconButton, { variant: "text", size: "sm", ...action }, index)) }),
37
- hasMenu ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDAXZRNNOcjs.Menu, { trigger: avatar, items: userMenu, minWidth: 220 }) : avatar
36
+ actions && actions.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "eidos-toolbar__actions", children: actions.map((action, index) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWWYJNWJYcjs.IconButton, { variant: "text", size: "sm", ...action }, index)) }),
37
+ hasMenu ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkD2SKXRKPcjs.Menu, { trigger: avatar, items: userMenu, minWidth: 220 }) : avatar
38
38
  ] })
39
39
  ] });
40
40
  };
@@ -42,4 +42,4 @@ var Toolbar = ({
42
42
 
43
43
 
44
44
  exports.Toolbar = Toolbar;
45
- //# sourceMappingURL=chunk-GR2PMCVN.cjs.map
45
+ //# sourceMappingURL=chunk-75TDY7XF.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-GR2PMCVN.cjs","../src/components/Toolbar/Toolbar.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACUmC,+CAAA;AAjB5B,IAAM,QAAA,EAAkC,CAAC;AAAA,EAC9C,WAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,QAAA,EAAU,CAAC,eAAA,EAAiB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAOrE,EAAA,MAAM,QAAA,EAAU,SAAA,IAAa,KAAA,EAAA,GAAa,QAAA,CAAS,OAAA,EAAS,CAAA;AAC5D,EAAA,MAAM,OAAA,EAAS,KAAA,GAAQ,QAAA,kBAAU,6BAAA,wBAAC,EAAA,EAAQ,GAAG,IAAA,EAAM,IAAA,EAAK,KAAA,CAAK,EAAA,EAAK,IAAA;AAElE,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,OAAA,EACb,QAAA,EAAA;AAAA,IAAA,YAAA,mBAAe,6BAAA,4BAAC,EAAA,EAAY,GAAG,YAAA,CAAa,CAAA;AAAA,oBAC7C,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,mBAAW,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,QAAA,CAAQ,CAAA;AAAA,MACzD,gBAAA,GAAmB,eAAA,CAAgB,OAAA,EAAS,EAAA,mBAC3C,6BAAA,gCAAC,EAAA,EAAe,OAAA,EAAO,IAAA,EAAC,YAAA,EAAa,QAAA,EAAS,KAAA,EAAO,gBAAA,CAAiB,CAAA;AAAA,MAEvE,QAAA,GAAW,OAAA,CAAQ,OAAA,EAAS,EAAA,mBAC3B,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,EAAA,mBACpB,6BAAA,4BAAC,EAAA,EAAuB,OAAA,EAAQ,MAAA,EAAO,IAAA,EAAK,IAAA,EAAM,GAAG,OAAA,CAAA,EAApC,KAA4C,CAC9D,EAAA,CACH,CAAA;AAAA,MAED,QAAA,kBAAU,6BAAA,sBAAC,EAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,EAAA,EAAK;AAAA,IAAA,EAAA,CACzE;AAAA,EAAA,EAAA,CACF,CAAA;AAEJ,CAAA;ADPA;AACA;AACE;AACF,0BAAC","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-GR2PMCVN.cjs","sourcesContent":[null,"import React from 'react';\nimport type { ToolbarProps } from './Toolbar.types';\nimport './Toolbar.scss';\nimport { IconButton } from '../Button';\nimport { Breadcrumb } from '../Breadcrumb';\nimport { Avatar } from '../Avatar';\nimport { Menu } from '../Menu';\nimport { CommandPalette } from '../CommandPalette';\n\nexport const Toolbar: React.FC<ToolbarProps> = ({\n breadcrumbs,\n actions,\n user,\n userMenu,\n cmdPaletteItems,\n content,\n className = '',\n}) => {\n const classes = ['eidos-toolbar', className].filter(Boolean).join(' ');\n\n // The avatar is the menu's trigger when there are items to open, and a\n // plain mark when there aren't - `Menu` with an empty `items` array would\n // render an interactive, focusable trigger that opens nothing. A menu\n // given without a `user` still needs a trigger, and `Avatar` already\n // falls back to a generic user icon when it has neither `name` nor `src`.\n const hasMenu = userMenu !== undefined && userMenu.length > 0;\n const avatar = user || hasMenu ? <Avatar {...user} size=\"sm\" /> : null;\n\n return (\n <div className={classes}>\n {breadcrumbs && <Breadcrumb {...breadcrumbs} />}\n <div className=\"eidos-toolbar__content\">\n {content && <div className=\"eidos-toolbar__slot\">{content}</div>}\n {cmdPaletteItems && cmdPaletteItems.length > 0 && (\n <CommandPalette trigger triggerLabel=\"Search\" items={cmdPaletteItems} />\n )}\n {actions && actions.length > 0 && (\n <div className=\"eidos-toolbar__actions\">\n {actions.map((action, index) => (\n <IconButton key={index} variant=\"text\" size=\"sm\" {...action} />\n ))}\n </div>\n )}\n {hasMenu ? <Menu trigger={avatar} items={userMenu} minWidth={220} /> : avatar}\n </div>\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["/home/runner/work/eidos-ui/eidos-ui/dist/chunk-75TDY7XF.cjs","../src/components/Toolbar/Toolbar.component.tsx"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACUmC,+CAAA;AAjB5B,IAAM,QAAA,EAAkC,CAAC;AAAA,EAC9C,WAAA;AAAA,EACA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA,EAAY;AACd,CAAA,EAAA,GAAM;AACJ,EAAA,MAAM,QAAA,EAAU,CAAC,eAAA,EAAiB,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAOrE,EAAA,MAAM,QAAA,EAAU,SAAA,IAAa,KAAA,EAAA,GAAa,QAAA,CAAS,OAAA,EAAS,CAAA;AAC5D,EAAA,MAAM,OAAA,EAAS,KAAA,GAAQ,QAAA,kBAAU,6BAAA,wBAAC,EAAA,EAAQ,GAAG,IAAA,EAAM,IAAA,EAAK,KAAA,CAAK,EAAA,EAAK,IAAA;AAElE,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,OAAA,EACb,QAAA,EAAA;AAAA,IAAA,YAAA,mBAAe,6BAAA,4BAAC,EAAA,EAAY,GAAG,YAAA,CAAa,CAAA;AAAA,oBAC7C,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,mBAAW,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,QAAA,CAAQ,CAAA;AAAA,MACzD,gBAAA,GAAmB,eAAA,CAAgB,OAAA,EAAS,EAAA,mBAC3C,6BAAA,gCAAC,EAAA,EAAe,OAAA,EAAO,IAAA,EAAC,YAAA,EAAa,QAAA,EAAS,KAAA,EAAO,gBAAA,CAAiB,CAAA;AAAA,MAEvE,QAAA,GAAW,OAAA,CAAQ,OAAA,EAAS,EAAA,mBAC3B,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,wBAAA,EACZ,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,EAAA,mBACpB,6BAAA,4BAAC,EAAA,EAAuB,OAAA,EAAQ,MAAA,EAAO,IAAA,EAAK,IAAA,EAAM,GAAG,OAAA,CAAA,EAApC,KAA4C,CAC9D,EAAA,CACH,CAAA;AAAA,MAED,QAAA,kBAAU,6BAAA,sBAAC,EAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,QAAA,EAAU,IAAA,CAAK,EAAA,EAAK;AAAA,IAAA,EAAA,CACzE;AAAA,EAAA,EAAA,CACF,CAAA;AAEJ,CAAA;ADPA;AACA;AACE;AACF,0BAAC","file":"/home/runner/work/eidos-ui/eidos-ui/dist/chunk-75TDY7XF.cjs","sourcesContent":[null,"import React from 'react';\nimport type { ToolbarProps } from './Toolbar.types';\nimport './Toolbar.scss';\nimport { IconButton } from '../Button';\nimport { Breadcrumb } from '../Breadcrumb';\nimport { Avatar } from '../Avatar';\nimport { Menu } from '../Menu';\nimport { CommandPalette } from '../CommandPalette';\n\nexport const Toolbar: React.FC<ToolbarProps> = ({\n breadcrumbs,\n actions,\n user,\n userMenu,\n cmdPaletteItems,\n content,\n className = '',\n}) => {\n const classes = ['eidos-toolbar', className].filter(Boolean).join(' ');\n\n // The avatar is the menu's trigger when there are items to open, and a\n // plain mark when there aren't - `Menu` with an empty `items` array would\n // render an interactive, focusable trigger that opens nothing. A menu\n // given without a `user` still needs a trigger, and `Avatar` already\n // falls back to a generic user icon when it has neither `name` nor `src`.\n const hasMenu = userMenu !== undefined && userMenu.length > 0;\n const avatar = user || hasMenu ? <Avatar {...user} size=\"sm\" /> : null;\n\n return (\n <div className={classes}>\n {breadcrumbs && <Breadcrumb {...breadcrumbs} />}\n <div className=\"eidos-toolbar__content\">\n {content && <div className=\"eidos-toolbar__slot\">{content}</div>}\n {cmdPaletteItems && cmdPaletteItems.length > 0 && (\n <CommandPalette trigger triggerLabel=\"Search\" items={cmdPaletteItems} />\n )}\n {actions && actions.length > 0 && (\n <div className=\"eidos-toolbar__actions\">\n {actions.map((action, index) => (\n <IconButton key={index} variant=\"text\" size=\"sm\" {...action} />\n ))}\n </div>\n )}\n {hasMenu ? <Menu trigger={avatar} items={userMenu} minWidth={220} /> : avatar}\n </div>\n </div>\n );\n};\n"]}
@@ -1,4 +1,8 @@
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; }// src/components/Dropdown/Dropdown.context.types.ts
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
+
3
+ var _chunkCUJBNRJJcjs = require('./chunk-CUJBNRJJ.cjs');
4
+
5
+ // src/components/Dropdown/Dropdown.context.types.ts
2
6
  var _react = require('react');
3
7
  var DropdownContext = _react.createContext.call(void 0, { level: 0 });
4
8
 
@@ -356,7 +360,7 @@ var DropdownInternal = ({
356
360
  {
357
361
  ref: triggerRef,
358
362
  onClick: handleTriggerClick,
359
- className: `eidos-dropdown-trigger ${fullWidth ? "eidos-dropdown-trigger--fullWidth" : ""} ${triggerClassName}`,
363
+ className: `eidos-dropdown-trigger ${fullWidth ? _chunkCUJBNRJJcjs.fullWidthModifier.call(void 0, "eidos-dropdown-trigger") : ""} ${triggerClassName}`,
360
364
  role: "button",
361
365
  tabIndex: -1,
362
366
  children: trigger
@@ -398,4 +402,4 @@ Dropdown.displayName = "Dropdown";
398
402
 
399
403
 
400
404
  exports.DropdownProvider = DropdownProvider; exports.useDropdownContext = useDropdownContext; exports.Dropdown = Dropdown;
401
- //# sourceMappingURL=chunk-FRUOA2QU.cjs.map
405
+ //# sourceMappingURL=chunk-75VXB3H2.cjs.map