silver-ui 0.8.0 → 0.8.1

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 (302) hide show
  1. package/dist/{chunk-4GT65SRC.cjs → chunk-263EUXFI.cjs} +9 -9
  2. package/dist/{chunk-4GT65SRC.cjs.map → chunk-263EUXFI.cjs.map} +1 -1
  3. package/dist/{chunk-PZBY3JI7.js → chunk-2EGYYWPB.js} +3 -3
  4. package/dist/{chunk-PZBY3JI7.js.map → chunk-2EGYYWPB.js.map} +1 -1
  5. package/dist/{chunk-2FR4VA32.js → chunk-3CV6IEEY.js} +16 -16
  6. package/dist/{chunk-2FR4VA32.js.map → chunk-3CV6IEEY.js.map} +1 -1
  7. package/dist/{chunk-MNQFCWT7.js → chunk-3TPFJ7NS.js} +7 -7
  8. package/dist/{chunk-MNQFCWT7.js.map → chunk-3TPFJ7NS.js.map} +1 -1
  9. package/dist/{chunk-KPAOAYDY.js → chunk-4G644ETX.js} +13 -13
  10. package/dist/{chunk-KPAOAYDY.js.map → chunk-4G644ETX.js.map} +1 -1
  11. package/dist/{chunk-RZ52RCTU.js → chunk-4MIAF6ZO.js} +4 -4
  12. package/dist/{chunk-RZ52RCTU.js.map → chunk-4MIAF6ZO.js.map} +1 -1
  13. package/dist/{chunk-HIFJC2HY.cjs → chunk-4VYOE2HE.cjs} +6 -6
  14. package/dist/{chunk-HIFJC2HY.cjs.map → chunk-4VYOE2HE.cjs.map} +1 -1
  15. package/dist/{chunk-GKYJZNJQ.cjs → chunk-4XFA2XAB.cjs} +40 -40
  16. package/dist/{chunk-GKYJZNJQ.cjs.map → chunk-4XFA2XAB.cjs.map} +1 -1
  17. package/dist/{chunk-J6XNDFK7.cjs → chunk-4ZJ3P6IF.cjs} +14 -14
  18. package/dist/{chunk-J6XNDFK7.cjs.map → chunk-4ZJ3P6IF.cjs.map} +1 -1
  19. package/dist/{chunk-A377P2JF.js → chunk-5DK3LMS7.js} +4 -4
  20. package/dist/{chunk-A377P2JF.js.map → chunk-5DK3LMS7.js.map} +1 -1
  21. package/dist/{chunk-ZEBWF24G.js → chunk-5EDJRYE4.js} +12 -12
  22. package/dist/{chunk-ZEBWF24G.js.map → chunk-5EDJRYE4.js.map} +1 -1
  23. package/dist/{chunk-K2KOXVGA.cjs → chunk-5KFM5ZNO.cjs} +9 -9
  24. package/dist/{chunk-K2KOXVGA.cjs.map → chunk-5KFM5ZNO.cjs.map} +1 -1
  25. package/dist/{chunk-7275FFQA.cjs → chunk-5P5OSQT2.cjs} +10 -10
  26. package/dist/{chunk-7275FFQA.cjs.map → chunk-5P5OSQT2.cjs.map} +1 -1
  27. package/dist/{chunk-SXLGTRY7.js → chunk-5SCHQS3L.js} +6 -6
  28. package/dist/{chunk-SXLGTRY7.js.map → chunk-5SCHQS3L.js.map} +1 -1
  29. package/dist/{chunk-B333LIQQ.cjs → chunk-6I7MYAPX.cjs} +6 -6
  30. package/dist/{chunk-B333LIQQ.cjs.map → chunk-6I7MYAPX.cjs.map} +1 -1
  31. package/dist/{chunk-7IBLSZ7G.cjs → chunk-7TLGH4VK.cjs} +43 -43
  32. package/dist/{chunk-7IBLSZ7G.cjs.map → chunk-7TLGH4VK.cjs.map} +1 -1
  33. package/dist/{chunk-YKUNVCXP.js → chunk-AJAHLIHQ.js} +3 -3
  34. package/dist/{chunk-YKUNVCXP.js.map → chunk-AJAHLIHQ.js.map} +1 -1
  35. package/dist/{chunk-SQUWNP5G.cjs → chunk-B5HYXBPH.cjs} +13 -13
  36. package/dist/{chunk-SQUWNP5G.cjs.map → chunk-B5HYXBPH.cjs.map} +1 -1
  37. package/dist/{chunk-VISYC2ZD.cjs → chunk-BJSF4VYC.cjs} +35 -35
  38. package/dist/{chunk-VISYC2ZD.cjs.map → chunk-BJSF4VYC.cjs.map} +1 -1
  39. package/dist/{chunk-PER4RJRF.js → chunk-BKZFINUO.js} +4 -4
  40. package/dist/{chunk-PER4RJRF.js.map → chunk-BKZFINUO.js.map} +1 -1
  41. package/dist/{chunk-NQD46M2L.cjs → chunk-BLKZDVFG.cjs} +11 -11
  42. package/dist/{chunk-NQD46M2L.cjs.map → chunk-BLKZDVFG.cjs.map} +1 -1
  43. package/dist/{chunk-6WMG7TU2.cjs → chunk-BQMIYEFC.cjs} +11 -11
  44. package/dist/{chunk-6WMG7TU2.cjs.map → chunk-BQMIYEFC.cjs.map} +1 -1
  45. package/dist/{chunk-JLDYPQIB.cjs → chunk-CDN7FN6R.cjs} +7 -7
  46. package/dist/{chunk-JLDYPQIB.cjs.map → chunk-CDN7FN6R.cjs.map} +1 -1
  47. package/dist/{chunk-5HMAMGEL.cjs → chunk-CKERNLXH.cjs} +5 -5
  48. package/dist/{chunk-5HMAMGEL.cjs.map → chunk-CKERNLXH.cjs.map} +1 -1
  49. package/dist/{chunk-5OHIMYY7.cjs → chunk-DDKW5FTM.cjs} +5 -5
  50. package/dist/{chunk-5OHIMYY7.cjs.map → chunk-DDKW5FTM.cjs.map} +1 -1
  51. package/dist/{chunk-57GO7S77.js → chunk-DRWW5XMD.js} +3 -3
  52. package/dist/{chunk-57GO7S77.js.map → chunk-DRWW5XMD.js.map} +1 -1
  53. package/dist/{chunk-DZYO3YLL.js → chunk-E65S6HVS.js} +3 -3
  54. package/dist/{chunk-DZYO3YLL.js.map → chunk-E65S6HVS.js.map} +1 -1
  55. package/dist/{chunk-35MIAFP2.js → chunk-EEB56QQX.js} +3 -3
  56. package/dist/{chunk-35MIAFP2.js.map → chunk-EEB56QQX.js.map} +1 -1
  57. package/dist/{chunk-OQL6XRT7.js → chunk-EZ2LRC7U.js} +4 -4
  58. package/dist/{chunk-OQL6XRT7.js.map → chunk-EZ2LRC7U.js.map} +1 -1
  59. package/dist/{chunk-I2X76NIY.js → chunk-F2ZT6DCV.js} +3 -3
  60. package/dist/{chunk-I2X76NIY.js.map → chunk-F2ZT6DCV.js.map} +1 -1
  61. package/dist/{chunk-SG2ZHIDQ.cjs → chunk-FCFVJGWR.cjs} +6 -6
  62. package/dist/{chunk-SG2ZHIDQ.cjs.map → chunk-FCFVJGWR.cjs.map} +1 -1
  63. package/dist/{chunk-N26PQY3D.js → chunk-FHLK5CTO.js} +5 -5
  64. package/dist/{chunk-N26PQY3D.js.map → chunk-FHLK5CTO.js.map} +1 -1
  65. package/dist/{chunk-XOJ5HGIP.cjs → chunk-FKZATUBG.cjs} +6 -6
  66. package/dist/{chunk-XOJ5HGIP.cjs.map → chunk-FKZATUBG.cjs.map} +1 -1
  67. package/dist/{chunk-M7ADKAJB.cjs → chunk-FNBOLEST.cjs} +7 -7
  68. package/dist/{chunk-M7ADKAJB.cjs.map → chunk-FNBOLEST.cjs.map} +1 -1
  69. package/dist/{chunk-ENBVF5OB.js → chunk-FQJBEWGB.js} +5 -5
  70. package/dist/{chunk-ENBVF5OB.js.map → chunk-FQJBEWGB.js.map} +1 -1
  71. package/dist/{chunk-USZQJXPE.js → chunk-GCQTQJPW.js} +6 -6
  72. package/dist/{chunk-USZQJXPE.js.map → chunk-GCQTQJPW.js.map} +1 -1
  73. package/dist/{chunk-74B6CLZK.js → chunk-GEU4SROO.js} +4 -4
  74. package/dist/{chunk-74B6CLZK.js.map → chunk-GEU4SROO.js.map} +1 -1
  75. package/dist/{chunk-KNXDDKGK.cjs → chunk-GIZ7DK3W.cjs} +9 -9
  76. package/dist/{chunk-KNXDDKGK.cjs.map → chunk-GIZ7DK3W.cjs.map} +1 -1
  77. package/dist/{chunk-K57TGBAB.js → chunk-H5BUXKYQ.js} +7 -7
  78. package/dist/{chunk-K57TGBAB.js.map → chunk-H5BUXKYQ.js.map} +1 -1
  79. package/dist/{chunk-PB7LE5VJ.cjs → chunk-H5Q63Z42.cjs} +9 -9
  80. package/dist/{chunk-PB7LE5VJ.cjs.map → chunk-H5Q63Z42.cjs.map} +1 -1
  81. package/dist/{chunk-GIGV6XFT.cjs → chunk-HTY7SADT.cjs} +5 -5
  82. package/dist/{chunk-GIGV6XFT.cjs.map → chunk-HTY7SADT.cjs.map} +1 -1
  83. package/dist/{chunk-S5FJ3FHH.cjs → chunk-HW7GODZJ.cjs} +5 -5
  84. package/dist/{chunk-S5FJ3FHH.cjs.map → chunk-HW7GODZJ.cjs.map} +1 -1
  85. package/dist/{chunk-EPQKIFGY.cjs → chunk-I2QAN2HX.cjs} +13 -13
  86. package/dist/{chunk-EPQKIFGY.cjs.map → chunk-I2QAN2HX.cjs.map} +1 -1
  87. package/dist/{chunk-IVDCRMY3.cjs → chunk-IHR3KEWH.cjs} +11 -11
  88. package/dist/{chunk-IVDCRMY3.cjs.map → chunk-IHR3KEWH.cjs.map} +1 -1
  89. package/dist/{chunk-JJ32AVLU.js → chunk-J2TQNGUM.js} +3 -3
  90. package/dist/{chunk-JJ32AVLU.js.map → chunk-J2TQNGUM.js.map} +1 -1
  91. package/dist/{chunk-YSLDYF2F.cjs → chunk-J5VWFOOY.cjs} +4 -4
  92. package/dist/{chunk-YSLDYF2F.cjs.map → chunk-J5VWFOOY.cjs.map} +1 -1
  93. package/dist/{chunk-WQU2M64E.js → chunk-JCXI44K2.js} +6 -6
  94. package/dist/{chunk-WQU2M64E.js.map → chunk-JCXI44K2.js.map} +1 -1
  95. package/dist/{chunk-ZF522WPX.js → chunk-JFFAICCY.js} +6 -6
  96. package/dist/{chunk-ZF522WPX.js.map → chunk-JFFAICCY.js.map} +1 -1
  97. package/dist/{chunk-GIOMLAL2.cjs → chunk-KZOUXGPD.cjs} +4 -4
  98. package/dist/{chunk-GIOMLAL2.cjs.map → chunk-KZOUXGPD.cjs.map} +1 -1
  99. package/dist/{chunk-ZKSEIA5Q.cjs → chunk-LDKE723G.cjs} +6 -6
  100. package/dist/{chunk-ZKSEIA5Q.cjs.map → chunk-LDKE723G.cjs.map} +1 -1
  101. package/dist/{chunk-42KJXH3P.js → chunk-M5SZUUWM.js} +5 -5
  102. package/dist/{chunk-42KJXH3P.js.map → chunk-M5SZUUWM.js.map} +1 -1
  103. package/dist/{chunk-Q4UMGL6Z.js → chunk-MVDTWARG.js} +5 -5
  104. package/dist/{chunk-Q4UMGL6Z.js.map → chunk-MVDTWARG.js.map} +1 -1
  105. package/dist/{chunk-FE3ZOSFJ.cjs → chunk-MWETV5LK.cjs} +6 -6
  106. package/dist/{chunk-FE3ZOSFJ.cjs.map → chunk-MWETV5LK.cjs.map} +1 -1
  107. package/dist/{chunk-6VY3VM5W.cjs → chunk-MWWAQVJ3.cjs} +4 -4
  108. package/dist/{chunk-6VY3VM5W.cjs.map → chunk-MWWAQVJ3.cjs.map} +1 -1
  109. package/dist/{chunk-UUNVNLQN.js → chunk-MYBFODRI.js} +7 -7
  110. package/dist/{chunk-UUNVNLQN.js.map → chunk-MYBFODRI.js.map} +1 -1
  111. package/dist/{chunk-M3DVXO4U.cjs → chunk-NHM6CSX2.cjs} +6 -6
  112. package/dist/{chunk-M3DVXO4U.cjs.map → chunk-NHM6CSX2.cjs.map} +1 -1
  113. package/dist/{chunk-IA4TPVHR.cjs → chunk-NJR5SVHL.cjs} +14 -14
  114. package/dist/{chunk-IA4TPVHR.cjs.map → chunk-NJR5SVHL.cjs.map} +1 -1
  115. package/dist/{chunk-J52N3BTJ.js → chunk-NP527IVS.js} +7 -7
  116. package/dist/{chunk-J52N3BTJ.js.map → chunk-NP527IVS.js.map} +1 -1
  117. package/dist/{chunk-MCVMBH7P.cjs → chunk-OAEVUPAL.cjs} +8 -8
  118. package/dist/{chunk-MCVMBH7P.cjs.map → chunk-OAEVUPAL.cjs.map} +1 -1
  119. package/dist/{chunk-JQHJJAX3.js → chunk-OSYOGJC5.js} +4 -4
  120. package/dist/{chunk-JQHJJAX3.js.map → chunk-OSYOGJC5.js.map} +1 -1
  121. package/dist/{chunk-PLQDNBCW.js → chunk-OYBRYZKK.js} +6 -6
  122. package/dist/{chunk-PLQDNBCW.js.map → chunk-OYBRYZKK.js.map} +1 -1
  123. package/dist/{chunk-G2RX3FZ7.cjs → chunk-OZNCX6DY.cjs} +12 -12
  124. package/dist/{chunk-G2RX3FZ7.cjs.map → chunk-OZNCX6DY.cjs.map} +1 -1
  125. package/dist/{chunk-DXUFYSNR.js → chunk-P6LEAMPW.js} +4 -4
  126. package/dist/{chunk-DXUFYSNR.js.map → chunk-P6LEAMPW.js.map} +1 -1
  127. package/dist/{chunk-R3B46QJO.js → chunk-PYUPT3HU.js} +3 -3
  128. package/dist/{chunk-R3B46QJO.js.map → chunk-PYUPT3HU.js.map} +1 -1
  129. package/dist/{chunk-WZGS7FX6.js → chunk-Q5DVIVMR.js} +3 -3
  130. package/dist/{chunk-WZGS7FX6.js.map → chunk-Q5DVIVMR.js.map} +1 -1
  131. package/dist/{chunk-IJWWTBJ6.js → chunk-QMZQ4I72.js} +3 -3
  132. package/dist/{chunk-IJWWTBJ6.js.map → chunk-QMZQ4I72.js.map} +1 -1
  133. package/dist/{chunk-VCEPRU6Y.cjs → chunk-QOQ55IUO.cjs} +8 -8
  134. package/dist/{chunk-VCEPRU6Y.cjs.map → chunk-QOQ55IUO.cjs.map} +1 -1
  135. package/dist/{chunk-MQUO663S.js → chunk-R3ONJZXN.js} +5 -5
  136. package/dist/{chunk-MQUO663S.js.map → chunk-R3ONJZXN.js.map} +1 -1
  137. package/dist/{chunk-KJRFBFBP.js → chunk-RKPEY2LR.js} +4 -4
  138. package/dist/{chunk-KJRFBFBP.js.map → chunk-RKPEY2LR.js.map} +1 -1
  139. package/dist/{chunk-7SGBGPZW.js → chunk-RM2XLAAU.js} +3 -3
  140. package/dist/{chunk-7SGBGPZW.js.map → chunk-RM2XLAAU.js.map} +1 -1
  141. package/dist/{chunk-LT7DJ7FN.cjs → chunk-RNKQPVCB.cjs} +13 -13
  142. package/dist/{chunk-LT7DJ7FN.cjs.map → chunk-RNKQPVCB.cjs.map} +1 -1
  143. package/dist/{chunk-3MNRY6XK.js → chunk-RQUQSI67.js} +3 -3
  144. package/dist/{chunk-3MNRY6XK.js.map → chunk-RQUQSI67.js.map} +1 -1
  145. package/dist/{chunk-S3UQUP3Q.js → chunk-RRN6FK6U.js} +4 -4
  146. package/dist/{chunk-S3UQUP3Q.js.map → chunk-RRN6FK6U.js.map} +1 -1
  147. package/dist/{chunk-BSOYEVZW.cjs → chunk-RUPT4QAW.cjs} +5 -5
  148. package/dist/{chunk-BSOYEVZW.cjs.map → chunk-RUPT4QAW.cjs.map} +1 -1
  149. package/dist/{chunk-7SUCVCOC.cjs → chunk-RYVQVW2U.cjs} +5 -5
  150. package/dist/{chunk-7SUCVCOC.cjs.map → chunk-RYVQVW2U.cjs.map} +1 -1
  151. package/dist/{chunk-2I6BJICE.js → chunk-RZBOQQRG.js} +6 -6
  152. package/dist/{chunk-2I6BJICE.js.map → chunk-RZBOQQRG.js.map} +1 -1
  153. package/dist/{chunk-JASZ7XTT.js → chunk-RZPKI7FD.js} +5 -5
  154. package/dist/{chunk-JASZ7XTT.js.map → chunk-RZPKI7FD.js.map} +1 -1
  155. package/dist/{chunk-VSTO7LZJ.cjs → chunk-T6E5MIIO.cjs} +4 -4
  156. package/dist/{chunk-VSTO7LZJ.cjs.map → chunk-T6E5MIIO.cjs.map} +1 -1
  157. package/dist/{chunk-D2JOFRA3.cjs → chunk-TFPTFBHN.cjs} +4 -4
  158. package/dist/{chunk-D2JOFRA3.cjs.map → chunk-TFPTFBHN.cjs.map} +1 -1
  159. package/dist/{chunk-446LQC5C.js → chunk-TRDO4OBD.js} +3 -3
  160. package/dist/{chunk-446LQC5C.js.map → chunk-TRDO4OBD.js.map} +1 -1
  161. package/dist/{chunk-3PHJWXBO.cjs → chunk-TRQQZ3FY.cjs} +7 -7
  162. package/dist/{chunk-3PHJWXBO.cjs.map → chunk-TRQQZ3FY.cjs.map} +1 -1
  163. package/dist/{chunk-NKQAHJBB.cjs → chunk-TX4BD3JN.cjs} +16 -16
  164. package/dist/{chunk-NKQAHJBB.cjs.map → chunk-TX4BD3JN.cjs.map} +1 -1
  165. package/dist/{chunk-UTUX5WM7.cjs → chunk-U7NJKBAR.cjs} +11 -11
  166. package/dist/{chunk-UTUX5WM7.cjs.map → chunk-U7NJKBAR.cjs.map} +1 -1
  167. package/dist/{chunk-5PW34XKA.js → chunk-UCMIHJFE.js} +3 -3
  168. package/dist/{chunk-5PW34XKA.js.map → chunk-UCMIHJFE.js.map} +1 -1
  169. package/dist/{chunk-KGVNCMUT.cjs → chunk-UGK3AL6Z.cjs} +5 -5
  170. package/dist/{chunk-KGVNCMUT.cjs.map → chunk-UGK3AL6Z.cjs.map} +1 -1
  171. package/dist/{chunk-QTR5LIUW.cjs → chunk-UJS33XO7.cjs} +8 -8
  172. package/dist/{chunk-QTR5LIUW.cjs.map → chunk-UJS33XO7.cjs.map} +1 -1
  173. package/dist/{chunk-QEYGPANV.cjs → chunk-VOYIMBTO.cjs} +8 -8
  174. package/dist/{chunk-QEYGPANV.cjs.map → chunk-VOYIMBTO.cjs.map} +1 -1
  175. package/dist/{chunk-HRXPB4YH.js → chunk-VRXTRDIP.js} +5 -5
  176. package/dist/{chunk-HRXPB4YH.js.map → chunk-VRXTRDIP.js.map} +1 -1
  177. package/dist/{chunk-WPP3FZLW.cjs → chunk-WHQNYDUT.cjs} +8 -8
  178. package/dist/{chunk-WPP3FZLW.cjs.map → chunk-WHQNYDUT.cjs.map} +1 -1
  179. package/dist/{chunk-YV4AL52O.cjs → chunk-WW6XXMJL.cjs} +17 -17
  180. package/dist/{chunk-YV4AL52O.cjs.map → chunk-WW6XXMJL.cjs.map} +1 -1
  181. package/dist/{chunk-CWDZJH7A.js → chunk-X6QULLGW.js} +3 -3
  182. package/dist/{chunk-CWDZJH7A.js.map → chunk-X6QULLGW.js.map} +1 -1
  183. package/dist/{chunk-KGLCG2W5.cjs → chunk-XB6G4W4P.cjs} +5 -5
  184. package/dist/{chunk-KGLCG2W5.cjs.map → chunk-XB6G4W4P.cjs.map} +1 -1
  185. package/dist/{chunk-ORBYW3LT.js → chunk-XQIPFZUD.js} +7 -7
  186. package/dist/{chunk-ORBYW3LT.js.map → chunk-XQIPFZUD.js.map} +1 -1
  187. package/dist/{chunk-SEELGNIC.cjs → chunk-XTWTL3UB.cjs} +9 -9
  188. package/dist/{chunk-SEELGNIC.cjs.map → chunk-XTWTL3UB.cjs.map} +1 -1
  189. package/dist/{chunk-FP6EP2CX.js → chunk-XVJLFQJT.js} +3 -3
  190. package/dist/{chunk-FP6EP2CX.js.map → chunk-XVJLFQJT.js.map} +1 -1
  191. package/dist/{chunk-CTXAQNQI.js → chunk-YBMIXGFM.js} +3 -3
  192. package/dist/{chunk-CTXAQNQI.js.map → chunk-YBMIXGFM.js.map} +1 -1
  193. package/dist/{chunk-TUUYGOLQ.js → chunk-YK5BUUZG.js} +4 -4
  194. package/dist/{chunk-TUUYGOLQ.js.map → chunk-YK5BUUZG.js.map} +1 -1
  195. package/dist/{chunk-KSDY2S25.js → chunk-YKLFVO22.js} +4 -4
  196. package/dist/{chunk-KSDY2S25.js.map → chunk-YKLFVO22.js.map} +1 -1
  197. package/dist/{chunk-FL53ZLSY.js → chunk-YUKH75MR.js} +10 -10
  198. package/dist/{chunk-FL53ZLSY.js.map → chunk-YUKH75MR.js.map} +1 -1
  199. package/dist/{chunk-BMJ4AK5X.cjs → chunk-ZQWT5UEN.cjs} +17 -17
  200. package/dist/{chunk-BMJ4AK5X.cjs.map → chunk-ZQWT5UEN.cjs.map} +1 -1
  201. package/dist/components/Alert/index.cjs +5 -5
  202. package/dist/components/Alert/index.js +4 -4
  203. package/dist/components/AlertDialog/index.cjs +7 -7
  204. package/dist/components/AlertDialog/index.js +5 -5
  205. package/dist/components/AppShell/index.cjs +12 -12
  206. package/dist/components/AppShell/index.js +9 -9
  207. package/dist/components/AutocompleteInput/index.cjs +10 -10
  208. package/dist/components/AutocompleteInput/index.js +6 -6
  209. package/dist/components/Button/index.cjs +4 -4
  210. package/dist/components/Button/index.js +3 -3
  211. package/dist/components/Calendar/index.cjs +5 -5
  212. package/dist/components/Calendar/index.js +4 -4
  213. package/dist/components/CheckboxGroup/index.cjs +8 -8
  214. package/dist/components/CheckboxGroup/index.js +6 -6
  215. package/dist/components/CheckboxInput/index.cjs +5 -5
  216. package/dist/components/CheckboxInput/index.js +4 -4
  217. package/dist/components/CodeBlock/index.cjs +5 -5
  218. package/dist/components/CodeBlock/index.js +4 -4
  219. package/dist/components/ContextMenu/index.cjs +9 -9
  220. package/dist/components/ContextMenu/index.js +7 -7
  221. package/dist/components/DateInput/index.cjs +8 -8
  222. package/dist/components/DateInput/index.js +7 -7
  223. package/dist/components/DateRangeInput/index.cjs +8 -8
  224. package/dist/components/DateRangeInput/index.js +7 -7
  225. package/dist/components/DateTimeInput/index.cjs +10 -10
  226. package/dist/components/DateTimeInput/index.js +9 -9
  227. package/dist/components/DropdownMenu/index.cjs +10 -10
  228. package/dist/components/DropdownMenu/index.js +6 -6
  229. package/dist/components/EmptyState/index.cjs +3 -3
  230. package/dist/components/EmptyState/index.js +2 -2
  231. package/dist/components/Field/index.cjs +4 -4
  232. package/dist/components/Field/index.js +2 -2
  233. package/dist/components/FileInput/index.cjs +6 -6
  234. package/dist/components/FileInput/index.js +5 -5
  235. package/dist/components/InputGroup/index.cjs +7 -7
  236. package/dist/components/InputGroup/index.js +3 -3
  237. package/dist/components/Item/index.cjs +3 -3
  238. package/dist/components/Item/index.js +2 -2
  239. package/dist/components/Layout/index.cjs +9 -9
  240. package/dist/components/Layout/index.js +4 -4
  241. package/dist/components/Lightbox/index.cjs +6 -6
  242. package/dist/components/Lightbox/index.js +4 -4
  243. package/dist/components/List/index.cjs +5 -5
  244. package/dist/components/List/index.js +3 -3
  245. package/dist/components/MetadataList/index.cjs +4 -4
  246. package/dist/components/MetadataList/index.js +2 -2
  247. package/dist/components/MultiSelect/index.cjs +7 -7
  248. package/dist/components/MultiSelect/index.js +6 -6
  249. package/dist/components/NumberInput/index.cjs +7 -7
  250. package/dist/components/NumberInput/index.js +6 -6
  251. package/dist/components/Pagination/index.cjs +5 -5
  252. package/dist/components/Pagination/index.js +4 -4
  253. package/dist/components/PasswordInput/index.cjs +8 -8
  254. package/dist/components/PasswordInput/index.js +7 -7
  255. package/dist/components/Popover/index.cjs +6 -6
  256. package/dist/components/Popover/index.js +4 -4
  257. package/dist/components/RadioGroup/index.cjs +6 -6
  258. package/dist/components/RadioGroup/index.js +4 -4
  259. package/dist/components/Schedule/index.cjs +25 -25
  260. package/dist/components/Schedule/index.js +10 -10
  261. package/dist/components/SearchFilterInput/index.cjs +24 -24
  262. package/dist/components/SearchFilterInput/index.js +16 -16
  263. package/dist/components/Select/index.cjs +9 -9
  264. package/dist/components/Select/index.js +7 -7
  265. package/dist/components/SideNav/index.cjs +12 -12
  266. package/dist/components/SideNav/index.js +6 -6
  267. package/dist/components/Slider/index.cjs +4 -4
  268. package/dist/components/Slider/index.js +3 -3
  269. package/dist/components/Spinner/index.cjs +3 -3
  270. package/dist/components/Spinner/index.js +2 -2
  271. package/dist/components/SplitButton/index.cjs +8 -8
  272. package/dist/components/SplitButton/index.js +7 -7
  273. package/dist/components/Stepper/index.cjs +3 -3
  274. package/dist/components/Stepper/index.js +2 -2
  275. package/dist/components/Switch/index.cjs +4 -4
  276. package/dist/components/Switch/index.js +3 -3
  277. package/dist/components/Table/index.cjs +46 -46
  278. package/dist/components/Table/index.js +20 -20
  279. package/dist/components/Tabs/index.cjs +10 -10
  280. package/dist/components/Tabs/index.js +5 -5
  281. package/dist/components/TagsInput/index.cjs +8 -8
  282. package/dist/components/TagsInput/index.js +7 -7
  283. package/dist/components/Text/index.cjs +3 -3
  284. package/dist/components/Text/index.js +1 -1
  285. package/dist/components/TextArea/index.cjs +5 -5
  286. package/dist/components/TextArea/index.js +4 -4
  287. package/dist/components/TextInput/index.cjs +7 -7
  288. package/dist/components/TextInput/index.js +6 -6
  289. package/dist/components/Thumbnail/index.cjs +5 -5
  290. package/dist/components/Thumbnail/index.js +4 -4
  291. package/dist/components/TimeInput/index.cjs +6 -6
  292. package/dist/components/TimeInput/index.js +5 -5
  293. package/dist/components/Toast/index.cjs +7 -7
  294. package/dist/components/Toast/index.js +4 -4
  295. package/dist/components/ToggleButton/index.cjs +5 -5
  296. package/dist/components/ToggleButton/index.js +3 -3
  297. package/dist/components/TopNav/index.cjs +10 -10
  298. package/dist/components/TopNav/index.js +5 -5
  299. package/dist/index.cjs +187 -187
  300. package/dist/index.js +50 -50
  301. package/dist/styles.css +1 -1
  302. package/package.json +1 -1
@@ -2,10 +2,10 @@
2
2
  'use strict';
3
3
 
4
4
  var chunkVPHB56GK_cjs = require('./chunk-VPHB56GK.cjs');
5
- var chunkHIFJC2HY_cjs = require('./chunk-HIFJC2HY.cjs');
5
+ var chunk4VYOE2HE_cjs = require('./chunk-4VYOE2HE.cjs');
6
6
  var chunkXPHXAZCE_cjs = require('./chunk-XPHXAZCE.cjs');
7
- var chunk6VY3VM5W_cjs = require('./chunk-6VY3VM5W.cjs');
8
- var chunkEPQKIFGY_cjs = require('./chunk-EPQKIFGY.cjs');
7
+ var chunkMWWAQVJ3_cjs = require('./chunk-MWWAQVJ3.cjs');
8
+ var chunkI2QAN2HX_cjs = require('./chunk-I2QAN2HX.cjs');
9
9
  var chunkQAO6QMNQ_cjs = require('./chunk-QAO6QMNQ.cjs');
10
10
  var chunkJ4PIYOWT_cjs = require('./chunk-J4PIYOWT.cjs');
11
11
  var chunkRU6JG3FS_cjs = require('./chunk-RU6JG3FS.cjs');
@@ -65,9 +65,9 @@ function TextArea({
65
65
  const counterID = maxLength != null ? `${inputId}-counter` : void 0;
66
66
  const describedBy = chunkXPHXAZCE_cjs.getDescribedBy(descriptionID, statusMessageID, counterID);
67
67
  const isOverLimit = maxLength != null && value.length > maxLength;
68
- const necessity = chunkHIFJC2HY_cjs.getNecessity(isOptional, isRequired);
68
+ const necessity = chunk4VYOE2HE_cjs.getNecessity(isOptional, isRequired);
69
69
  return /* @__PURE__ */ jsxRuntime.jsxs(
70
- chunkHIFJC2HY_cjs.Field,
70
+ chunk4VYOE2HE_cjs.Field,
71
71
  {
72
72
  className,
73
73
  description,
@@ -121,13 +121,13 @@ function TextArea({
121
121
  value
122
122
  }
123
123
  ),
124
- isLoading ? /* @__PURE__ */ jsxRuntime.jsx(chunk6VY3VM5W_cjs.Spinner, { size: "sm" }) : null,
124
+ isLoading ? /* @__PURE__ */ jsxRuntime.jsx(chunkMWWAQVJ3_cjs.Spinner, { size: "sm" }) : null,
125
125
  status != null ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkVPHB56GK_cjs.inputStyles.iconSlot, children: chunkXPHXAZCE_cjs.getStatusIcon(status.type) }) : null
126
126
  ]
127
127
  }
128
128
  ),
129
129
  maxLength != null ? /* @__PURE__ */ jsxRuntime.jsxs(
130
- chunkEPQKIFGY_cjs.Text,
130
+ chunkI2QAN2HX_cjs.Text,
131
131
  {
132
132
  as: "span",
133
133
  className: chunkSPDVNY2Z_cjs.cx(
@@ -151,5 +151,5 @@ function TextArea({
151
151
  TextArea.displayName = "TextArea";
152
152
 
153
153
  exports.TextArea = TextArea;
154
- //# sourceMappingURL=chunk-K2KOXVGA.cjs.map
155
- //# sourceMappingURL=chunk-K2KOXVGA.cjs.map
154
+ //# sourceMappingURL=chunk-5KFM5ZNO.cjs.map
155
+ //# sourceMappingURL=chunk-5KFM5ZNO.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/TextArea/TextArea.tsx"],"names":["css","useId","isReactNode","getStatusMessageID","getDescribedBy","getNecessity","jsxs","Field","cx","inputRecipe","jsx","inputStyles","Icon","Spinner","getStatusIcon","Text"],"mappings":"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","file":"chunk-K2KOXVGA.cjs","sourcesContent":["'use client';\n\nimport {\n useId,\n type ChangeEvent,\n type CSSProperties,\n type ClipboardEvent,\n type FocusEvent,\n type ReactNode,\n type Ref,\n} from 'react';\nimport {\n Field,\n getNecessity,\n type FieldNecessity,\n type InputSize,\n type InputStatus,\n} from 'components/Field';\nimport {inputRecipe, inputStyles} from 'components/Field/inputStyles';\nimport {\n getDescribedBy,\n getStatusIcon,\n getStatusMessageID,\n} from 'components/Field/inputUtils';\nimport {Icon, type IconComponent} from 'components/Icon';\nimport {Spinner} from 'components/Spinner';\nimport {Text} from 'components/Text';\nimport {cx} from 'internal/cx';\nimport isReactNode from 'internal/isReactNode';\nimport {css} from 'styled-system/css';\n\nexport type TextAreaProps = {\n /**\n * Additional CSS class names applied to the textarea wrapper.\n */\n className?: string;\n /**\n * Test ID applied to the textarea element.\n */\n 'data-testid'?: string;\n /**\n * Supporting text displayed below the label.\n */\n description?: ReactNode;\n /**\n * Whether to focus the textarea on mount.\n * @default false\n */\n hasAutoFocus?: boolean;\n /**\n * Whether the browser spellcheck is enabled.\n * @default true\n */\n hasSpellCheck?: boolean;\n /**\n * HTML name attribute.\n */\n htmlName?: string;\n /**\n * Whether the textarea is disabled.\n * @default false\n */\n isDisabled?: boolean;\n /**\n * Whether to visually hide the label.\n * @default false\n */\n isLabelHidden?: boolean;\n /**\n * Whether the textarea is loading.\n * @default false\n */\n isLoading?: boolean;\n /**\n * Field label.\n */\n label: string;\n /**\n * Icon shown before the label.\n */\n labelIcon?: IconComponent;\n /**\n * Tooltip content shown next to the label.\n */\n labelTooltip?: ReactNode;\n /**\n * Maximum character count. Displays a counter when set.\n */\n maxLength?: number;\n /**\n * Called when the textarea loses focus.\n */\n onBlur?: (event: FocusEvent<HTMLTextAreaElement>) => void;\n /**\n * Called with the next string value.\n */\n onChange: (value: string, event: ChangeEvent<HTMLTextAreaElement>) => void;\n /**\n * Called when the textarea receives focus.\n */\n onFocus?: (event: FocusEvent<HTMLTextAreaElement>) => void;\n /**\n * Called when content is pasted into the textarea.\n */\n onPaste?: (event: ClipboardEvent<HTMLTextAreaElement>) => void;\n /**\n * Placeholder text.\n */\n placeholder?: string;\n /**\n * Ref forwarded to the textarea element.\n */\n ref?: Ref<HTMLTextAreaElement>;\n /**\n * Number of visible text rows.\n * @default 3\n */\n rows?: number;\n /**\n * Visual size.\n * @default 'md'\n */\n size?: InputSize;\n /**\n * Icon shown before the textarea.\n */\n startIcon?: IconComponent;\n /**\n * Validation status displayed below the textarea.\n */\n status?: InputStatus;\n /**\n * Inline styles applied to the textarea wrapper.\n */\n style?: CSSProperties;\n /**\n * Controlled textarea value.\n */\n value: string;\n} & FieldNecessity;\n\nconst styles = {\n wrapper: css({\n alignItems: 'flex-start',\n py: '2',\n }),\n textarea: css({\n resize: 'vertical',\n minH: '20',\n }),\n counter: css({\n alignSelf: 'flex-end',\n mt: '1',\n }),\n counterOverLimit: css({\n color: 'status.error.fg',\n }),\n} as const;\n\n/**\n * Multi-line text input field with optional character counter.\n */\nexport function TextArea({\n label,\n value,\n onChange,\n rows = 3,\n size = 'md',\n description,\n isLabelHidden = false,\n isOptional,\n isRequired,\n isDisabled = false,\n isLoading = false,\n hasSpellCheck = true,\n hasAutoFocus = false,\n htmlName,\n status,\n labelIcon,\n labelTooltip,\n startIcon,\n placeholder,\n maxLength,\n onPaste,\n onFocus,\n onBlur,\n className,\n 'data-testid': dataTestId,\n style,\n ref,\n}: TextAreaProps): React.JSX.Element {\n const inputId = useId();\n const descriptionID = isReactNode(description)\n ? `${inputId}-description`\n : undefined;\n const statusMessageID = getStatusMessageID(inputId, status);\n const counterID = maxLength != null ? `${inputId}-counter` : undefined;\n const describedBy = getDescribedBy(descriptionID, statusMessageID, counterID);\n const isOverLimit = maxLength != null && value.length > maxLength;\n\n const necessity = getNecessity(isOptional, isRequired);\n\n return (\n <Field\n className={className}\n description={description}\n descriptionID={descriptionID}\n inputId={inputId}\n isDisabled={isDisabled}\n isLabelHidden={isLabelHidden}\n {...necessity}\n label={label}\n labelIcon={labelIcon}\n labelTooltip={labelTooltip}\n status={\n status == null ? undefined : {...status, messageID: statusMessageID}\n }\n style={style}>\n <div\n className={cx(\n inputRecipe({\n size,\n status: status?.type,\n isDisabled,\n }),\n styles.wrapper,\n )}>\n {startIcon != null ? (\n <span className={inputStyles.iconSlot}>\n <Icon color=\"secondary\" icon={startIcon} size=\"sm\" />\n </span>\n ) : null}\n <textarea\n aria-busy={isLoading || undefined}\n aria-describedby={describedBy}\n aria-invalid={status?.type === 'error' || isOverLimit || undefined}\n aria-required={isRequired ?? undefined}\n // eslint-disable-next-line jsx-a11y-x/no-autofocus\n autoFocus={hasAutoFocus}\n className={cx(inputStyles.control, styles.textarea)}\n data-autofocus={hasAutoFocus || undefined}\n data-testid={dataTestId}\n disabled={isDisabled}\n id={inputId}\n maxLength={maxLength}\n name={htmlName}\n onBlur={onBlur}\n onChange={event => onChange(event.target.value, event)}\n onFocus={onFocus}\n onPaste={onPaste}\n placeholder={placeholder}\n ref={ref}\n rows={rows}\n spellCheck={hasSpellCheck}\n value={value}\n />\n {isLoading ? <Spinner size=\"sm\" /> : null}\n {status != null ? (\n <span className={inputStyles.iconSlot}>\n {getStatusIcon(status.type)}\n </span>\n ) : null}\n </div>\n {maxLength != null ? (\n <Text\n as=\"span\"\n className={cx(\n styles.counter,\n isOverLimit ? styles.counterOverLimit : undefined,\n )}\n color=\"secondary\"\n id={counterID}\n type=\"supporting\">\n {value.length}/{maxLength}\n </Text>\n ) : null}\n </Field>\n );\n}\n\nTextArea.displayName = 'TextArea';\n"]}
1
+ {"version":3,"sources":["../src/components/TextArea/TextArea.tsx"],"names":["css","useId","isReactNode","getStatusMessageID","getDescribedBy","getNecessity","jsxs","Field","cx","inputRecipe","jsx","inputStyles","Icon","Spinner","getStatusIcon","Text"],"mappings":"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","file":"chunk-5KFM5ZNO.cjs","sourcesContent":["'use client';\n\nimport {\n useId,\n type ChangeEvent,\n type CSSProperties,\n type ClipboardEvent,\n type FocusEvent,\n type ReactNode,\n type Ref,\n} from 'react';\nimport {\n Field,\n getNecessity,\n type FieldNecessity,\n type InputSize,\n type InputStatus,\n} from 'components/Field';\nimport {inputRecipe, inputStyles} from 'components/Field/inputStyles';\nimport {\n getDescribedBy,\n getStatusIcon,\n getStatusMessageID,\n} from 'components/Field/inputUtils';\nimport {Icon, type IconComponent} from 'components/Icon';\nimport {Spinner} from 'components/Spinner';\nimport {Text} from 'components/Text';\nimport {cx} from 'internal/cx';\nimport isReactNode from 'internal/isReactNode';\nimport {css} from 'styled-system/css';\n\nexport type TextAreaProps = {\n /**\n * Additional CSS class names applied to the textarea wrapper.\n */\n className?: string;\n /**\n * Test ID applied to the textarea element.\n */\n 'data-testid'?: string;\n /**\n * Supporting text displayed below the label.\n */\n description?: ReactNode;\n /**\n * Whether to focus the textarea on mount.\n * @default false\n */\n hasAutoFocus?: boolean;\n /**\n * Whether the browser spellcheck is enabled.\n * @default true\n */\n hasSpellCheck?: boolean;\n /**\n * HTML name attribute.\n */\n htmlName?: string;\n /**\n * Whether the textarea is disabled.\n * @default false\n */\n isDisabled?: boolean;\n /**\n * Whether to visually hide the label.\n * @default false\n */\n isLabelHidden?: boolean;\n /**\n * Whether the textarea is loading.\n * @default false\n */\n isLoading?: boolean;\n /**\n * Field label.\n */\n label: string;\n /**\n * Icon shown before the label.\n */\n labelIcon?: IconComponent;\n /**\n * Tooltip content shown next to the label.\n */\n labelTooltip?: ReactNode;\n /**\n * Maximum character count. Displays a counter when set.\n */\n maxLength?: number;\n /**\n * Called when the textarea loses focus.\n */\n onBlur?: (event: FocusEvent<HTMLTextAreaElement>) => void;\n /**\n * Called with the next string value.\n */\n onChange: (value: string, event: ChangeEvent<HTMLTextAreaElement>) => void;\n /**\n * Called when the textarea receives focus.\n */\n onFocus?: (event: FocusEvent<HTMLTextAreaElement>) => void;\n /**\n * Called when content is pasted into the textarea.\n */\n onPaste?: (event: ClipboardEvent<HTMLTextAreaElement>) => void;\n /**\n * Placeholder text.\n */\n placeholder?: string;\n /**\n * Ref forwarded to the textarea element.\n */\n ref?: Ref<HTMLTextAreaElement>;\n /**\n * Number of visible text rows.\n * @default 3\n */\n rows?: number;\n /**\n * Visual size.\n * @default 'md'\n */\n size?: InputSize;\n /**\n * Icon shown before the textarea.\n */\n startIcon?: IconComponent;\n /**\n * Validation status displayed below the textarea.\n */\n status?: InputStatus;\n /**\n * Inline styles applied to the textarea wrapper.\n */\n style?: CSSProperties;\n /**\n * Controlled textarea value.\n */\n value: string;\n} & FieldNecessity;\n\nconst styles = {\n wrapper: css({\n alignItems: 'flex-start',\n py: '2',\n }),\n textarea: css({\n resize: 'vertical',\n minH: '20',\n }),\n counter: css({\n alignSelf: 'flex-end',\n mt: '1',\n }),\n counterOverLimit: css({\n color: 'status.error.fg',\n }),\n} as const;\n\n/**\n * Multi-line text input field with optional character counter.\n */\nexport function TextArea({\n label,\n value,\n onChange,\n rows = 3,\n size = 'md',\n description,\n isLabelHidden = false,\n isOptional,\n isRequired,\n isDisabled = false,\n isLoading = false,\n hasSpellCheck = true,\n hasAutoFocus = false,\n htmlName,\n status,\n labelIcon,\n labelTooltip,\n startIcon,\n placeholder,\n maxLength,\n onPaste,\n onFocus,\n onBlur,\n className,\n 'data-testid': dataTestId,\n style,\n ref,\n}: TextAreaProps): React.JSX.Element {\n const inputId = useId();\n const descriptionID = isReactNode(description)\n ? `${inputId}-description`\n : undefined;\n const statusMessageID = getStatusMessageID(inputId, status);\n const counterID = maxLength != null ? `${inputId}-counter` : undefined;\n const describedBy = getDescribedBy(descriptionID, statusMessageID, counterID);\n const isOverLimit = maxLength != null && value.length > maxLength;\n\n const necessity = getNecessity(isOptional, isRequired);\n\n return (\n <Field\n className={className}\n description={description}\n descriptionID={descriptionID}\n inputId={inputId}\n isDisabled={isDisabled}\n isLabelHidden={isLabelHidden}\n {...necessity}\n label={label}\n labelIcon={labelIcon}\n labelTooltip={labelTooltip}\n status={\n status == null ? undefined : {...status, messageID: statusMessageID}\n }\n style={style}>\n <div\n className={cx(\n inputRecipe({\n size,\n status: status?.type,\n isDisabled,\n }),\n styles.wrapper,\n )}>\n {startIcon != null ? (\n <span className={inputStyles.iconSlot}>\n <Icon color=\"secondary\" icon={startIcon} size=\"sm\" />\n </span>\n ) : null}\n <textarea\n aria-busy={isLoading || undefined}\n aria-describedby={describedBy}\n aria-invalid={status?.type === 'error' || isOverLimit || undefined}\n aria-required={isRequired ?? undefined}\n // eslint-disable-next-line jsx-a11y-x/no-autofocus\n autoFocus={hasAutoFocus}\n className={cx(inputStyles.control, styles.textarea)}\n data-autofocus={hasAutoFocus || undefined}\n data-testid={dataTestId}\n disabled={isDisabled}\n id={inputId}\n maxLength={maxLength}\n name={htmlName}\n onBlur={onBlur}\n onChange={event => onChange(event.target.value, event)}\n onFocus={onFocus}\n onPaste={onPaste}\n placeholder={placeholder}\n ref={ref}\n rows={rows}\n spellCheck={hasSpellCheck}\n value={value}\n />\n {isLoading ? <Spinner size=\"sm\" /> : null}\n {status != null ? (\n <span className={inputStyles.iconSlot}>\n {getStatusIcon(status.type)}\n </span>\n ) : null}\n </div>\n {maxLength != null ? (\n <Text\n as=\"span\"\n className={cx(\n styles.counter,\n isOverLimit ? styles.counterOverLimit : undefined,\n )}\n color=\"secondary\"\n id={counterID}\n type=\"supporting\">\n {value.length}/{maxLength}\n </Text>\n ) : null}\n </Field>\n );\n}\n\nTextArea.displayName = 'TextArea';\n"]}
@@ -1,11 +1,11 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunkZKSEIA5Q_cjs = require('./chunk-ZKSEIA5Q.cjs');
4
+ var chunkLDKE723G_cjs = require('./chunk-LDKE723G.cjs');
5
5
  var chunkTT65RNBY_cjs = require('./chunk-TT65RNBY.cjs');
6
- var chunkXOJ5HGIP_cjs = require('./chunk-XOJ5HGIP.cjs');
7
- var chunkS5FJ3FHH_cjs = require('./chunk-S5FJ3FHH.cjs');
8
- var chunkEPQKIFGY_cjs = require('./chunk-EPQKIFGY.cjs');
6
+ var chunkFKZATUBG_cjs = require('./chunk-FKZATUBG.cjs');
7
+ var chunkHW7GODZJ_cjs = require('./chunk-HW7GODZJ.cjs');
8
+ var chunkI2QAN2HX_cjs = require('./chunk-I2QAN2HX.cjs');
9
9
  var chunkQAO6QMNQ_cjs = require('./chunk-QAO6QMNQ.cjs');
10
10
  var chunkJ4PIYOWT_cjs = require('./chunk-J4PIYOWT.cjs');
11
11
  var chunkZ6RT3WPE_cjs = require('./chunk-Z6RT3WPE.cjs');
@@ -104,7 +104,7 @@ function DropdownMenuItem({
104
104
  style,
105
105
  type: "button",
106
106
  children: /* @__PURE__ */ jsxRuntime.jsx(
107
- chunkZKSEIA5Q_cjs.Item,
107
+ chunkLDKE723G_cjs.Item,
108
108
  {
109
109
  as: "span",
110
110
  description,
@@ -152,7 +152,7 @@ function renderMenuItems(items) {
152
152
  role: "group",
153
153
  children: [
154
154
  item.title != null ? /* @__PURE__ */ jsxRuntime.jsx(
155
- chunkEPQKIFGY_cjs.Text,
155
+ chunkI2QAN2HX_cjs.Text,
156
156
  {
157
157
  as: "span",
158
158
  className: menuStyles.heading,
@@ -318,7 +318,7 @@ function DropdownMenu({
318
318
  [items, children]
319
319
  );
320
320
  return /* @__PURE__ */ jsxRuntime.jsx(
321
- chunkXOJ5HGIP_cjs.Popover,
321
+ chunkFKZATUBG_cjs.Popover,
322
322
  {
323
323
  content: /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuContext, { value: contextValue, children: /* @__PURE__ */ jsxRuntime.jsx(
324
324
  "div",
@@ -343,7 +343,7 @@ function DropdownMenu({
343
343
  role: "menu",
344
344
  style: { width: formatMenuWidth(menuWidth), ...style },
345
345
  children: /* @__PURE__ */ jsxRuntime.jsx(
346
- chunkS5FJ3FHH_cjs.Button,
346
+ chunkHW7GODZJ_cjs.Button,
347
347
  {
348
348
  ...button,
349
349
  "data-testid": dataTestId,
@@ -367,5 +367,5 @@ exports.formatMenuWidth = formatMenuWidth;
367
367
  exports.renderMenuItems = renderMenuItems;
368
368
  exports.useDropdownMenuContext = useDropdownMenuContext;
369
369
  exports.useMenuKeyboard = useMenuKeyboard;
370
- //# sourceMappingURL=chunk-7275FFQA.cjs.map
371
- //# sourceMappingURL=chunk-7275FFQA.cjs.map
370
+ //# sourceMappingURL=chunk-5P5OSQT2.cjs.map
371
+ //# sourceMappingURL=chunk-5P5OSQT2.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/DropdownMenu/DropdownMenuContext.ts","../src/components/DropdownMenu/DropdownMenuItem.recipe.ts","../src/components/DropdownMenu/DropdownMenuItem.tsx","../src/components/DropdownMenu/menuUtils.tsx","../src/components/DropdownMenu/DropdownMenu.tsx"],"names":["createContext","use","sva","jsx","cx","Item","Icon","css","Divider","jsxs","Text","useCallback","useState","useRef","isReactNode","useMemo","Popover","Button","Fragment","ChevronDown"],"mappings":"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","file":"chunk-7275FFQA.cjs","sourcesContent":["'use client';\n\nimport {createContext, use} from 'react';\nimport type {ButtonSize} from 'components/Button';\n\nexport interface DropdownMenuContextValue {\n closeMenu: () => void;\n menuSize: ButtonSize;\n}\n\nexport const DropdownMenuContext =\n createContext<DropdownMenuContextValue | null>(null);\n\nDropdownMenuContext.displayName = 'DropdownMenuContext';\n\nexport function useDropdownMenuContext(): DropdownMenuContextValue | null {\n return use(DropdownMenuContext);\n}\n","import {sva, type RecipeVariantProps} from 'styled-system/css';\n\nexport const dropdownMenuItemRecipe = sva({\n slots: ['root', 'icon'],\n base: {\n root: {\n display: 'block',\n w: 'full',\n borderRadius: 'md',\n color: 'fg',\n cursor: 'pointer',\n fontFamily: 'body',\n textAlign: 'start',\n _hover: {bg: 'bg.subtle'},\n _focusVisible: {\n outlineWidth: 'focus',\n outlineStyle: 'solid',\n outlineColor: 'primary',\n outlineOffset: 'focusOffsetTight',\n },\n _disabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n },\n icon: {\n display: 'inline-flex',\n flexShrink: 0,\n color: 'fg.muted',\n },\n },\n variants: {\n size: {\n sm: {\n root: {\n minH: 'component.sm',\n '& > *': {py: '0.5', px: '1.5', gap: '1.5'},\n },\n },\n md: {\n root: {minH: 'component.md', '& > *': {py: '1.5', px: '2'}},\n },\n lg: {\n root: {\n minH: 'component.lg',\n '& > *': {py: '2.5', px: '2.5', gap: '2.5'},\n },\n },\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport type DropdownMenuItemVariants = RecipeVariantProps<\n typeof dropdownMenuItemRecipe\n>;\n","'use client';\n\nimport type {CSSProperties, ReactNode, Ref} from 'react';\nimport {useDropdownMenuContext} from 'components/DropdownMenu/DropdownMenuContext';\nimport {dropdownMenuItemRecipe} from 'components/DropdownMenu/DropdownMenuItem.recipe';\nimport {Icon, type IconComponent} from 'components/Icon';\nimport {Item} from 'components/Item';\nimport {cx} from 'internal/cx';\n\nexport interface DropdownMenuItemProps {\n /**\n * Additional CSS class names applied to the item.\n */\n className?: string;\n /**\n * Test ID applied to the item.\n */\n 'data-testid'?: string;\n /**\n * Supporting text shown below the label.\n */\n description?: ReactNode;\n /**\n * Trailing content.\n */\n endContent?: ReactNode;\n /**\n * Icon rendered before the label.\n */\n icon?: IconComponent;\n /**\n * Whether the item is disabled.\n * @default false\n */\n isDisabled?: boolean;\n /**\n * Item label.\n */\n label: string;\n /**\n * Called when the item is selected.\n */\n onClick?: () => void;\n /**\n * Ref forwarded to the item button.\n */\n ref?: Ref<HTMLButtonElement>;\n /**\n * Inline styles applied to the item.\n */\n style?: CSSProperties;\n}\n\n/**\n * Action item inside a `DropdownMenu`.\n */\nexport function DropdownMenuItem({\n className,\n 'data-testid': dataTestId,\n description,\n endContent,\n icon,\n isDisabled = false,\n label,\n onClick,\n ref,\n style,\n}: DropdownMenuItemProps): React.JSX.Element {\n const context = useDropdownMenuContext();\n const menuSize = context?.menuSize ?? 'md';\n const classes = dropdownMenuItemRecipe({size: menuSize});\n\n return (\n <button\n className={cx(classes.root, className)}\n data-testid={dataTestId}\n disabled={isDisabled}\n onClick={() => {\n onClick?.();\n context?.closeMenu();\n }}\n ref={ref}\n role=\"menuitem\"\n style={style}\n type=\"button\">\n <Item\n as=\"span\"\n description={description}\n endContent={endContent}\n label={label}\n startContent={\n icon != null ? (\n <span className={classes.icon}>\n <Icon color=\"secondary\" icon={icon} size=\"sm\" />\n </span>\n ) : null\n }\n />\n </button>\n );\n}\n\nDropdownMenuItem.displayName = 'DropdownMenuItem';\n","/* eslint-disable @eslint-react/no-array-index-key */\n'use client';\nimport {useCallback, type KeyboardEvent, type ReactNode} from 'react';\nimport {Divider} from 'components/Divider';\nimport {DropdownMenuItem} from 'components/DropdownMenu/DropdownMenuItem';\nimport type {DropdownMenuOption} from 'components/DropdownMenu/types';\nimport {Text} from 'components/Text';\nimport {css} from 'styled-system/css';\n\nconst menuStyles = {\n section: css({\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5',\n }),\n heading: css({\n px: '2',\n py: '1',\n userSelect: 'none',\n }),\n divider: css({\n my: '1',\n }),\n} as const;\n\nexport function formatMenuWidth(\n value: number | string | undefined,\n): string | undefined {\n if (value == null) {\n return undefined;\n }\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nexport function renderMenuItems(\n items: ReadonlyArray<DropdownMenuOption>,\n): ReactNode {\n return items.map((item, index) => {\n if ('type' in item && item.type === 'divider') {\n return (\n <Divider className={menuStyles.divider} key={`divider-${index}`} />\n );\n }\n\n if ('type' in item) {\n return (\n <div\n aria-label={item.title}\n className={menuStyles.section}\n key={`section-${item.title ?? index}`}\n role=\"group\">\n {item.title != null ? (\n <Text\n as=\"span\"\n className={menuStyles.heading}\n color=\"secondary\"\n type=\"supporting\">\n {item.title}\n </Text>\n ) : null}\n {item.items.map(sectionItem => (\n <DropdownMenuItem\n description={sectionItem.description}\n icon={sectionItem.icon}\n isDisabled={sectionItem.isDisabled}\n key={sectionItem.label}\n label={sectionItem.label}\n onClick={sectionItem.onClick}\n />\n ))}\n </div>\n );\n }\n\n return (\n <DropdownMenuItem\n description={item.description}\n icon={item.icon}\n isDisabled={item.isDisabled}\n key={item.label}\n label={item.label}\n onClick={item.onClick}\n />\n );\n });\n}\n\nexport function useMenuKeyboard(\n menuRef: React.RefObject<HTMLElement | null>,\n onClose: () => void,\n): (event: KeyboardEvent<HTMLElement>) => void {\n const getMenuItems = useCallback(() => {\n if (menuRef.current == null) {\n return [];\n }\n return Array.from(\n menuRef.current.querySelectorAll<HTMLElement>(\n '[role=\"menuitem\"]:not(:disabled):not([aria-disabled=\"true\"])',\n ),\n );\n }, [menuRef]);\n\n return useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const menuItems = getMenuItems();\n if (menuItems.length === 0) {\n return;\n }\n const currentIndex = menuItems.findIndex(\n item => item === document.activeElement,\n );\n let nextIndex: number;\n\n switch (event.key) {\n case 'ArrowDown':\n nextIndex =\n currentIndex === -1 ? 0 : (currentIndex + 1) % menuItems.length;\n break;\n case 'ArrowUp':\n nextIndex =\n currentIndex === -1\n ? menuItems.length - 1\n : (currentIndex - 1 + menuItems.length) % menuItems.length;\n break;\n case 'Home':\n nextIndex = 0;\n break;\n case 'End':\n nextIndex = menuItems.length - 1;\n break;\n case 'Escape':\n event.preventDefault();\n onClose();\n return;\n case 'Enter':\n case ' ':\n if (document.activeElement instanceof HTMLElement) {\n event.preventDefault();\n document.activeElement.click();\n }\n return;\n default:\n if (event.key.length === 1) {\n const char = event.key.toLowerCase();\n const startIndex = currentIndex === -1 ? 0 : currentIndex + 1;\n for (let i = 0; i < menuItems.length; i++) {\n const index = (startIndex + i) % menuItems.length;\n const label = menuItems[index].textContent.trim().toLowerCase();\n if (label.startsWith(char)) {\n event.preventDefault();\n menuItems[index].focus();\n return;\n }\n }\n }\n return;\n }\n\n event.preventDefault();\n menuItems[nextIndex]?.focus();\n },\n [getMenuItems, onClose],\n );\n}\n","'use client';\n\nimport {ChevronDown} from 'lucide-react';\nimport {\n useCallback,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type Ref,\n} from 'react';\nimport {Button, type ButtonProps, type ButtonSize} from 'components/Button';\nimport {DropdownMenuContext} from 'components/DropdownMenu/DropdownMenuContext';\nimport {\n formatMenuWidth,\n renderMenuItems,\n useMenuKeyboard,\n} from 'components/DropdownMenu/menuUtils';\nimport type {DropdownMenuOption} from 'components/DropdownMenu/types';\nimport {Icon} from 'components/Icon';\nimport {Popover} from 'components/Popover';\nimport {cx} from 'internal/cx';\nimport isReactNode from 'internal/isReactNode';\nimport {css} from 'styled-system/css';\n\nexport type {\n DropdownMenuDivider,\n DropdownMenuItemData,\n DropdownMenuOption,\n DropdownMenuSection,\n} from 'components/DropdownMenu/types';\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown\n ? Omit<T, K>\n : never;\n\nexport type DropdownMenuButtonProps = DistributiveOmit<ButtonProps, 'onClick'>;\n\nexport interface DropdownMenuProps {\n /**\n * Trigger button props.\n */\n button?: DropdownMenuButtonProps;\n /**\n * Compound menu content (alternative to `items`).\n */\n children?: ReactNode;\n /**\n * Additional CSS class names applied to the menu surface.\n */\n className?: string;\n /**\n * Test ID applied to the trigger button.\n */\n 'data-testid'?: string;\n /**\n * Whether to auto-focus the first menu item on open.\n * @default true\n */\n hasAutoFocus?: boolean;\n /**\n * Whether to show a chevron on the trigger button.\n * @default true\n */\n hasChevron?: boolean;\n /**\n * Controlled open state.\n */\n isMenuOpen?: boolean;\n /**\n * Data-driven menu items.\n */\n items?: ReadonlyArray<DropdownMenuOption>;\n /**\n * Width of the menu surface.\n */\n menuWidth?: number | string;\n /**\n * Click handler for the trigger button.\n */\n onClick?: () => void;\n /**\n * Called when the menu open state changes.\n */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Ref forwarded to the trigger button.\n */\n ref?: Ref<HTMLButtonElement>;\n /**\n * Inline styles applied to the menu surface.\n */\n style?: CSSProperties;\n}\n\nconst styles = {\n menu: css({\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5',\n maxH: '80',\n overflowY: 'auto',\n p: '1',\n }),\n} as const;\n\nconst defaultButton = {label: 'Menu'} satisfies DropdownMenuButtonProps;\n\n/**\n * Button-triggered menu for grouped actions.\n */\nexport function DropdownMenu({\n button = defaultButton,\n children,\n className,\n 'data-testid': dataTestId,\n hasAutoFocus = true,\n hasChevron = true,\n isMenuOpen,\n items,\n menuWidth,\n onClick,\n onOpenChange,\n ref,\n style,\n}: DropdownMenuProps): React.JSX.Element {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = isMenuOpen !== undefined;\n const isOpen = isControlled ? isMenuOpen : internalOpen;\n const menuSize: ButtonSize = button.size ?? 'md';\n const menuRef = useRef<HTMLDivElement>(null);\n\n if (process.env.NODE_ENV !== 'production') {\n if (items != null && isReactNode(children)) {\n throw new Error(\n 'DropdownMenu: pass either `items` or `children`, not both.',\n );\n }\n if (items == null && !isReactNode(children)) {\n throw new Error('DropdownMenu: provide either `items` or `children`.');\n }\n }\n\n const hide = useCallback(() => {\n if (isControlled) {\n onOpenChange?.(false);\n } else {\n setInternalOpen(false);\n }\n }, [isControlled, onOpenChange]);\n\n const handleMenuKeyDown = useMenuKeyboard(menuRef, hide);\n\n const contextValue = useMemo(\n () => ({\n closeMenu: hide,\n menuSize,\n }),\n [hide, menuSize],\n );\n\n const menuNode = useMemo(\n (): ReactNode => (items == null ? children : renderMenuItems(items)),\n [items, children],\n );\n\n return (\n <Popover\n content={\n <DropdownMenuContext value={contextValue}>\n {/* eslint-disable-next-line jsx-a11y-x/no-static-element-interactions -- keyboard handler captures events for the parent role=\"menu\" element */}\n <div\n className={cx(styles.menu, className)}\n onKeyDown={handleMenuKeyDown}\n ref={menuRef}\n tabIndex={-1}>\n {menuNode}\n </div>\n </DropdownMenuContext>\n }\n hasAutoFocus={hasAutoFocus}\n hasCloseButton={false}\n isOpen={isOpen}\n onOpenChange={(isNextOpen: boolean): void => {\n if (isControlled) {\n onOpenChange?.(isNextOpen);\n } else {\n setInternalOpen(isNextOpen);\n }\n }}\n role=\"menu\"\n style={{width: formatMenuWidth(menuWidth), ...style}}>\n <Button\n {...button}\n data-testid={dataTestId}\n endContent={\n <>\n {button.endContent}\n {hasChevron ? <Icon icon={ChevronDown} size=\"sm\" /> : null}\n </>\n }\n onClick={onClick}\n ref={ref}\n />\n </Popover>\n );\n}\n\nDropdownMenu.displayName = 'DropdownMenu';\n"]}
1
+ {"version":3,"sources":["../src/components/DropdownMenu/DropdownMenuContext.ts","../src/components/DropdownMenu/DropdownMenuItem.recipe.ts","../src/components/DropdownMenu/DropdownMenuItem.tsx","../src/components/DropdownMenu/menuUtils.tsx","../src/components/DropdownMenu/DropdownMenu.tsx"],"names":["createContext","use","sva","jsx","cx","Item","Icon","css","Divider","jsxs","Text","useCallback","useState","useRef","isReactNode","useMemo","Popover","Button","Fragment","ChevronDown"],"mappings":"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","file":"chunk-5P5OSQT2.cjs","sourcesContent":["'use client';\n\nimport {createContext, use} from 'react';\nimport type {ButtonSize} from 'components/Button';\n\nexport interface DropdownMenuContextValue {\n closeMenu: () => void;\n menuSize: ButtonSize;\n}\n\nexport const DropdownMenuContext =\n createContext<DropdownMenuContextValue | null>(null);\n\nDropdownMenuContext.displayName = 'DropdownMenuContext';\n\nexport function useDropdownMenuContext(): DropdownMenuContextValue | null {\n return use(DropdownMenuContext);\n}\n","import {sva, type RecipeVariantProps} from 'styled-system/css';\n\nexport const dropdownMenuItemRecipe = sva({\n slots: ['root', 'icon'],\n base: {\n root: {\n display: 'block',\n w: 'full',\n borderRadius: 'md',\n color: 'fg',\n cursor: 'pointer',\n fontFamily: 'body',\n textAlign: 'start',\n _hover: {bg: 'bg.subtle'},\n _focusVisible: {\n outlineWidth: 'focus',\n outlineStyle: 'solid',\n outlineColor: 'primary',\n outlineOffset: 'focusOffsetTight',\n },\n _disabled: {\n opacity: 0.5,\n cursor: 'not-allowed',\n },\n },\n icon: {\n display: 'inline-flex',\n flexShrink: 0,\n color: 'fg.muted',\n },\n },\n variants: {\n size: {\n sm: {\n root: {\n minH: 'component.sm',\n '& > *': {py: '0.5', px: '1.5', gap: '1.5'},\n },\n },\n md: {\n root: {minH: 'component.md', '& > *': {py: '1.5', px: '2'}},\n },\n lg: {\n root: {\n minH: 'component.lg',\n '& > *': {py: '2.5', px: '2.5', gap: '2.5'},\n },\n },\n },\n },\n defaultVariants: {\n size: 'md',\n },\n});\n\nexport type DropdownMenuItemVariants = RecipeVariantProps<\n typeof dropdownMenuItemRecipe\n>;\n","'use client';\n\nimport type {CSSProperties, ReactNode, Ref} from 'react';\nimport {useDropdownMenuContext} from 'components/DropdownMenu/DropdownMenuContext';\nimport {dropdownMenuItemRecipe} from 'components/DropdownMenu/DropdownMenuItem.recipe';\nimport {Icon, type IconComponent} from 'components/Icon';\nimport {Item} from 'components/Item';\nimport {cx} from 'internal/cx';\n\nexport interface DropdownMenuItemProps {\n /**\n * Additional CSS class names applied to the item.\n */\n className?: string;\n /**\n * Test ID applied to the item.\n */\n 'data-testid'?: string;\n /**\n * Supporting text shown below the label.\n */\n description?: ReactNode;\n /**\n * Trailing content.\n */\n endContent?: ReactNode;\n /**\n * Icon rendered before the label.\n */\n icon?: IconComponent;\n /**\n * Whether the item is disabled.\n * @default false\n */\n isDisabled?: boolean;\n /**\n * Item label.\n */\n label: string;\n /**\n * Called when the item is selected.\n */\n onClick?: () => void;\n /**\n * Ref forwarded to the item button.\n */\n ref?: Ref<HTMLButtonElement>;\n /**\n * Inline styles applied to the item.\n */\n style?: CSSProperties;\n}\n\n/**\n * Action item inside a `DropdownMenu`.\n */\nexport function DropdownMenuItem({\n className,\n 'data-testid': dataTestId,\n description,\n endContent,\n icon,\n isDisabled = false,\n label,\n onClick,\n ref,\n style,\n}: DropdownMenuItemProps): React.JSX.Element {\n const context = useDropdownMenuContext();\n const menuSize = context?.menuSize ?? 'md';\n const classes = dropdownMenuItemRecipe({size: menuSize});\n\n return (\n <button\n className={cx(classes.root, className)}\n data-testid={dataTestId}\n disabled={isDisabled}\n onClick={() => {\n onClick?.();\n context?.closeMenu();\n }}\n ref={ref}\n role=\"menuitem\"\n style={style}\n type=\"button\">\n <Item\n as=\"span\"\n description={description}\n endContent={endContent}\n label={label}\n startContent={\n icon != null ? (\n <span className={classes.icon}>\n <Icon color=\"secondary\" icon={icon} size=\"sm\" />\n </span>\n ) : null\n }\n />\n </button>\n );\n}\n\nDropdownMenuItem.displayName = 'DropdownMenuItem';\n","/* eslint-disable @eslint-react/no-array-index-key */\n'use client';\nimport {useCallback, type KeyboardEvent, type ReactNode} from 'react';\nimport {Divider} from 'components/Divider';\nimport {DropdownMenuItem} from 'components/DropdownMenu/DropdownMenuItem';\nimport type {DropdownMenuOption} from 'components/DropdownMenu/types';\nimport {Text} from 'components/Text';\nimport {css} from 'styled-system/css';\n\nconst menuStyles = {\n section: css({\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5',\n }),\n heading: css({\n px: '2',\n py: '1',\n userSelect: 'none',\n }),\n divider: css({\n my: '1',\n }),\n} as const;\n\nexport function formatMenuWidth(\n value: number | string | undefined,\n): string | undefined {\n if (value == null) {\n return undefined;\n }\n return typeof value === 'number' ? `${value}px` : value;\n}\n\nexport function renderMenuItems(\n items: ReadonlyArray<DropdownMenuOption>,\n): ReactNode {\n return items.map((item, index) => {\n if ('type' in item && item.type === 'divider') {\n return (\n <Divider className={menuStyles.divider} key={`divider-${index}`} />\n );\n }\n\n if ('type' in item) {\n return (\n <div\n aria-label={item.title}\n className={menuStyles.section}\n key={`section-${item.title ?? index}`}\n role=\"group\">\n {item.title != null ? (\n <Text\n as=\"span\"\n className={menuStyles.heading}\n color=\"secondary\"\n type=\"supporting\">\n {item.title}\n </Text>\n ) : null}\n {item.items.map(sectionItem => (\n <DropdownMenuItem\n description={sectionItem.description}\n icon={sectionItem.icon}\n isDisabled={sectionItem.isDisabled}\n key={sectionItem.label}\n label={sectionItem.label}\n onClick={sectionItem.onClick}\n />\n ))}\n </div>\n );\n }\n\n return (\n <DropdownMenuItem\n description={item.description}\n icon={item.icon}\n isDisabled={item.isDisabled}\n key={item.label}\n label={item.label}\n onClick={item.onClick}\n />\n );\n });\n}\n\nexport function useMenuKeyboard(\n menuRef: React.RefObject<HTMLElement | null>,\n onClose: () => void,\n): (event: KeyboardEvent<HTMLElement>) => void {\n const getMenuItems = useCallback(() => {\n if (menuRef.current == null) {\n return [];\n }\n return Array.from(\n menuRef.current.querySelectorAll<HTMLElement>(\n '[role=\"menuitem\"]:not(:disabled):not([aria-disabled=\"true\"])',\n ),\n );\n }, [menuRef]);\n\n return useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const menuItems = getMenuItems();\n if (menuItems.length === 0) {\n return;\n }\n const currentIndex = menuItems.findIndex(\n item => item === document.activeElement,\n );\n let nextIndex: number;\n\n switch (event.key) {\n case 'ArrowDown':\n nextIndex =\n currentIndex === -1 ? 0 : (currentIndex + 1) % menuItems.length;\n break;\n case 'ArrowUp':\n nextIndex =\n currentIndex === -1\n ? menuItems.length - 1\n : (currentIndex - 1 + menuItems.length) % menuItems.length;\n break;\n case 'Home':\n nextIndex = 0;\n break;\n case 'End':\n nextIndex = menuItems.length - 1;\n break;\n case 'Escape':\n event.preventDefault();\n onClose();\n return;\n case 'Enter':\n case ' ':\n if (document.activeElement instanceof HTMLElement) {\n event.preventDefault();\n document.activeElement.click();\n }\n return;\n default:\n if (event.key.length === 1) {\n const char = event.key.toLowerCase();\n const startIndex = currentIndex === -1 ? 0 : currentIndex + 1;\n for (let i = 0; i < menuItems.length; i++) {\n const index = (startIndex + i) % menuItems.length;\n const label = menuItems[index].textContent.trim().toLowerCase();\n if (label.startsWith(char)) {\n event.preventDefault();\n menuItems[index].focus();\n return;\n }\n }\n }\n return;\n }\n\n event.preventDefault();\n menuItems[nextIndex]?.focus();\n },\n [getMenuItems, onClose],\n );\n}\n","'use client';\n\nimport {ChevronDown} from 'lucide-react';\nimport {\n useCallback,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type Ref,\n} from 'react';\nimport {Button, type ButtonProps, type ButtonSize} from 'components/Button';\nimport {DropdownMenuContext} from 'components/DropdownMenu/DropdownMenuContext';\nimport {\n formatMenuWidth,\n renderMenuItems,\n useMenuKeyboard,\n} from 'components/DropdownMenu/menuUtils';\nimport type {DropdownMenuOption} from 'components/DropdownMenu/types';\nimport {Icon} from 'components/Icon';\nimport {Popover} from 'components/Popover';\nimport {cx} from 'internal/cx';\nimport isReactNode from 'internal/isReactNode';\nimport {css} from 'styled-system/css';\n\nexport type {\n DropdownMenuDivider,\n DropdownMenuItemData,\n DropdownMenuOption,\n DropdownMenuSection,\n} from 'components/DropdownMenu/types';\n\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown\n ? Omit<T, K>\n : never;\n\nexport type DropdownMenuButtonProps = DistributiveOmit<ButtonProps, 'onClick'>;\n\nexport interface DropdownMenuProps {\n /**\n * Trigger button props.\n */\n button?: DropdownMenuButtonProps;\n /**\n * Compound menu content (alternative to `items`).\n */\n children?: ReactNode;\n /**\n * Additional CSS class names applied to the menu surface.\n */\n className?: string;\n /**\n * Test ID applied to the trigger button.\n */\n 'data-testid'?: string;\n /**\n * Whether to auto-focus the first menu item on open.\n * @default true\n */\n hasAutoFocus?: boolean;\n /**\n * Whether to show a chevron on the trigger button.\n * @default true\n */\n hasChevron?: boolean;\n /**\n * Controlled open state.\n */\n isMenuOpen?: boolean;\n /**\n * Data-driven menu items.\n */\n items?: ReadonlyArray<DropdownMenuOption>;\n /**\n * Width of the menu surface.\n */\n menuWidth?: number | string;\n /**\n * Click handler for the trigger button.\n */\n onClick?: () => void;\n /**\n * Called when the menu open state changes.\n */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Ref forwarded to the trigger button.\n */\n ref?: Ref<HTMLButtonElement>;\n /**\n * Inline styles applied to the menu surface.\n */\n style?: CSSProperties;\n}\n\nconst styles = {\n menu: css({\n display: 'flex',\n flexDirection: 'column',\n gap: '0.5',\n maxH: '80',\n overflowY: 'auto',\n p: '1',\n }),\n} as const;\n\nconst defaultButton = {label: 'Menu'} satisfies DropdownMenuButtonProps;\n\n/**\n * Button-triggered menu for grouped actions.\n */\nexport function DropdownMenu({\n button = defaultButton,\n children,\n className,\n 'data-testid': dataTestId,\n hasAutoFocus = true,\n hasChevron = true,\n isMenuOpen,\n items,\n menuWidth,\n onClick,\n onOpenChange,\n ref,\n style,\n}: DropdownMenuProps): React.JSX.Element {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = isMenuOpen !== undefined;\n const isOpen = isControlled ? isMenuOpen : internalOpen;\n const menuSize: ButtonSize = button.size ?? 'md';\n const menuRef = useRef<HTMLDivElement>(null);\n\n if (process.env.NODE_ENV !== 'production') {\n if (items != null && isReactNode(children)) {\n throw new Error(\n 'DropdownMenu: pass either `items` or `children`, not both.',\n );\n }\n if (items == null && !isReactNode(children)) {\n throw new Error('DropdownMenu: provide either `items` or `children`.');\n }\n }\n\n const hide = useCallback(() => {\n if (isControlled) {\n onOpenChange?.(false);\n } else {\n setInternalOpen(false);\n }\n }, [isControlled, onOpenChange]);\n\n const handleMenuKeyDown = useMenuKeyboard(menuRef, hide);\n\n const contextValue = useMemo(\n () => ({\n closeMenu: hide,\n menuSize,\n }),\n [hide, menuSize],\n );\n\n const menuNode = useMemo(\n (): ReactNode => (items == null ? children : renderMenuItems(items)),\n [items, children],\n );\n\n return (\n <Popover\n content={\n <DropdownMenuContext value={contextValue}>\n {/* eslint-disable-next-line jsx-a11y-x/no-static-element-interactions -- keyboard handler captures events for the parent role=\"menu\" element */}\n <div\n className={cx(styles.menu, className)}\n onKeyDown={handleMenuKeyDown}\n ref={menuRef}\n tabIndex={-1}>\n {menuNode}\n </div>\n </DropdownMenuContext>\n }\n hasAutoFocus={hasAutoFocus}\n hasCloseButton={false}\n isOpen={isOpen}\n onOpenChange={(isNextOpen: boolean): void => {\n if (isControlled) {\n onOpenChange?.(isNextOpen);\n } else {\n setInternalOpen(isNextOpen);\n }\n }}\n role=\"menu\"\n style={{width: formatMenuWidth(menuWidth), ...style}}>\n <Button\n {...button}\n data-testid={dataTestId}\n endContent={\n <>\n {button.endContent}\n {hasChevron ? <Icon icon={ChevronDown} size=\"sm\" /> : null}\n </>\n }\n onClick={onClick}\n ref={ref}\n />\n </Popover>\n );\n}\n\nDropdownMenu.displayName = 'DropdownMenu';\n"]}
@@ -1,10 +1,10 @@
1
1
  'use client';
2
- import { getNecessity, Field } from './chunk-PZBY3JI7.js';
2
+ import { getNecessity, Field } from './chunk-2EGYYWPB.js';
3
3
  import { getStatusMessageID, getDescribedBy, getStatusIcon } from './chunk-G6HS52US.js';
4
- import { Button } from './chunk-JJ32AVLU.js';
5
- import { Spinner } from './chunk-7SGBGPZW.js';
4
+ import { Button } from './chunk-J2TQNGUM.js';
5
+ import { Spinner } from './chunk-RM2XLAAU.js';
6
6
  import { VisuallyHidden } from './chunk-V2V5TTTL.js';
7
- import { Text } from './chunk-KPAOAYDY.js';
7
+ import { Text } from './chunk-4G644ETX.js';
8
8
  import { mergeRefs } from './chunk-SGLIDI6R.js';
9
9
  import { isReactNode } from './chunk-2PSZAWLC.js';
10
10
  import { Icon } from './chunk-IUW777WZ.js';
@@ -394,5 +394,5 @@ function FileInput({
394
394
  FileInput.displayName = "FileInput";
395
395
 
396
396
  export { FileInput };
397
- //# sourceMappingURL=chunk-SXLGTRY7.js.map
398
- //# sourceMappingURL=chunk-SXLGTRY7.js.map
397
+ //# sourceMappingURL=chunk-5SCHQS3L.js.map
398
+ //# sourceMappingURL=chunk-5SCHQS3L.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/FileInput/FileInput.recipe.ts","../src/internal/formatFileSize.ts","../src/components/FileInput/FileInput.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEO,IAAM,kBAAkB,GAAA,CAAI;AAAA,EACjC,KAAA,EAAO,CAAC,SAAA,EAAW,MAAA,EAAQ,UAAU,CAAA;AAAA,EACrC,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,GAAA,EAAK,GAAA;AAAA,MACL,EAAA,EAAI,GAAA;AAAA,MACJ,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa,OAAA;AAAA,MACb,WAAA,EAAa,mBAAA;AAAA,MACb,YAAA,EAAc,IAAA;AAAA,MACd,EAAA,EAAI,IAAA;AAAA,MACJ,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,EAAC,WAAA,EAAa,UAAA;AAAU,KAClC;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,OAAA,EAAS,aAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAAA,IACA,QAAA,EAAU;AAAA,MACR,IAAA,EAAM,CAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MACN,QAAA,EAAU,QAAA;AAAA,MACV,YAAA,EAAc,UAAA;AAAA,MACd,UAAA,EAAY;AAAA;AACd,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP,QAAA,EAAU,UAAA;AAAA,UACV,MAAA,EAAQ,CAAA;AAAA,UACR,kBAAA,EAAoB,mCAAA;AAAA,UACpB,kBAAA,EAAoB,MAAA;AAAA,UACpB,wBAAA,EAA0B,SAAA;AAAA,UAC1B,YAAA,EAAc;AAAA,YACZ,WAAA,EAAa,SAAA;AAAA,YACb,SAAA,EAAW;AAAA;AACb;AACF,OACF;AAAA,MACA,QAAA,EAAU;AAAA,QACR,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,IAAA;AAAA,UACN,aAAA,EAAe,QAAA;AAAA,UACf,cAAA,EAAgB,QAAA;AAAA,UAChB,WAAA,EAAa,QAAA;AAAA,UACb,SAAA,EAAW,QAAA;AAAA,UACX,OAAA,EAAS,EAAC,IAAA,EAAM,MAAA,EAAM;AAAA;AAAA;AAAA,UAGtB,YAAA,EAAc;AAAA,YACZ,YAAA,EAAc,OAAA;AAAA,YACd,YAAA,EAAc,OAAA;AAAA,YACd,YAAA,EAAc,SAAA;AAAA,YACd,aAAA,EAAe;AAAA;AACjB;AACF;AACF,KACF;AAAA;AAAA;AAAA,IAGA,IAAA,EAAM;AAAA,MACJ,IAAI,EAAC;AAAA,MACL,IAAI,EAAC;AAAA,MACL,IAAI;AAAC,KACP;AAAA;AAAA;AAAA,IAGA,MAAA,EAAQ;AAAA,MACN,SAAS,EAAC;AAAA,MACV,OAAO,EAAC;AAAA,MACR,SAAS;AAAC,KACZ;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,EAAC,MAAA,EAAQ,aAAA,EAAe,SAAS,IAAA;AAAI,OAChD;AAAA,MACA,OAAO;AAAC,KACV;AAAA,IACA,UAAA,EAAY;AAAA,MACV,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,EAAC,WAAA,EAAa,SAAA,EAAW,IAAI,aAAA;AAAa,OACrD;AAAA,MACA,OAAO;AAAC;AACV,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,EAAC,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,EAAC,OAAA,EAAS,EAAC,IAAA,EAAM,cAAA,EAAc,EAAC,EAAC;AAAA,IAClE,EAAC,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,EAAC,OAAA,EAAS,EAAC,IAAA,EAAM,cAAA,EAAc,EAAC,EAAC;AAAA,IAClE,EAAC,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,EAAC,OAAA,EAAS,EAAC,IAAA,EAAM,cAAA,EAAc,EAAC,EAAC;AAAA,IAClE;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,GAAA,EAAK;AAAA,QACH,OAAA,EAAS;AAAA,UACP,WAAA,EAAa,uBAAA;AAAA,UACb,MAAA,EAAQ,EAAC,WAAA,EAAa,4BAAA,EAA4B;AAAA,UAClD,YAAA,EAAc;AAAA,YACZ,WAAA,EAAa,uBAAA;AAAA,YACb,SAAA,EAAW;AAAA;AACb;AACF;AACF,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,OAAA;AAAA,MACR,GAAA,EAAK;AAAA,QACH,OAAA,EAAS;AAAA,UACP,WAAA,EAAa,qBAAA;AAAA,UACb,MAAA,EAAQ,EAAC,WAAA,EAAa,0BAAA,EAA0B;AAAA,UAChD,YAAA,EAAc;AAAA,YACZ,WAAA,EAAa,qBAAA;AAAA,YACb,SAAA,EAAW;AAAA;AACb;AACF;AACF,KACF;AAAA,IACA;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA,MACR,GAAA,EAAK;AAAA,QACH,OAAA,EAAS;AAAA,UACP,WAAA,EAAa,uBAAA;AAAA,UACb,MAAA,EAAQ,EAAC,WAAA,EAAa,4BAAA,EAA4B;AAAA,UAClD,YAAA,EAAc;AAAA,YACZ,WAAA,EAAa,uBAAA;AAAA,YACb,SAAA,EAAW;AAAA;AACb;AACF;AACF;AACF,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,OAAA;AAAA,IACN,IAAA,EAAM,IAAA;AAAA,IACN,UAAA,EAAY,KAAA;AAAA,IACZ,UAAA,EAAY;AAAA;AAEhB,CAAC,CAAA;;;AChJM,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAO,GAAG,KAAK,CAAA,EAAA,CAAA;AAAA,EACjB;AAEA,EAAA,IAAI,KAAA,GAAQ,OAAO,IAAA,EAAM;AACvB,IAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,EACrC;AAEA,EAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC9C;ACgJA,SAAS,aAAA,CACP,OACA,OAAA,EAMuC;AACvC,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,OAAA,CAAQ,UAAU,IAAA,EAAM;AAC1B,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,CAC3B,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAa,CAAA;AACxC,IAAA,UAAA,GAAa,UAAA,CAAW,MAAA;AAAA,MAAO,CAAA,IAAA,KAC7B,aAAA,CAAc,IAAA,CAAK,CAAA,IAAA,KAAQ;AACzB,QAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,UAAA,OAAO,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA;AAAA,QAC9C;AACA,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AACvB,UAAA,OAAO,KAAK,IAAA,CAAK,UAAA,CAAW,KAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,QAC/C;AACA,QAAA,OAAO,IAAA,CAAK,IAAA,CAAK,WAAA,EAAY,KAAM,IAAA;AAAA,MACrC,CAAC;AAAA,KACH;AACA,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,KAAA,CAAM,MAAA,EAAQ;AACtC,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,UAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,IAAA,EAAM;AAC3B,IAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AACxB,IAAA,MAAM,YAAY,UAAA,CAAW,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,OAAO,OAAO,CAAA;AAC7D,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,OAAO;AAAA,QACL,OAAO,CAAA,CAAA,EAAI,SAAA,CAAU,IAAI,CAAA,UAAA,EAAa,cAAA,CAAe,OAAO,CAAC,CAAA,CAAA,CAAA;AAAA,QAC7D,OAAO,UAAA,CAAW,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,QAAQ,OAAO;AAAA,OACvD;AAAA,IACF;AAAA,EACF;AACA,EAAA,IACE,OAAA,CAAQ,cACR,OAAA,CAAQ,QAAA,IAAY,QACpB,UAAA,CAAW,MAAA,GAAS,QAAQ,QAAA,EAC5B;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,UAAA,CAAW,KAAA,CAAM,CAAA,EAAG,QAAQ,QAAQ,CAAA;AAAA,MAC3C,KAAA,EAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,QAAQ,CAAA,eAAA;AAAA,KACpC;AAAA,EACF;AACA,EAAA,OAAO,EAAC,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,IAAA,EAAI;AACxC;AAEA,SAAS,aAAa,KAAA,EAA4C;AAChE,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3E;AACA,EAAA,OAAO,KAAA,CAAM,IAAA;AACf;AAKO,SAAS,SAAA,CAAU;AAAA,EACxB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,OAAA;AAAA,EACP,WAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA,GAAgB,KAAA;AAAA,EAChB,UAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,SAAA,GAAY,KAAA;AAAA,EACZ,IAAA,GAAO,IAAA;AAAA,EACP,MAAA,EAAQ,eAAA;AAAA,EACR,SAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA,EAAe,UAAA;AAAA,EACf,KAAA;AAAA,EACA;AACF,CAAA,EAAsC;AACpC,EAAA,MAAM,UAAU,KAAA,EAAM;AACtB,EAAA,MAAM,QAAA,GAAW,OAAyB,IAAI,CAAA;AAC9C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAwB,IAAI,CAAA;AAM1E,EAAA,MAAM,MAAA,GACJ,mBAAmB,IAAA,GACf,eAAA,GACA,EAAC,IAAA,EAAM,OAAA,EAAkB,SAAS,eAAA,EAAe;AACvD,EAAA,MAAM,gBAAgB,WAAA,CAAY,WAAW,CAAA,GACzC,CAAA,EAAG,OAAO,CAAA,YAAA,CAAA,GACV,MAAA;AACJ,EAAA,MAAM,eAAA,GAAkB,kBAAA,CAAmB,OAAA,EAAS,MAAM,CAAA;AAC1D,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,aAAA,EAAe,eAAe,CAAA;AACjE,EAAA,MAAM,SAAA,GAAY,aAAa,KAAK,CAAA;AACpC,EAAA,MAAM,WAAA,GACJ,SAAA,IAAa,WAAA,KAAgB,UAAA,GAAa,cAAA,GAAiB,aAAA,CAAA;AAC7D,EAAA,MAAM,aAAa,IAAA,KAAS,UAAA;AAC5B,EAAA,MAAM,UAAU,eAAA,CAAgB;AAAA,IAC9B,IAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAQ,MAAA,EAAQ,IAAA;AAAA,IAChB,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAkB;AACrC,IAAA,IAAI,UAAA,EAAY;AACd,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,cAAc,KAAA,EAAO;AAAA,MAClC,MAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,kBAAA,CAAmB,OAAO,KAAK,CAAA;AAC/B,IAAA,IAAI,UAAA,EAAY;AACd,MAAC,QAAA,CAAqC,OAAO,KAAK,CAAA;AAAA,IACpD,CAAA,MAAA,IAAW,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AACpC,MAAC,SAAyC,IAAI,CAAA;AAAA,IAChD,CAAA,MAAO;AACL,MAAC,QAAA,CAAyC,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAA,IAAI,UAAA,EAAY;AACd,MAAC,QAAA,CAAqC,EAAE,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAC,SAAyC,IAAI,CAAA;AAAA,IAChD;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,QAAA,CAAS,SAAS,KAAA,EAAM;AAAA,IAC1B;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,YAAY,UAAA,GACd;AAAA,IACE,WAAA,EAAa,CAAC,KAAA,KAAqC;AACjD,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,WAAA,EAAa,CAAC,KAAA,KAAqC;AACjD,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB,CAAA;AAAA,IACA,UAAA,EAAY,CAAC,KAAA,KAAqC;AAChD,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,KAAA,KAAqC;AAC5C,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,aAAA,CAAc,KAAK,CAAA;AACnB,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,WAAA,CAAY,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,KAAK,CAAC,CAAA;AAAA,MAClD;AAAA,IACF;AAAA,MAEF,EAAC;AAEL,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,UAAA,EAAY,UAAU,CAAA;AAErD,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA;AAAA,MACA,aAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACC,GAAG,SAAA;AAAA,MACJ,KAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA,EACE,UAAU,IAAA,GAAO,MAAA,GAAY,EAAC,GAAG,MAAA,EAAQ,WAAW,eAAA,EAAe;AAAA,MAWrE,QAAA,kBAAA,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,aAAW,SAAA,IAAa,MAAA;AAAA,UACxB,SAAA,EAAW,EAAA,CAAG,OAAA,CAAQ,OAAA,EAAS,SAAS,CAAA;AAAA,UACxC,OAAA,EAAS,cAAA;AAAA,UACT,KAAA;AAAA,UACC,GAAG,SAAA;AAAA,UACJ,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAA,GAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,MAAA;AAAA,gBACA,kBAAA,EAAkB,WAAA;AAAA,gBAClB,cAAA,EAAc,MAAA,EAAQ,IAAA,KAAS,OAAA,IAAW,MAAA;AAAA,gBAC1C,aAAA,EAAa,UAAA;AAAA,gBACb,QAAA,EAAU,UAAA;AAAA,gBACV,EAAA,EAAI,OAAA;AAAA,gBACJ,QAAA,EAAU,UAAA;AAAA,gBACV,UAAU,CAAA,KAAA,KAAS;AACjB,kBAAA,WAAA,CAAY,MAAM,IAAA,CAAK,KAAA,CAAM,OAAO,KAAA,IAAS,EAAE,CAAC,CAAA;AAChD,kBAAA,KAAA,CAAM,cAAc,KAAA,GAAQ,EAAA;AAAA,gBAC9B,CAAA;AAAA,gBACA,GAAA,EAAK,SAAA,CAAU,GAAA,EAAK,QAAQ,CAAA;AAAA,gBAC5B,QAAA,EAAU,UAAA;AAAA,gBACV,IAAA,EAAK;AAAA;AAAA,aACP,EACF,CAAA;AAAA,YACC,SAAA,uBACE,OAAA,EAAA,EAAQ,IAAA,EAAM,aAAa,IAAA,GAAO,IAAA,EAAM,oBAEzC,GAAA,CAAC,MAAA,EAAA,EAAK,WAAW,OAAA,CAAQ,IAAA,EACvB,8BAAC,IAAA,EAAA,EAAK,IAAA,EAAM,QAAQ,IAAA,EAAM,UAAA,GAAa,IAAA,GAAO,IAAA,EAAM,CAAA,EACtD,CAAA;AAAA,4BAEF,GAAA;AAAA,cAAC,IAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAG,MAAA;AAAA,gBACH,WAAW,OAAA,CAAQ,QAAA;AAAA,gBACnB,KAAA,EAAO,SAAA,IAAa,IAAA,GAAO,WAAA,GAAc,SAAA;AAAA,gBACxC,uBAAa,iBAAA,GAAoB;AAAA;AAAA,aACpC;AAAA,YACC,SAAA,IAAa,IAAA,IAAQ,CAAC,UAAA,IAAc,CAAC,SAAA,mBACpC,GAAA;AAAA,cAAC,MAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,CAAA;AAAA,gBACN,UAAA,EAAU,IAAA;AAAA,gBACV,KAAA,EAAO,SAAS,KAAK,CAAA,CAAA;AAAA,gBACrB,SAAS,CAAA,KAAA,KAAS;AAChB,kBAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,kBAAA,WAAA,EAAY;AAAA,gBACd,CAAA;AAAA,gBACA,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAQ;AAAA;AAAA,aACV,GACE,IAAA;AAAA,YACH,MAAA,IAAU,IAAA,IAAQ,CAAC,UAAA,mBAClB,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAO,QAAA,EAAA,aAAA,CAAc,MAAA,CAAO,IAAI,GAAE,CAAA,GACzD;AAAA;AAAA;AAAA;AACN;AAAA,GAEF;AAEJ;AAEA,SAAA,CAAU,WAAA,GAAc,WAAA","file":"chunk-SXLGTRY7.js","sourcesContent":["import {sva, type RecipeVariantProps} from 'styled-system/css';\n\nexport const fileInputRecipe = sva({\n slots: ['surface', 'icon', 'fileName'],\n base: {\n surface: {\n display: 'flex',\n alignItems: 'center',\n gap: '2',\n px: '3',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border.emphasized',\n borderRadius: 'md',\n bg: 'bg',\n cursor: 'pointer',\n _hover: {borderColor: 'fg.muted'},\n },\n icon: {\n display: 'inline-flex',\n color: 'fg.muted',\n },\n fileName: {\n flex: 1,\n minW: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n },\n variants: {\n mode: {\n input: {\n surface: {\n position: 'relative',\n zIndex: 1,\n transitionProperty: 'border-color, box-shadow, opacity',\n transitionDuration: 'fast',\n transitionTimingFunction: 'default',\n _focusWithin: {\n borderColor: 'primary',\n boxShadow: 'focus',\n },\n },\n },\n dropzone: {\n surface: {\n minH: '32',\n flexDirection: 'column',\n justifyContent: 'center',\n borderStyle: 'dashed',\n textAlign: 'center',\n '& > *': {flex: 'none'},\n // Focus lives on the visually-hidden file input, so the surface\n // reflects it via :focus-within (the input mode uses boxShadow).\n _focusWithin: {\n outlineWidth: 'focus',\n outlineStyle: 'solid',\n outlineColor: 'primary',\n outlineOffset: 'focusOffset',\n },\n },\n },\n },\n // Size only affects the input mode's height; the dropzone has a fixed\n // height, so the real styling lives in compoundVariants below.\n size: {\n sm: {},\n md: {},\n lg: {},\n },\n // Status border/focus colors only apply in input mode (the dropzone\n // surface keeps its dashed border), so they live in compoundVariants.\n status: {\n warning: {},\n error: {},\n success: {},\n },\n isDisabled: {\n true: {\n surface: {cursor: 'not-allowed', opacity: 0.55},\n },\n false: {},\n },\n isDragOver: {\n true: {\n surface: {borderColor: 'primary', bg: 'bg.selected'},\n },\n false: {},\n },\n },\n compoundVariants: [\n {mode: 'input', size: 'sm', css: {surface: {minH: 'component.sm'}}},\n {mode: 'input', size: 'md', css: {surface: {minH: 'component.md'}}},\n {mode: 'input', size: 'lg', css: {surface: {minH: 'component.lg'}}},\n {\n mode: 'input',\n status: 'warning',\n css: {\n surface: {\n borderColor: 'status.warning.border',\n _hover: {borderColor: 'status.warning.borderHover'},\n _focusWithin: {\n borderColor: 'status.warning.border',\n boxShadow: 'focus.warning',\n },\n },\n },\n },\n {\n mode: 'input',\n status: 'error',\n css: {\n surface: {\n borderColor: 'status.error.border',\n _hover: {borderColor: 'status.error.borderHover'},\n _focusWithin: {\n borderColor: 'status.error.border',\n boxShadow: 'focus.error',\n },\n },\n },\n },\n {\n mode: 'input',\n status: 'success',\n css: {\n surface: {\n borderColor: 'status.success.border',\n _hover: {borderColor: 'status.success.borderHover'},\n _focusWithin: {\n borderColor: 'status.success.border',\n boxShadow: 'focus.success',\n },\n },\n },\n },\n ],\n defaultVariants: {\n mode: 'input',\n size: 'md',\n isDisabled: false,\n isDragOver: false,\n },\n});\n\nexport type FileInputVariants = RecipeVariantProps<typeof fileInputRecipe>;\n","export function formatFileSize(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","'use client';\n\nimport {Upload, X} from 'lucide-react';\nimport {\n useId,\n useRef,\n useState,\n type CSSProperties,\n type DragEvent,\n type ReactNode,\n type Ref,\n} from 'react';\nimport {Button} from 'components/Button';\nimport {\n Field,\n getNecessity,\n type FieldNecessity,\n type InputSize,\n type InputStatus,\n} from 'components/Field';\nimport {\n getDescribedBy,\n getStatusIcon,\n getStatusMessageID,\n} from 'components/Field/inputUtils';\nimport {fileInputRecipe} from 'components/FileInput/FileInput.recipe';\nimport {Icon, type IconComponent} from 'components/Icon';\nimport {Spinner} from 'components/Spinner';\nimport {Text} from 'components/Text';\nimport {VisuallyHidden} from 'internal/VisuallyHidden';\nimport {cx} from 'internal/cx';\nimport {formatFileSize} from 'internal/formatFileSize';\nimport isReactNode from 'internal/isReactNode';\nimport {mergeRefs} from 'internal/mergeRefs';\n\nexport type FileInputMode = 'dropzone' | 'input';\n\ninterface FileInputBaseProps {\n /**\n * Comma-separated MIME types or file extensions the input accepts.\n */\n accept?: string;\n /**\n * Additional CSS class names applied to the root element.\n */\n className?: string;\n /**\n * Test ID applied to the hidden file input.\n */\n 'data-testid'?: string;\n /**\n * Supporting text rendered below the label.\n */\n description?: ReactNode;\n /**\n * Whether the input is disabled.\n * @default false\n */\n isDisabled?: boolean;\n /**\n * Whether to visually hide the label.\n * @default false\n */\n isLabelHidden?: boolean;\n /**\n * Whether the input is in a loading state.\n * @default false\n */\n isLoading?: boolean;\n /**\n * Field label text.\n */\n label: string;\n /**\n * Icon shown before the label.\n */\n labelIcon?: IconComponent;\n /**\n * Tooltip content shown next to the label.\n */\n labelTooltip?: ReactNode;\n /**\n * Maximum file size in bytes.\n */\n maxSize?: number;\n /**\n * Display mode: inline input or drag-and-drop dropzone.\n * @default 'input'\n */\n mode?: FileInputMode;\n /**\n * Placeholder text shown when no file is selected.\n */\n placeholder?: string;\n /**\n * Ref forwarded to the hidden file input element.\n */\n ref?: Ref<HTMLInputElement>;\n /**\n * Visual size of the input.\n * @default 'md'\n */\n size?: InputSize;\n /**\n * Validation status displayed below the input.\n */\n status?: InputStatus;\n /**\n * Inline styles applied to the root element.\n */\n style?: CSSProperties;\n}\n\ninterface FileInputSingleProps extends FileInputBaseProps {\n /**\n * Whether multiple files can be selected.\n */\n isMultiple?: false;\n /**\n * Maximum number of files allowed. Only applicable when isMultiple is true.\n */\n maxFiles?: undefined;\n /**\n * Called when the selected file changes.\n */\n onChange: (file: File | null) => void;\n /**\n * Currently selected file.\n */\n value: File | null;\n}\n\ninterface FileInputMultipleProps extends FileInputBaseProps {\n /**\n * Whether multiple files can be selected.\n */\n isMultiple: true;\n /**\n * Maximum number of files allowed.\n */\n maxFiles?: number;\n /**\n * Called when the selected files change.\n */\n onChange: (files: File[]) => void;\n /**\n * Currently selected files.\n */\n value: File[];\n}\n\nexport type FileInputProps = (FileInputMultipleProps | FileInputSingleProps) &\n FieldNecessity;\n\nfunction validateFiles(\n files: File[],\n options: {\n accept?: string;\n isMultiple: boolean;\n maxFiles?: number;\n maxSize?: number;\n },\n): {error: string | null; files: File[]} {\n let validFiles = files;\n if (options.accept != null) {\n const acceptedTypes = options.accept\n .split(',')\n .map(type => type.trim().toLowerCase());\n validFiles = validFiles.filter(file =>\n acceptedTypes.some(type => {\n if (type.startsWith('.')) {\n return file.name.toLowerCase().endsWith(type);\n }\n if (type.endsWith('/*')) {\n return file.type.startsWith(type.slice(0, -1));\n }\n return file.type.toLowerCase() === type;\n }),\n );\n if (validFiles.length !== files.length) {\n return {\n files: validFiles,\n error: 'One or more files are not an accepted type.',\n };\n }\n }\n if (options.maxSize != null) {\n const maxSize = options.maxSize;\n const oversized = validFiles.find(file => file.size > maxSize);\n if (oversized != null) {\n return {\n error: `\"${oversized.name}\" exceeds ${formatFileSize(maxSize)}.`,\n files: validFiles.filter(file => file.size <= maxSize),\n };\n }\n }\n if (\n options.isMultiple &&\n options.maxFiles != null &&\n validFiles.length > options.maxFiles\n ) {\n return {\n files: validFiles.slice(0, options.maxFiles),\n error: `Maximum ${options.maxFiles} files allowed.`,\n };\n }\n return {files: validFiles, error: null};\n}\n\nfunction getFileNames(value: File | File[] | null): string | null {\n if (value == null) {\n return null;\n }\n if (Array.isArray(value)) {\n return value.length === 0 ? null : value.map(file => file.name).join(', ');\n }\n return value.name;\n}\n\n/**\n * A file input supporting both inline and drag-and-drop dropzone modes.\n */\nexport function FileInput({\n label,\n value,\n onChange,\n accept,\n isMultiple = false,\n maxSize,\n maxFiles,\n mode = 'input',\n placeholder,\n description,\n isLabelHidden = false,\n isOptional,\n isRequired,\n isDisabled = false,\n isLoading = false,\n size = 'md',\n status: statusFromProps,\n labelIcon,\n labelTooltip,\n className,\n 'data-testid': dataTestId,\n style,\n ref,\n}: FileInputProps): React.JSX.Element {\n const inputId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragOver, setIsDragOver] = useState(false);\n const [validationError, setValidationError] = useState<string | null>(null);\n // A validation error from the user's most recent selection is immediate,\n // actionable feedback about what they just tried to do (wrong type, too\n // large, too many), so it takes precedence over a consumer-provided `status`\n // such as a form-level \"required\". Once there is no validation error (a valid\n // selection or a cleared field), the external status surfaces again.\n const status =\n validationError == null\n ? statusFromProps\n : {type: 'error' as const, message: validationError};\n const descriptionID = isReactNode(description)\n ? `${inputId}-description`\n : undefined;\n const statusMessageID = getStatusMessageID(inputId, status);\n const describedBy = getDescribedBy(descriptionID, statusMessageID);\n const fileNames = getFileNames(value);\n const displayText =\n fileNames ?? placeholder ?? (isMultiple ? 'Choose files' : 'Choose file');\n const isDropzone = mode === 'dropzone';\n const classes = fileInputRecipe({\n mode,\n size,\n status: status?.type,\n isDisabled,\n isDragOver,\n });\n\n const handleFiles = (files: File[]) => {\n if (isDisabled) {\n return;\n }\n const result = validateFiles(files, {\n accept,\n isMultiple,\n maxFiles,\n maxSize,\n });\n setValidationError(result.error);\n if (isMultiple) {\n (onChange as (files: File[]) => void)(result.files);\n } else if (result.files.length === 0) {\n (onChange as (file: File | null) => void)(null);\n } else {\n (onChange as (file: File | null) => void)(result.files[0]);\n }\n };\n\n const handleClear = () => {\n setValidationError(null);\n if (isMultiple) {\n (onChange as (files: File[]) => void)([]);\n } else {\n (onChange as (file: File | null) => void)(null);\n }\n };\n\n const openFilePicker = () => {\n if (!isDisabled) {\n inputRef.current?.click();\n }\n };\n\n const dragProps = isDropzone\n ? {\n onDragEnter: (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (!isDisabled) {\n setIsDragOver(true);\n }\n },\n onDragLeave: (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragOver(false);\n },\n onDragOver: (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (!isDisabled) {\n setIsDragOver(true);\n }\n },\n onDrop: (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragOver(false);\n if (!isDisabled) {\n handleFiles(Array.from(event.dataTransfer.files));\n }\n },\n }\n : {};\n\n const necessity = getNecessity(isOptional, isRequired);\n\n return (\n <Field\n description={description}\n descriptionID={descriptionID}\n inputId={inputId}\n isDisabled={isDisabled}\n isLabelHidden={isLabelHidden}\n {...necessity}\n label={label}\n labelIcon={labelIcon}\n labelTooltip={labelTooltip}\n status={\n status == null ? undefined : {...status, messageID: statusMessageID}\n }>\n {/*\n The visually-hidden <input> is the real, focusable, labeled control\n (the Field label targets it via htmlFor), so it owns the accessible\n name, description, focus, and keyboard activation. The surface is only\n a presentational mouse/drop target — it intentionally has no role or\n keyboard handler, because that would create a redundant second control\n with the same name. Hence the scoped a11y disables below.\n */}\n {/* eslint-disable jsx-a11y-x/no-static-element-interactions, jsx-a11y-x/click-events-have-key-events */}\n <div\n aria-busy={isLoading || undefined}\n className={cx(classes.surface, className)}\n onClick={openFilePicker}\n style={style}\n {...dragProps}>\n <VisuallyHidden>\n <input\n accept={accept}\n aria-describedby={describedBy}\n aria-invalid={status?.type === 'error' || undefined}\n data-testid={dataTestId}\n disabled={isDisabled}\n id={inputId}\n multiple={isMultiple}\n onChange={event => {\n handleFiles(Array.from(event.target.files ?? []));\n event.currentTarget.value = '';\n }}\n ref={mergeRefs(ref, inputRef)}\n required={isRequired}\n type=\"file\"\n />\n </VisuallyHidden>\n {isLoading ? (\n <Spinner size={isDropzone ? 'md' : 'sm'} />\n ) : (\n <span className={classes.icon}>\n <Icon icon={Upload} size={isDropzone ? 'md' : 'sm'} />\n </span>\n )}\n <Text\n as=\"span\"\n className={classes.fileName}\n color={fileNames == null ? 'secondary' : 'primary'}>\n {isDragOver ? 'Drop files here' : displayText}\n </Text>\n {fileNames != null && !isDisabled && !isLoading ? (\n <Button\n icon={X}\n isIconOnly\n label={`Clear ${label}`}\n onClick={event => {\n event.stopPropagation();\n handleClear();\n }}\n size=\"sm\"\n variant=\"ghost\"\n />\n ) : null}\n {status != null && !isDropzone ? (\n <span className={classes.icon}>{getStatusIcon(status.type)}</span>\n ) : null}\n </div>\n {/* eslint-enable jsx-a11y-x/no-static-element-interactions, jsx-a11y-x/click-events-have-key-events */}\n </Field>\n );\n}\n\nFileInput.displayName = 'FileInput';\n"]}
1
+ {"version":3,"sources":["../src/components/FileInput/FileInput.recipe.ts","../src/internal/formatFileSize.ts","../src/components/FileInput/FileInput.tsx"],"names":[],"mappings":"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","file":"chunk-5SCHQS3L.js","sourcesContent":["import {sva, type RecipeVariantProps} from 'styled-system/css';\n\nexport const fileInputRecipe = sva({\n slots: ['surface', 'icon', 'fileName'],\n base: {\n surface: {\n display: 'flex',\n alignItems: 'center',\n gap: '2',\n px: '3',\n borderWidth: 'default',\n borderStyle: 'solid',\n borderColor: 'border.emphasized',\n borderRadius: 'md',\n bg: 'bg',\n cursor: 'pointer',\n _hover: {borderColor: 'fg.muted'},\n },\n icon: {\n display: 'inline-flex',\n color: 'fg.muted',\n },\n fileName: {\n flex: 1,\n minW: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n },\n variants: {\n mode: {\n input: {\n surface: {\n position: 'relative',\n zIndex: 1,\n transitionProperty: 'border-color, box-shadow, opacity',\n transitionDuration: 'fast',\n transitionTimingFunction: 'default',\n _focusWithin: {\n borderColor: 'primary',\n boxShadow: 'focus',\n },\n },\n },\n dropzone: {\n surface: {\n minH: '32',\n flexDirection: 'column',\n justifyContent: 'center',\n borderStyle: 'dashed',\n textAlign: 'center',\n '& > *': {flex: 'none'},\n // Focus lives on the visually-hidden file input, so the surface\n // reflects it via :focus-within (the input mode uses boxShadow).\n _focusWithin: {\n outlineWidth: 'focus',\n outlineStyle: 'solid',\n outlineColor: 'primary',\n outlineOffset: 'focusOffset',\n },\n },\n },\n },\n // Size only affects the input mode's height; the dropzone has a fixed\n // height, so the real styling lives in compoundVariants below.\n size: {\n sm: {},\n md: {},\n lg: {},\n },\n // Status border/focus colors only apply in input mode (the dropzone\n // surface keeps its dashed border), so they live in compoundVariants.\n status: {\n warning: {},\n error: {},\n success: {},\n },\n isDisabled: {\n true: {\n surface: {cursor: 'not-allowed', opacity: 0.55},\n },\n false: {},\n },\n isDragOver: {\n true: {\n surface: {borderColor: 'primary', bg: 'bg.selected'},\n },\n false: {},\n },\n },\n compoundVariants: [\n {mode: 'input', size: 'sm', css: {surface: {minH: 'component.sm'}}},\n {mode: 'input', size: 'md', css: {surface: {minH: 'component.md'}}},\n {mode: 'input', size: 'lg', css: {surface: {minH: 'component.lg'}}},\n {\n mode: 'input',\n status: 'warning',\n css: {\n surface: {\n borderColor: 'status.warning.border',\n _hover: {borderColor: 'status.warning.borderHover'},\n _focusWithin: {\n borderColor: 'status.warning.border',\n boxShadow: 'focus.warning',\n },\n },\n },\n },\n {\n mode: 'input',\n status: 'error',\n css: {\n surface: {\n borderColor: 'status.error.border',\n _hover: {borderColor: 'status.error.borderHover'},\n _focusWithin: {\n borderColor: 'status.error.border',\n boxShadow: 'focus.error',\n },\n },\n },\n },\n {\n mode: 'input',\n status: 'success',\n css: {\n surface: {\n borderColor: 'status.success.border',\n _hover: {borderColor: 'status.success.borderHover'},\n _focusWithin: {\n borderColor: 'status.success.border',\n boxShadow: 'focus.success',\n },\n },\n },\n },\n ],\n defaultVariants: {\n mode: 'input',\n size: 'md',\n isDisabled: false,\n isDragOver: false,\n },\n});\n\nexport type FileInputVariants = RecipeVariantProps<typeof fileInputRecipe>;\n","export function formatFileSize(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n\n if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n }\n\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","'use client';\n\nimport {Upload, X} from 'lucide-react';\nimport {\n useId,\n useRef,\n useState,\n type CSSProperties,\n type DragEvent,\n type ReactNode,\n type Ref,\n} from 'react';\nimport {Button} from 'components/Button';\nimport {\n Field,\n getNecessity,\n type FieldNecessity,\n type InputSize,\n type InputStatus,\n} from 'components/Field';\nimport {\n getDescribedBy,\n getStatusIcon,\n getStatusMessageID,\n} from 'components/Field/inputUtils';\nimport {fileInputRecipe} from 'components/FileInput/FileInput.recipe';\nimport {Icon, type IconComponent} from 'components/Icon';\nimport {Spinner} from 'components/Spinner';\nimport {Text} from 'components/Text';\nimport {VisuallyHidden} from 'internal/VisuallyHidden';\nimport {cx} from 'internal/cx';\nimport {formatFileSize} from 'internal/formatFileSize';\nimport isReactNode from 'internal/isReactNode';\nimport {mergeRefs} from 'internal/mergeRefs';\n\nexport type FileInputMode = 'dropzone' | 'input';\n\ninterface FileInputBaseProps {\n /**\n * Comma-separated MIME types or file extensions the input accepts.\n */\n accept?: string;\n /**\n * Additional CSS class names applied to the root element.\n */\n className?: string;\n /**\n * Test ID applied to the hidden file input.\n */\n 'data-testid'?: string;\n /**\n * Supporting text rendered below the label.\n */\n description?: ReactNode;\n /**\n * Whether the input is disabled.\n * @default false\n */\n isDisabled?: boolean;\n /**\n * Whether to visually hide the label.\n * @default false\n */\n isLabelHidden?: boolean;\n /**\n * Whether the input is in a loading state.\n * @default false\n */\n isLoading?: boolean;\n /**\n * Field label text.\n */\n label: string;\n /**\n * Icon shown before the label.\n */\n labelIcon?: IconComponent;\n /**\n * Tooltip content shown next to the label.\n */\n labelTooltip?: ReactNode;\n /**\n * Maximum file size in bytes.\n */\n maxSize?: number;\n /**\n * Display mode: inline input or drag-and-drop dropzone.\n * @default 'input'\n */\n mode?: FileInputMode;\n /**\n * Placeholder text shown when no file is selected.\n */\n placeholder?: string;\n /**\n * Ref forwarded to the hidden file input element.\n */\n ref?: Ref<HTMLInputElement>;\n /**\n * Visual size of the input.\n * @default 'md'\n */\n size?: InputSize;\n /**\n * Validation status displayed below the input.\n */\n status?: InputStatus;\n /**\n * Inline styles applied to the root element.\n */\n style?: CSSProperties;\n}\n\ninterface FileInputSingleProps extends FileInputBaseProps {\n /**\n * Whether multiple files can be selected.\n */\n isMultiple?: false;\n /**\n * Maximum number of files allowed. Only applicable when isMultiple is true.\n */\n maxFiles?: undefined;\n /**\n * Called when the selected file changes.\n */\n onChange: (file: File | null) => void;\n /**\n * Currently selected file.\n */\n value: File | null;\n}\n\ninterface FileInputMultipleProps extends FileInputBaseProps {\n /**\n * Whether multiple files can be selected.\n */\n isMultiple: true;\n /**\n * Maximum number of files allowed.\n */\n maxFiles?: number;\n /**\n * Called when the selected files change.\n */\n onChange: (files: File[]) => void;\n /**\n * Currently selected files.\n */\n value: File[];\n}\n\nexport type FileInputProps = (FileInputMultipleProps | FileInputSingleProps) &\n FieldNecessity;\n\nfunction validateFiles(\n files: File[],\n options: {\n accept?: string;\n isMultiple: boolean;\n maxFiles?: number;\n maxSize?: number;\n },\n): {error: string | null; files: File[]} {\n let validFiles = files;\n if (options.accept != null) {\n const acceptedTypes = options.accept\n .split(',')\n .map(type => type.trim().toLowerCase());\n validFiles = validFiles.filter(file =>\n acceptedTypes.some(type => {\n if (type.startsWith('.')) {\n return file.name.toLowerCase().endsWith(type);\n }\n if (type.endsWith('/*')) {\n return file.type.startsWith(type.slice(0, -1));\n }\n return file.type.toLowerCase() === type;\n }),\n );\n if (validFiles.length !== files.length) {\n return {\n files: validFiles,\n error: 'One or more files are not an accepted type.',\n };\n }\n }\n if (options.maxSize != null) {\n const maxSize = options.maxSize;\n const oversized = validFiles.find(file => file.size > maxSize);\n if (oversized != null) {\n return {\n error: `\"${oversized.name}\" exceeds ${formatFileSize(maxSize)}.`,\n files: validFiles.filter(file => file.size <= maxSize),\n };\n }\n }\n if (\n options.isMultiple &&\n options.maxFiles != null &&\n validFiles.length > options.maxFiles\n ) {\n return {\n files: validFiles.slice(0, options.maxFiles),\n error: `Maximum ${options.maxFiles} files allowed.`,\n };\n }\n return {files: validFiles, error: null};\n}\n\nfunction getFileNames(value: File | File[] | null): string | null {\n if (value == null) {\n return null;\n }\n if (Array.isArray(value)) {\n return value.length === 0 ? null : value.map(file => file.name).join(', ');\n }\n return value.name;\n}\n\n/**\n * A file input supporting both inline and drag-and-drop dropzone modes.\n */\nexport function FileInput({\n label,\n value,\n onChange,\n accept,\n isMultiple = false,\n maxSize,\n maxFiles,\n mode = 'input',\n placeholder,\n description,\n isLabelHidden = false,\n isOptional,\n isRequired,\n isDisabled = false,\n isLoading = false,\n size = 'md',\n status: statusFromProps,\n labelIcon,\n labelTooltip,\n className,\n 'data-testid': dataTestId,\n style,\n ref,\n}: FileInputProps): React.JSX.Element {\n const inputId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const [isDragOver, setIsDragOver] = useState(false);\n const [validationError, setValidationError] = useState<string | null>(null);\n // A validation error from the user's most recent selection is immediate,\n // actionable feedback about what they just tried to do (wrong type, too\n // large, too many), so it takes precedence over a consumer-provided `status`\n // such as a form-level \"required\". Once there is no validation error (a valid\n // selection or a cleared field), the external status surfaces again.\n const status =\n validationError == null\n ? statusFromProps\n : {type: 'error' as const, message: validationError};\n const descriptionID = isReactNode(description)\n ? `${inputId}-description`\n : undefined;\n const statusMessageID = getStatusMessageID(inputId, status);\n const describedBy = getDescribedBy(descriptionID, statusMessageID);\n const fileNames = getFileNames(value);\n const displayText =\n fileNames ?? placeholder ?? (isMultiple ? 'Choose files' : 'Choose file');\n const isDropzone = mode === 'dropzone';\n const classes = fileInputRecipe({\n mode,\n size,\n status: status?.type,\n isDisabled,\n isDragOver,\n });\n\n const handleFiles = (files: File[]) => {\n if (isDisabled) {\n return;\n }\n const result = validateFiles(files, {\n accept,\n isMultiple,\n maxFiles,\n maxSize,\n });\n setValidationError(result.error);\n if (isMultiple) {\n (onChange as (files: File[]) => void)(result.files);\n } else if (result.files.length === 0) {\n (onChange as (file: File | null) => void)(null);\n } else {\n (onChange as (file: File | null) => void)(result.files[0]);\n }\n };\n\n const handleClear = () => {\n setValidationError(null);\n if (isMultiple) {\n (onChange as (files: File[]) => void)([]);\n } else {\n (onChange as (file: File | null) => void)(null);\n }\n };\n\n const openFilePicker = () => {\n if (!isDisabled) {\n inputRef.current?.click();\n }\n };\n\n const dragProps = isDropzone\n ? {\n onDragEnter: (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (!isDisabled) {\n setIsDragOver(true);\n }\n },\n onDragLeave: (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragOver(false);\n },\n onDragOver: (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (!isDisabled) {\n setIsDragOver(true);\n }\n },\n onDrop: (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n setIsDragOver(false);\n if (!isDisabled) {\n handleFiles(Array.from(event.dataTransfer.files));\n }\n },\n }\n : {};\n\n const necessity = getNecessity(isOptional, isRequired);\n\n return (\n <Field\n description={description}\n descriptionID={descriptionID}\n inputId={inputId}\n isDisabled={isDisabled}\n isLabelHidden={isLabelHidden}\n {...necessity}\n label={label}\n labelIcon={labelIcon}\n labelTooltip={labelTooltip}\n status={\n status == null ? undefined : {...status, messageID: statusMessageID}\n }>\n {/*\n The visually-hidden <input> is the real, focusable, labeled control\n (the Field label targets it via htmlFor), so it owns the accessible\n name, description, focus, and keyboard activation. The surface is only\n a presentational mouse/drop target — it intentionally has no role or\n keyboard handler, because that would create a redundant second control\n with the same name. Hence the scoped a11y disables below.\n */}\n {/* eslint-disable jsx-a11y-x/no-static-element-interactions, jsx-a11y-x/click-events-have-key-events */}\n <div\n aria-busy={isLoading || undefined}\n className={cx(classes.surface, className)}\n onClick={openFilePicker}\n style={style}\n {...dragProps}>\n <VisuallyHidden>\n <input\n accept={accept}\n aria-describedby={describedBy}\n aria-invalid={status?.type === 'error' || undefined}\n data-testid={dataTestId}\n disabled={isDisabled}\n id={inputId}\n multiple={isMultiple}\n onChange={event => {\n handleFiles(Array.from(event.target.files ?? []));\n event.currentTarget.value = '';\n }}\n ref={mergeRefs(ref, inputRef)}\n required={isRequired}\n type=\"file\"\n />\n </VisuallyHidden>\n {isLoading ? (\n <Spinner size={isDropzone ? 'md' : 'sm'} />\n ) : (\n <span className={classes.icon}>\n <Icon icon={Upload} size={isDropzone ? 'md' : 'sm'} />\n </span>\n )}\n <Text\n as=\"span\"\n className={classes.fileName}\n color={fileNames == null ? 'secondary' : 'primary'}>\n {isDragOver ? 'Drop files here' : displayText}\n </Text>\n {fileNames != null && !isDisabled && !isLoading ? (\n <Button\n icon={X}\n isIconOnly\n label={`Clear ${label}`}\n onClick={event => {\n event.stopPropagation();\n handleClear();\n }}\n size=\"sm\"\n variant=\"ghost\"\n />\n ) : null}\n {status != null && !isDropzone ? (\n <span className={classes.icon}>{getStatusIcon(status.type)}</span>\n ) : null}\n </div>\n {/* eslint-enable jsx-a11y-x/no-static-element-interactions, jsx-a11y-x/click-events-have-key-events */}\n </Field>\n );\n}\n\nFileInput.displayName = 'FileInput';\n"]}
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunk7275FFQA_cjs = require('./chunk-7275FFQA.cjs');
4
+ var chunk5P5OSQT2_cjs = require('./chunk-5P5OSQT2.cjs');
5
5
  var chunkLIDE7FVO_cjs = require('./chunk-LIDE7FVO.cjs');
6
- var chunkS5FJ3FHH_cjs = require('./chunk-S5FJ3FHH.cjs');
6
+ var chunkHW7GODZJ_cjs = require('./chunk-HW7GODZJ.cjs');
7
7
  var lucideReact = require('lucide-react');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
 
@@ -39,7 +39,7 @@ function SplitButton({
39
39
  style,
40
40
  children: [
41
41
  /* @__PURE__ */ jsxRuntime.jsx(
42
- chunkS5FJ3FHH_cjs.Button,
42
+ chunkHW7GODZJ_cjs.Button,
43
43
  {
44
44
  "data-testid": dataTestId,
45
45
  endContent,
@@ -53,7 +53,7 @@ function SplitButton({
53
53
  }
54
54
  ),
55
55
  /* @__PURE__ */ jsxRuntime.jsx(
56
- chunk7275FFQA_cjs.DropdownMenu,
56
+ chunk5P5OSQT2_cjs.DropdownMenu,
57
57
  {
58
58
  button: {
59
59
  icon: lucideReact.ChevronDown,
@@ -77,5 +77,5 @@ function SplitButton({
77
77
  SplitButton.displayName = "SplitButton";
78
78
 
79
79
  exports.SplitButton = SplitButton;
80
- //# sourceMappingURL=chunk-B333LIQQ.cjs.map
81
- //# sourceMappingURL=chunk-B333LIQQ.cjs.map
80
+ //# sourceMappingURL=chunk-6I7MYAPX.cjs.map
81
+ //# sourceMappingURL=chunk-6I7MYAPX.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/SplitButton/SplitButton.tsx"],"names":["jsxs","ButtonGroup","jsx","Button","DropdownMenu","ChevronDown"],"mappings":";;;;;;;;AA6FO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA,EAAe,UAAA;AAAA,EACf,UAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,SAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA,GAAY,cAAA;AAAA,EACZ,SAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,YAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAAwC;AACtC,EAAA,uBACEA,eAAA;AAAA,IAACC,6BAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAACC,wBAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAa,UAAA;AAAA,YACb,UAAA;AAAA,YACA,IAAA;AAAA,YACA,SAAA;AAAA,YACA,KAAA;AAAA,YACA,OAAA;AAAA,YACA,GAAA;AAAA,YACA,YAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,wBACAD,cAAA;AAAA,UAACE,8BAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ;AAAA,cACN,IAAA,EAAMC,uBAAA;AAAA,cACN,UAAA,EAAY,IAAA;AAAA,cACZ,KAAA,EAAO,SAAA;AAAA,cACP;AAAA,aACF;AAAA,YACA,YAAA;AAAA,YACA,UAAA,EAAY,KAAA;AAAA,YACZ,UAAA;AAAA,YACA,KAAA;AAAA,YACA,SAAA;AAAA,YACA,YAAA;AAAA,YACC;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-B333LIQQ.cjs","sourcesContent":["'use client';\n\nimport {ChevronDown} from 'lucide-react';\nimport type {CSSProperties, ReactNode, Ref} from 'react';\nimport {Button, type ButtonProps, type ButtonSize} from 'components/Button';\nimport {ButtonGroup} from 'components/ButtonGroup';\nimport {DropdownMenu, type DropdownMenuOption} from 'components/DropdownMenu';\nimport type {IconComponent} from 'components/Icon';\n\n/**\n * A directly-clickable primary action paired with an attached chevron toggle\n * that opens a menu of related actions. A thin composition of `ButtonGroup`,\n * `Button`, and `DropdownMenu`.\n */\nexport interface SplitButtonProps extends Pick<\n ButtonProps,\n 'endContent' | 'isLoading' | 'onClick' | 'startContent'\n> {\n /**\n * Compound menu content (`<DropdownMenuItem>`), an alternative to `items`.\n */\n children?: ReactNode;\n /**\n * Additional CSS class names applied to the root element.\n */\n className?: string;\n /**\n * Test ID applied to the primary action button.\n */\n 'data-testid'?: string;\n /**\n * Whether to auto-focus the first menu item on open.\n * @default true\n */\n hasAutoFocus?: boolean;\n /**\n * Icon rendered before the primary action's label.\n */\n icon?: IconComponent;\n /**\n * Whether both the primary action and the menu toggle are disabled.\n */\n isDisabled?: boolean;\n /**\n * Controlled open state of the menu.\n */\n isMenuOpen?: boolean;\n /**\n * Data-driven menu items (alternative to `children`).\n */\n items?: ReadonlyArray<DropdownMenuOption>;\n /**\n * Visible text for the primary action. Also used as the group's accessible\n * label.\n */\n label: string;\n /**\n * Accessible label for the chevron toggle that opens the menu.\n * @default 'More actions'\n */\n menuLabel?: string;\n /**\n * Width of the menu surface.\n */\n menuWidth?: number | string;\n /**\n * Called when the menu open state changes.\n */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Ref forwarded to the primary action button.\n */\n ref?: Ref<HTMLElement>;\n /**\n * Default size for both buttons.\n * @default 'md'\n */\n size?: ButtonSize;\n /**\n * Inline styles applied to the root element.\n */\n style?: CSSProperties;\n /**\n * Visual style variant shared by both buttons.\n * @default 'secondary'\n */\n variant?: ButtonProps['variant'];\n}\n\n/**\n * A directly-clickable primary action paired with an attached chevron toggle\n * that opens a menu of related actions.\n */\nexport function SplitButton({\n children,\n className,\n 'data-testid': dataTestId,\n endContent,\n hasAutoFocus,\n icon,\n isDisabled = false,\n isLoading,\n isMenuOpen,\n items,\n label,\n menuLabel = 'More actions',\n menuWidth,\n onClick,\n onOpenChange,\n ref,\n size = 'md',\n startContent,\n style,\n variant = 'secondary',\n}: SplitButtonProps): React.JSX.Element {\n return (\n <ButtonGroup\n className={className}\n isDisabled={isDisabled}\n label={label}\n size={size}\n style={style}>\n <Button\n data-testid={dataTestId}\n endContent={endContent}\n icon={icon}\n isLoading={isLoading}\n label={label}\n onClick={onClick}\n ref={ref}\n startContent={startContent}\n variant={variant}\n />\n <DropdownMenu\n button={{\n icon: ChevronDown,\n isIconOnly: true,\n label: menuLabel,\n variant,\n }}\n hasAutoFocus={hasAutoFocus}\n hasChevron={false}\n isMenuOpen={isMenuOpen}\n items={items}\n menuWidth={menuWidth}\n onOpenChange={onOpenChange}>\n {children}\n </DropdownMenu>\n </ButtonGroup>\n );\n}\n\nSplitButton.displayName = 'SplitButton';\n"]}
1
+ {"version":3,"sources":["../src/components/SplitButton/SplitButton.tsx"],"names":["jsxs","ButtonGroup","jsx","Button","DropdownMenu","ChevronDown"],"mappings":";;;;;;;;AA6FO,SAAS,WAAA,CAAY;AAAA,EAC1B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA,EAAe,UAAA;AAAA,EACf,UAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,SAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA,GAAY,cAAA;AAAA,EACZ,SAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,YAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA,GAAU;AACZ,CAAA,EAAwC;AACtC,EAAA,uBACEA,eAAA;AAAA,IAACC,6BAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAACC,wBAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAa,UAAA;AAAA,YACb,UAAA;AAAA,YACA,IAAA;AAAA,YACA,SAAA;AAAA,YACA,KAAA;AAAA,YACA,OAAA;AAAA,YACA,GAAA;AAAA,YACA,YAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,wBACAD,cAAA;AAAA,UAACE,8BAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ;AAAA,cACN,IAAA,EAAMC,uBAAA;AAAA,cACN,UAAA,EAAY,IAAA;AAAA,cACZ,KAAA,EAAO,SAAA;AAAA,cACP;AAAA,aACF;AAAA,YACA,YAAA;AAAA,YACA,UAAA,EAAY,KAAA;AAAA,YACZ,UAAA;AAAA,YACA,KAAA;AAAA,YACA,SAAA;AAAA,YACA,YAAA;AAAA,YACC;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-6I7MYAPX.cjs","sourcesContent":["'use client';\n\nimport {ChevronDown} from 'lucide-react';\nimport type {CSSProperties, ReactNode, Ref} from 'react';\nimport {Button, type ButtonProps, type ButtonSize} from 'components/Button';\nimport {ButtonGroup} from 'components/ButtonGroup';\nimport {DropdownMenu, type DropdownMenuOption} from 'components/DropdownMenu';\nimport type {IconComponent} from 'components/Icon';\n\n/**\n * A directly-clickable primary action paired with an attached chevron toggle\n * that opens a menu of related actions. A thin composition of `ButtonGroup`,\n * `Button`, and `DropdownMenu`.\n */\nexport interface SplitButtonProps extends Pick<\n ButtonProps,\n 'endContent' | 'isLoading' | 'onClick' | 'startContent'\n> {\n /**\n * Compound menu content (`<DropdownMenuItem>`), an alternative to `items`.\n */\n children?: ReactNode;\n /**\n * Additional CSS class names applied to the root element.\n */\n className?: string;\n /**\n * Test ID applied to the primary action button.\n */\n 'data-testid'?: string;\n /**\n * Whether to auto-focus the first menu item on open.\n * @default true\n */\n hasAutoFocus?: boolean;\n /**\n * Icon rendered before the primary action's label.\n */\n icon?: IconComponent;\n /**\n * Whether both the primary action and the menu toggle are disabled.\n */\n isDisabled?: boolean;\n /**\n * Controlled open state of the menu.\n */\n isMenuOpen?: boolean;\n /**\n * Data-driven menu items (alternative to `children`).\n */\n items?: ReadonlyArray<DropdownMenuOption>;\n /**\n * Visible text for the primary action. Also used as the group's accessible\n * label.\n */\n label: string;\n /**\n * Accessible label for the chevron toggle that opens the menu.\n * @default 'More actions'\n */\n menuLabel?: string;\n /**\n * Width of the menu surface.\n */\n menuWidth?: number | string;\n /**\n * Called when the menu open state changes.\n */\n onOpenChange?: (isOpen: boolean) => void;\n /**\n * Ref forwarded to the primary action button.\n */\n ref?: Ref<HTMLElement>;\n /**\n * Default size for both buttons.\n * @default 'md'\n */\n size?: ButtonSize;\n /**\n * Inline styles applied to the root element.\n */\n style?: CSSProperties;\n /**\n * Visual style variant shared by both buttons.\n * @default 'secondary'\n */\n variant?: ButtonProps['variant'];\n}\n\n/**\n * A directly-clickable primary action paired with an attached chevron toggle\n * that opens a menu of related actions.\n */\nexport function SplitButton({\n children,\n className,\n 'data-testid': dataTestId,\n endContent,\n hasAutoFocus,\n icon,\n isDisabled = false,\n isLoading,\n isMenuOpen,\n items,\n label,\n menuLabel = 'More actions',\n menuWidth,\n onClick,\n onOpenChange,\n ref,\n size = 'md',\n startContent,\n style,\n variant = 'secondary',\n}: SplitButtonProps): React.JSX.Element {\n return (\n <ButtonGroup\n className={className}\n isDisabled={isDisabled}\n label={label}\n size={size}\n style={style}>\n <Button\n data-testid={dataTestId}\n endContent={endContent}\n icon={icon}\n isLoading={isLoading}\n label={label}\n onClick={onClick}\n ref={ref}\n startContent={startContent}\n variant={variant}\n />\n <DropdownMenu\n button={{\n icon: ChevronDown,\n isIconOnly: true,\n label: menuLabel,\n variant,\n }}\n hasAutoFocus={hasAutoFocus}\n hasChevron={false}\n isMenuOpen={isMenuOpen}\n items={items}\n menuWidth={menuWidth}\n onOpenChange={onOpenChange}>\n {children}\n </DropdownMenu>\n </ButtonGroup>\n );\n}\n\nSplitButton.displayName = 'SplitButton';\n"]}