@blueshift-gg/ui-components 0.1.6 → 0.1.8

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 (196) hide show
  1. package/dist/Alert.d.mts +1 -1
  2. package/dist/Alert.d.ts +1 -1
  3. package/dist/Avatar.d.mts +5 -5
  4. package/dist/Avatar.d.ts +5 -5
  5. package/dist/Avatar.js +18 -12
  6. package/dist/Avatar.js.map +1 -1
  7. package/dist/Avatar.mjs +18 -12
  8. package/dist/Avatar.mjs.map +1 -1
  9. package/dist/Badge.d.mts +1 -1
  10. package/dist/Badge.d.ts +1 -1
  11. package/dist/Button.d.mts +4 -2
  12. package/dist/Button.d.ts +4 -2
  13. package/dist/Button.js +9 -3
  14. package/dist/Button.js.map +1 -1
  15. package/dist/Button.mjs +9 -3
  16. package/dist/Button.mjs.map +1 -1
  17. package/dist/DecryptText.js +0 -18
  18. package/dist/DecryptText.js.map +1 -1
  19. package/dist/DecryptText.mjs +0 -18
  20. package/dist/DecryptText.mjs.map +1 -1
  21. package/dist/Dropdown.d.mts +18 -17
  22. package/dist/Dropdown.d.ts +18 -17
  23. package/dist/Dropdown.js +246 -31
  24. package/dist/Dropdown.js.map +1 -1
  25. package/dist/Dropdown.mjs +246 -31
  26. package/dist/Dropdown.mjs.map +1 -1
  27. package/dist/{Icon-CTxwWbdC.d.mts → Icon-BlNfHVtM.d.mts} +3 -0
  28. package/dist/{Icon-llWd6yMa.d.ts → Icon-CyRhTGIG.d.ts} +3 -0
  29. package/dist/Icon.d.mts +1 -1
  30. package/dist/Icon.d.ts +1 -1
  31. package/dist/Input.d.mts +1 -1
  32. package/dist/Input.d.ts +1 -1
  33. package/dist/Slider.d.mts +1 -1
  34. package/dist/Slider.d.ts +1 -1
  35. package/dist/Tabs.d.mts +1 -1
  36. package/dist/Tabs.d.ts +1 -1
  37. package/dist/Toast.d.mts +1 -1
  38. package/dist/Toast.d.ts +1 -1
  39. package/dist/icons/Anchor.d.mts +1 -1
  40. package/dist/icons/Anchor.d.ts +1 -1
  41. package/dist/icons/ArrowLeft.d.mts +1 -1
  42. package/dist/icons/ArrowLeft.d.ts +1 -1
  43. package/dist/icons/ArrowRight.d.mts +1 -1
  44. package/dist/icons/ArrowRight.d.ts +1 -1
  45. package/dist/icons/Assembly.d.mts +1 -1
  46. package/dist/icons/Assembly.d.ts +1 -1
  47. package/dist/icons/Brave.d.mts +7 -0
  48. package/dist/icons/Brave.d.ts +7 -0
  49. package/dist/icons/Brave.js +60 -0
  50. package/dist/icons/Brave.js.map +1 -0
  51. package/dist/icons/Brave.mjs +58 -0
  52. package/dist/icons/Brave.mjs.map +1 -0
  53. package/dist/icons/Challenge.d.mts +1 -1
  54. package/dist/icons/Challenge.d.ts +1 -1
  55. package/dist/icons/Chevron.d.mts +1 -1
  56. package/dist/icons/Chevron.d.ts +1 -1
  57. package/dist/icons/ChevronLeft.d.mts +1 -1
  58. package/dist/icons/ChevronLeft.d.ts +1 -1
  59. package/dist/icons/ChevronRight.d.mts +1 -1
  60. package/dist/icons/ChevronRight.d.ts +1 -1
  61. package/dist/icons/Claim.d.mts +1 -1
  62. package/dist/icons/Claim.d.ts +1 -1
  63. package/dist/icons/Claimed.d.mts +1 -1
  64. package/dist/icons/Claimed.d.ts +1 -1
  65. package/dist/icons/Close.d.mts +1 -1
  66. package/dist/icons/Close.d.ts +1 -1
  67. package/dist/icons/Code.d.mts +1 -1
  68. package/dist/icons/Code.d.ts +1 -1
  69. package/dist/icons/Copy.d.mts +1 -1
  70. package/dist/icons/Copy.d.ts +1 -1
  71. package/dist/icons/Developer.d.mts +1 -1
  72. package/dist/icons/Developer.d.ts +1 -1
  73. package/dist/icons/Difficulty.d.mts +1 -1
  74. package/dist/icons/Difficulty.d.ts +1 -1
  75. package/dist/icons/Discord.d.mts +1 -1
  76. package/dist/icons/Discord.d.ts +1 -1
  77. package/dist/icons/Dollar.d.mts +1 -1
  78. package/dist/icons/Dollar.d.ts +1 -1
  79. package/dist/icons/DoubleArrow.d.mts +1 -1
  80. package/dist/icons/DoubleArrow.d.ts +1 -1
  81. package/dist/icons/EVM.d.mts +1 -1
  82. package/dist/icons/EVM.d.ts +1 -1
  83. package/dist/icons/Email.d.mts +1 -1
  84. package/dist/icons/Email.d.ts +1 -1
  85. package/dist/icons/Error.d.mts +1 -1
  86. package/dist/icons/Error.d.ts +1 -1
  87. package/dist/icons/External.d.mts +1 -1
  88. package/dist/icons/External.d.ts +1 -1
  89. package/dist/icons/Filter.d.mts +1 -1
  90. package/dist/icons/Filter.d.ts +1 -1
  91. package/dist/icons/Firmware.d.mts +1 -1
  92. package/dist/icons/Firmware.d.ts +1 -1
  93. package/dist/icons/Flag.d.mts +1 -1
  94. package/dist/icons/Flag.d.ts +1 -1
  95. package/dist/icons/Flame.d.mts +1 -1
  96. package/dist/icons/Flame.d.ts +1 -1
  97. package/dist/icons/Flexible.d.mts +1 -1
  98. package/dist/icons/Flexible.d.ts +1 -1
  99. package/dist/icons/Free.d.mts +1 -1
  100. package/dist/icons/Free.d.ts +1 -1
  101. package/dist/icons/General.d.mts +1 -1
  102. package/dist/icons/General.d.ts +1 -1
  103. package/dist/icons/Github.d.mts +1 -1
  104. package/dist/icons/Github.d.ts +1 -1
  105. package/dist/icons/GridView.d.mts +1 -1
  106. package/dist/icons/GridView.d.ts +1 -1
  107. package/dist/icons/Heart.d.mts +1 -1
  108. package/dist/icons/Heart.d.ts +1 -1
  109. package/dist/icons/Info.d.mts +1 -1
  110. package/dist/icons/Info.d.ts +1 -1
  111. package/dist/icons/Language.d.mts +1 -1
  112. package/dist/icons/Language.d.ts +1 -1
  113. package/dist/icons/Lessons.d.mts +1 -1
  114. package/dist/icons/Lessons.d.ts +1 -1
  115. package/dist/icons/Link.d.mts +1 -1
  116. package/dist/icons/Link.d.ts +1 -1
  117. package/dist/icons/ListView.d.mts +1 -1
  118. package/dist/icons/ListView.d.ts +1 -1
  119. package/dist/icons/Loading.d.mts +1 -1
  120. package/dist/icons/Loading.d.ts +1 -1
  121. package/dist/icons/Locked.d.mts +1 -1
  122. package/dist/icons/Locked.d.ts +1 -1
  123. package/dist/icons/Mentor.d.mts +1 -1
  124. package/dist/icons/Mentor.d.ts +1 -1
  125. package/dist/icons/Modular.d.mts +1 -1
  126. package/dist/icons/Modular.d.ts +1 -1
  127. package/dist/icons/NFT.d.mts +1 -1
  128. package/dist/icons/NFT.d.ts +1 -1
  129. package/dist/icons/Online.d.mts +1 -1
  130. package/dist/icons/Online.d.ts +1 -1
  131. package/dist/icons/Password.d.mts +1 -1
  132. package/dist/icons/Password.d.ts +1 -1
  133. package/dist/icons/Phantom.d.mts +7 -0
  134. package/dist/icons/Phantom.d.ts +7 -0
  135. package/dist/icons/Phantom.js +28 -0
  136. package/dist/icons/Phantom.js.map +1 -0
  137. package/dist/icons/Phantom.mjs +26 -0
  138. package/dist/icons/Phantom.mjs.map +1 -0
  139. package/dist/icons/Product.d.mts +1 -1
  140. package/dist/icons/Product.d.ts +1 -1
  141. package/dist/icons/Progress.d.mts +1 -1
  142. package/dist/icons/Progress.d.ts +1 -1
  143. package/dist/icons/Protocol.d.mts +1 -1
  144. package/dist/icons/Protocol.d.ts +1 -1
  145. package/dist/icons/Rewards.d.mts +1 -1
  146. package/dist/icons/Rewards.d.ts +1 -1
  147. package/dist/icons/Rust.d.mts +1 -1
  148. package/dist/icons/Rust.d.ts +1 -1
  149. package/dist/icons/Search.d.mts +1 -1
  150. package/dist/icons/Search.d.ts +1 -1
  151. package/dist/icons/SmartContract.d.mts +1 -1
  152. package/dist/icons/SmartContract.d.ts +1 -1
  153. package/dist/icons/Solana.d.mts +1 -1
  154. package/dist/icons/Solana.d.ts +1 -1
  155. package/dist/icons/Solflare.d.mts +7 -0
  156. package/dist/icons/Solflare.d.ts +7 -0
  157. package/dist/icons/Solflare.js +28 -0
  158. package/dist/icons/Solflare.js.map +1 -0
  159. package/dist/icons/Solflare.mjs +26 -0
  160. package/dist/icons/Solflare.mjs.map +1 -0
  161. package/dist/icons/Success.d.mts +1 -1
  162. package/dist/icons/Success.d.ts +1 -1
  163. package/dist/icons/SuccessCircle.d.mts +1 -1
  164. package/dist/icons/SuccessCircle.d.ts +1 -1
  165. package/dist/icons/Table.d.mts +1 -1
  166. package/dist/icons/Table.d.ts +1 -1
  167. package/dist/icons/Target.d.mts +1 -1
  168. package/dist/icons/Target.d.ts +1 -1
  169. package/dist/icons/Training.d.mts +1 -1
  170. package/dist/icons/Training.d.ts +1 -1
  171. package/dist/icons/Typescript.d.mts +1 -1
  172. package/dist/icons/Typescript.d.ts +1 -1
  173. package/dist/icons/Unclaimed.d.mts +1 -1
  174. package/dist/icons/Unclaimed.d.ts +1 -1
  175. package/dist/icons/Upload.d.mts +1 -1
  176. package/dist/icons/Upload.d.ts +1 -1
  177. package/dist/icons/Wallet.d.mts +1 -1
  178. package/dist/icons/Wallet.d.ts +1 -1
  179. package/dist/icons/WalletSmall.d.mts +1 -1
  180. package/dist/icons/WalletSmall.d.ts +1 -1
  181. package/dist/icons/Warning.d.mts +1 -1
  182. package/dist/icons/Warning.d.ts +1 -1
  183. package/dist/icons/X.d.mts +1 -1
  184. package/dist/icons/X.d.ts +1 -1
  185. package/dist/icons/index.d.mts +1 -1
  186. package/dist/icons/index.d.ts +1 -1
  187. package/dist/icons/index.js +7 -1
  188. package/dist/icons/index.js.map +1 -1
  189. package/dist/icons/index.mjs +7 -1
  190. package/dist/icons/index.mjs.map +1 -1
  191. package/dist/index.d.mts +4 -2
  192. package/dist/index.d.ts +4 -2
  193. package/dist/index.js +15 -0
  194. package/dist/index.mjs +3 -0
  195. package/package.json +1 -1
  196. package/src/theme.css +10 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Dropdown.tsx"],"names":["useState","useRef","useCallback","useEffect","jsx","AnimatePresence","motion","swift","classNames","jsxs","Checkbox","Divider","useOnClickOutside","Button","CrosshairCorners","Icon"],"mappings":";;;;;;;;;;;;;;;;;;AAgFO,MAAM,eAAe,CAAC;AAAA,EAC3B,KAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,aAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,MAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,eAAA,GAAkB,UAAA;AAAA,EAClB,MAAA;AAAA,EACA;AACF,CAAA,KAAyB;AACvB,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,kBAAA,GAAqBC,aAAuB,IAAI,CAAA;AAGtD,EAAA,MAAM,iBAAiB,MAAM;AAE3B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,KAAA,CAAM,MAAA;AAAA,QAAO,CAAC,SACnB,IAAA,CAAK,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa;AAAA,OACxD;AAAA,IACF;AAGA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,GAAG;AAGH,EAAA,MAAM,YAAA,GAAeC,kBAAY,MAAM;AACrC,IAAA,MAAM,YAAY,kBAAA,CAAmB,OAAA;AACrC,IAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,IAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAc,YAAA,EAAa,GAAI,SAAA;AAClD,IAAA,MAAM,SAAA,GAAY,CAAA;AAClB,IAAA,MAAM,YAAA,GAAe,SAAA,GAAY,YAAA,IAAgB,YAAA,GAAe,SAAA;AAEhE,IAAA,aAAA,CAAc,YAAY,CAAA;AAAA,EAC5B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAA,CAAc,MAAM,CAAC,CAAA;AAGjC,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,YAAY,kBAAA,CAAmB,OAAA;AACrC,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,EAAQ;AAE3B,IAAA,MAAM,EAAE,YAAA,EAAc,YAAA,EAAa,GAAI,SAAA;AACvC,IAAA,MAAM,eAAe,YAAA,GAAe,YAAA;AAGpC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAA,CAAc,MAAM,CAAC,CAAA;AAGjC,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAAkB;AACxC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OACE,KAAA,CAAM,QAAQ,YAAY,CAAA,IAC1B,aAAa,MAAA,GAAS,CAAA,IACtB,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA;AAAA,IAE/B;AACA,IAAA,OAAO,CAAC,CAAC,YAAA,IAAgB,YAAA,KAAiB,KAAA;AAAA,EAC5C,CAAA;AAGA,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAkB;AACzC,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,mBAAmB,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,eAAe,EAAC;AAGvE,MAAA,IAAI,eAAc,EAAG;AACnB,QAAA,YAAA,CAAa,CAAC,KAAK,CAAC,CAAA;AAAA,MACtB,CAAA,MAAA,IAAW,gBAAA,CAAiB,QAAA,CAAS,KAAK,CAAA,EAAG;AAE3C,QAAA,YAAA,CAAa,iBAAiB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,KAAS,KAAK,CAAC,CAAA;AAAA,MAChE,CAAA,MAAO;AAEL,QAAA,YAAA,CAAa,CAAC,GAAG,gBAAA,EAAkB,KAAK,CAAC,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,YAAA,CAAa,MAAS,CAAA;AAAA,MACxB,CAAA,MAAO;AAEL,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AAEA,MAAA,WAAA,GAAc,KAAK,CAAA;AAAA,IACrB;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,MAAM,mBAAmB,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,eAAe,EAAC;AACvE,IAAA,MAAM,SAAA,GAAY,aAAA,CACf,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,QAAQ,CAAA,CAC/B,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,KAAK,CAAA;AAE3B,IAAA,IAAI,gBAAA,CAAiB,MAAA,KAAW,SAAA,CAAU,MAAA,EAAQ;AAEhD,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,IACjB,CAAA,MAAO;AAEL,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,gBAAgB,MAAM;AAC1B,IAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,YAAY,KAAK,YAAA,CAAa,MAAA,KAAW,GAAG,OAAO,KAAA;AACtE,IAAA,MAAM,kBAAkB,aAAA,CAAc,MAAA,CAAO,CAAC,IAAA,KAAS,CAAC,KAAK,QAAQ,CAAA;AACrE,IAAA,OACE,eAAA,CAAgB,MAAA,GAAS,CAAA,IACzB,YAAA,CAAa,WAAW,eAAA,CAAgB,MAAA,IACxC,eAAA,CAAgB,KAAA,CAAM,CAAC,IAAA,KAAS,YAAA,CAAa,QAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,EAErE,CAAA;AAEA,EAAA,uBACEC,cAAA,CAACC,2BACE,QAAA,EAAA,MAAA,oBACCD,cAAA;AAAA,IAACE,cAAA,CAAO,GAAA;AAAA,IAAP;AAAA,MACC,SAAS,EAAE,OAAA,EAAS,GAAG,KAAA,EAAO,GAAA,EAAK,GAAG,GAAA,EAAI;AAAA,MAC1C,SAAS,EAAE,OAAA,EAAS,GAAG,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA,EAAE;AAAA,MACtC,UAAA,EAAY,EAAE,QAAA,EAAU,GAAA,EAAK,MAAMC,aAAA,EAAM;AAAA,MACzC,MAAM,EAAE,OAAA,EAAS,GAAG,KAAA,EAAO,GAAA,EAAK,GAAG,EAAA,EAAG;AAAA,MACtC,SAAA,EAAWC,2BAAA;AAAA,QACT,4FAAA;AAAA,QAAA,CACC,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,IAAA,KAAS,eAAA;AAAA,QACpC,oBAAoB,UAAA,IAAc,iBAAA;AAAA,QAClC,oBAAoB,YAAA,IAAgB,mBAAA;AAAA,QACpC,oBAAoB,WAAA,IAAe,kBAAA;AAAA,QACnC;AAAA,OACF;AAAA,MAEA,QAAA,kBAAAC,eAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,kBAAA;AAAA,UACL,QAAA,EAAU,YAAA;AAAA,UACV,SAAA,EAAWD,2BAAA;AAAA,YACT,uBAAA;AAAA,YACA,YAAA,IAAgB;AAAA,cACd,+BAAA;AAAA,cACA,CAAC,UAAA,IACC;AAAA;AACJ,WACF;AAAA,UAEC,QAAA,EAAA;AAAA,YAAA,QAAA,oBACCC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,8BAAAA,eAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAS,eAAA;AAAA,kBACT,SAAA,EAAWD,2BAAA;AAAA,oBACT;AAAA,mBACF;AAAA,kBAEA,QAAA,EAAA;AAAA,oCAAAJ,cAAA,CAACM,iBAAA,EAAA,EAAS,OAAA,EAAS,aAAA,EAAc,EAAG,CAAA;AAAA,oCACpCN,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAAyC,QAAA,EAAA,YAAA,EAEzD;AAAA;AAAA;AAAA,eACF;AAAA,8BACAA,cAAA,CAACO,eAAA,EAAA,EAAQ,SAAA,EAAU,YAAA,EAAa;AAAA,aAAA,EAClC,CAAA;AAAA,YAED,cAAc,MAAA,GAAS,CAAA,GACtB,aAAA,CAAc,GAAA,CAAI,CAAC,IAAA,qBACjBP,cAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBAEC,OAAO,IAAA,CAAK,KAAA;AAAA,gBACZ,IAAA,EACE,IAAA,CAAK,IAAA,EAAM,IAAA,GACP;AAAA,kBACE,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA;AAAA,kBAChB,SAAA,EAAW,KAAK,IAAA,CAAK,SAAA;AAAA,kBACrB,IAAA,EAAM,KAAK,IAAA,CAAK,IAAA;AAAA,kBAChB,YAAA,EAAc,KAAK,IAAA,CAAK;AAAA,iBAC1B,GACA,MAAA;AAAA,gBAEN,OAAA,EAAS,MAAM,eAAA,CAAgB,IAAA,CAAK,KAAK,CAAA;AAAA,gBACzC,UAAU,IAAA,CAAK,QAAA;AAAA,gBACf,UAAA,EAAY,cAAA,CAAe,IAAA,CAAK,KAAK,CAAA;AAAA,gBACrC;AAAA,eAAA;AAAA,cAfK,IAAA,CAAK;AAAA,aAiBb,CAAA,mBAEDA,cAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,SAAS,MAAM;AAEb,kBAAA,IAAI,aAAA,EAAe;AACjB,oBAAA,aAAA,EAAc;AAAA,kBAChB;AAAA,gBACF,CAAA;AAAA,gBACA,SAAA,EAAU,8IAAA;AAAA,gBACX,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA;AAEJ;AAAA,GACF,EAEJ,CAAA;AAEJ;AAEO,MAAM,WAAW,CAAC;AAAA,EACvB,SAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA,GAAQ,UAAA;AAAA,EACR,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,QAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,YAAA,GAAe,KAAA;AAAA,EACf,MAAA;AAAA,EACA;AACF,CAAA,KAAqB;AACnB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIJ,eAAS,KAAK,CAAA;AAG1C,EAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAkB;AACzC,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,YAAA,CAAa,MAAS,CAAA;AAAA,MACxB,CAAA,MAAO;AAEL,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,GAAA,GAAMC,aAAuB,IAAI,CAAA;AAEvC,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,SAAA,CAAU,KAAK,CAAA;AAAA,EACjB,CAAA;AAGA,EAAAW,4BAAA,CAAkB,KAAqC,kBAAkB,CAAA;AAGzE,EAAA,MAAM,mBAAmB,MAAM;AAC7B,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,iBAAiB,KAAA,CAAM,OAAA,CAAQ,YAAY,CAAA,GAAI,eAAe,EAAC;AACrE,MAAA,OAAO,KAAA,CAAM,OAAO,CAAC,IAAA,KAAS,eAAe,QAAA,CAAS,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,IACnE,CAAA,MAAO;AACL,MAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,UAAU,YAAY,CAAA;AACjE,MAAA,OAAO,QAAA,GAAW,CAAC,QAAQ,CAAA,GAAI,EAAC;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,uBACEH,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAWD,2BAAA;AAAA,QACT,8CAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,cAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,gBAAA;AAAA,YACA,QAAA;AAAA,YACA,SAAA,EAAW,eAAA;AAAA,YACX,OAAA,EAAS,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA;AAAA,YAChC,eAAe,gBAAA,EAAiB;AAAA,YAChC,QAAA;AAAA,YACA,KAAA,EAAO,kBAAiB,CAAE,MAAA;AAAA,YAC1B,QAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,wBAEAA,cAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,KAAA;AAAA,YACA,YAAA;AAAA,YACA,YAAA;AAAA,YACA,QAAA;AAAA,YACA,aAAA;AAAA,YACA,IAAA;AAAA,YACA,MAAA;AAAA,YACA,WAAA,EAAa,eAAA;AAAA,YACb,YAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;AAEO,MAAM,iBAAiB,CAAC;AAAA,EAC7B,KAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAgB,EAAC;AAAA,EACjB,QAAA,GAAW,KAAA;AAAA,EACX,KAAA,GAAQ,CAAA;AAAA,EACR,QAAA;AAAA,EACA;AACF,CAAA,KAA2B;AACzB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIJ,eAAS,KAAK,CAAA;AAGhD,EAAA,MAAM,YAAA,GAAe,cAAc,MAAA,GAAS,CAAA;AAC5C,EAAA,MAAM,iBAAA,GAAoB,cAAc,MAAA,KAAW,CAAA;AACnD,EAAA,MAAM,mBAAA,GAAsB,cAAc,MAAA,GAAS,CAAA;AAGnD,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,gBAAgB,iBAAA,EAAmB;AAErC,IAAA,MAAM,YAAA,GAAe,cAAc,CAAC,CAAA;AACpC,IAAA,UAAA,GAAa,aAAa,IAAA,GACtB;AAAA,MACE,IAAA,EAAM,aAAa,IAAA,CAAK,IAAA;AAAA,MACxB,SAAA,EAAW,YAAA,CAAa,IAAA,CAAK,SAAA,IAAa,EAAA;AAAA,MAC1C,IAAA,EAAM,YAAA,CAAa,IAAA,CAAK,IAAA,IAAQ,EAAA;AAAA,MAChC,YAAA,EAAc,aAAa,IAAA,CAAK;AAAA,KAClC,GACA,QAAA;AACJ,IAAA,WAAA,GAAc,YAAA,CAAa,KAAA;AAAA,EAC7B,CAAA,MAAA,IAAW,mBAAA,IAAuB,QAAA,IAAY,gBAAA,EAAkB;AAG9D,IAAA,MAAM,oBAAA,GAAuB,aAAA,CAC1B,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,IAAA,EAAM,YAAY,CAAA,CACxC,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,CAAK,KAAM,YAAa,CAAA,CAC1C,MAAA,CAAO,CAAC,KAAA,EAAO,KAAA,EAAO,IAAA,KAAS,IAAA,CAAK,QAAQ,KAAK,CAAA,KAAM,KAAK,CAAA,CAC5D,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAEvB,IAAA,UAAA,GAAa,QAAA,GACT;AAAA,MACE,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,SAAA,EAAW,SAAS,SAAA,IAAa,EAAA;AAAA,MACjC,IAAA,EAAM,SAAS,IAAA,IAAQ,EAAA;AAAA,MACvB,YAAA,EACE,oBAAA,CAAqB,MAAA,GAAS,CAAA,GAC1B,uBACA,QAAA,CAAS;AAAA,KACjB,GACA,MAAA;AACJ,IAAA,WAAA,GAAc,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,gBAAgB,CAAA,CAAA;AAAA,EAC5C,CAAA,MAAO;AAEL,IAAA,UAAA,GAAa,QAAA;AACb,IAAA,WAAA,GAAc,KAAA;AAAA,EAChB;AAEA,EAAA,uBACEI,cAAA;AAAA,IAACS,aAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,QAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,EAAQ,WAAA;AAAA,MACR,SAAA,EAAWL,2BAAA;AAAA,QACT,2CAAA;AAAA,QAAA,CACC,IAAA,KAAS,IAAA,IAAQ,IAAA,KAAS,IAAA,KAAS,uBAAA;AAAA,QACpC,SAAS,IAAA,IAAQ,aAAA;AAAA,QACjB;AAAA,OACF;AAAA,MACA,cAAA,EAAgB,KAAA;AAAA,MAChB,cAAA,EAAgB;AAAA,QACd,OAAA,EAAS,SAAA;AAAA,QACT,OAAA,EAAS,CAAC,cAAc,CAAA;AAAA,QACxB,QAAA,EAAU,CAAC,SAAA,GAAY,EAAA,GAAK,EAAA;AAAA,QAC5B,QAAA,EAAU,CAAC,SAAA,GAAY,EAAA,GAAK,EAAA;AAAA,QAC5B,iBAAA,EAAmB,GAAA;AAAA,QACnB,cAAA,EAAgB,CAAA;AAAA,QAChB,SAAA,EAAW;AAAA,OACb;AAAA,MACA,OAAA;AAAA,MACA,YAAA,EAAc,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,MACrC,YAAA,EAAc,MAAM,YAAA,CAAa,KAAK;AAAA;AAAA,GACxC;AAEJ;AAEO,MAAM,eAAe,CAAC;AAAA,EAC3B,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb;AACF,CAAA,KAAyB;AACvB,EAAA,uBACEC,eAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAWD,2BAAA;AAAA,QACT,qJAAA;AAAA,QACA,SAAS,IAAA,IAAQ,0BAAA;AAAA,QACjB,SAAS,IAAA,IAAQ,0BAAA;AAAA,QACjB,SAAS,IAAA,IAAQ,mCAAA;AAAA,QACjB,UAAA,IAAc;AAAA,OAChB;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4DAAA,EACb,QAAA,kBAAAA,cAAA;AAAA,UAACU,0BAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,CAAA;AAAA,YACN,OAAA,EAAQ,SAAA;AAAA,YACR,OAAA,EAAS,CAAC,cAAc,CAAA;AAAA,YACxB,SAAA,EAAU,iBAAA;AAAA,YACV,cAAA,EAAgB,CAAA;AAAA,YAChB,iBAAA,EAAmB;AAAA;AAAA,SACrB,EACF,CAAA;AAAA,QAEC,IAAA,oBACCV,cAAA;AAAA,UAACW,SAAA;AAAA,UAAA;AAAA,YACC,MAAM,IAAA,CAAK,IAAA;AAAA,YACX,SAAA,EAAWP,2BAAA,CAAW,eAAA,EAAiB,IAAA,CAAK,SAAS,CAAA;AAAA,YACrD,IAAA,EAAM,KAAK,IAAA,IAAQ,EAAA;AAAA,YACnB,cAAc,IAAA,CAAK;AAAA;AAAA,SACrB;AAAA,wBAEFJ,cAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAWI,4BAAW,gDAAgD,CAAA;AAAA,YAErE,QAAA,EAAA;AAAA;AAAA;AACH;AAAA;AAAA,GACF;AAEJ","file":"Dropdown.js","sourcesContent":["\"use client\";\n\nimport { Button, ButtonProps } from \"./Button\";\nimport { useRef, useState, useEffect, useCallback } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport classNames from \"classnames\";\nimport { swift } from \"./utils/easings\";\nimport { Checkbox } from \"./Checkbox\";\nimport { Divider } from \"./Divider\";\nimport { Icon, type IconProps } from \"./Icon\";\nimport { useOnClickOutside } from \"usehooks-ts\";\nimport { CrosshairCorners } from \"./CrossHair\";\n\nexport type DropdownProps = {\n className?: string;\n items: {\n label: string;\n icon?: IconProps;\n value: string;\n disabled?: boolean;\n }[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n disabled?: boolean;\n label: string;\n multiSelectLabel?: string;\n buttonClassName?: string;\n menuClassName?: string;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n};\n\nexport type DropdownButtonProps = {\n label: string;\n multiSelectLabel?: string;\n disabled?: boolean;\n className?: string;\n onClick: () => void;\n buttonClassName?: string;\n selectedItems?: DropdownProps[\"items\"];\n multiple?: boolean;\n count?: number;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n};\n\nexport type DropdownItemProps = {\n label: string;\n icon?: IconProps;\n onClick: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n};\n\nexport type DropdownMenuProps = {\n items: {\n label: string;\n icon?: IconProps;\n value: string;\n disabled?: boolean;\n }[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n menuClassName?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n isOpen: boolean;\n onItemClick?: (value: string) => void;\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n};\n\nexport const DropdownMenu = ({\n items,\n selectedItem,\n handleChange,\n multiple = false,\n menuClassName,\n size = \"md\",\n isOpen,\n onItemClick,\n isScrollable = false,\n animationOrigin = \"top-left\",\n search,\n onClearSearch,\n}: DropdownMenuProps) => {\n const [isAtBottom, setIsAtBottom] = useState(false);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n // Filter items based on search term\n const filteredItems = (() => {\n // If search is provided, filter based on search\n if (search) {\n return items.filter((item) =>\n item.label.toLowerCase().includes(search.toLowerCase())\n );\n }\n\n // Default: show all items\n return items;\n })();\n\n // Handle scroll detection\n const handleScroll = useCallback(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n const threshold = 5; // Small threshold to account for rounding\n const isNearBottom = scrollTop + clientHeight >= scrollHeight - threshold;\n\n setIsAtBottom(isNearBottom);\n }, []);\n\n // Reset scroll state when items change or menu opens\n useEffect(() => {\n if (isOpen) {\n setIsAtBottom(false);\n }\n }, [isOpen, filteredItems.length]);\n\n // Check if content is actually scrollable\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container || !isOpen) return;\n\n const { scrollHeight, clientHeight } = container;\n const hasScrollbar = scrollHeight > clientHeight;\n\n // If no scrollbar (content fits), consider it \"at bottom\"\n if (!hasScrollbar) {\n setIsAtBottom(true);\n }\n }, [isOpen, filteredItems.length]);\n\n // Helper to check if an item is selected\n const isItemSelected = (value: string) => {\n if (multiple) {\n return (\n Array.isArray(selectedItem) &&\n selectedItem.length > 0 &&\n selectedItem.includes(value)\n );\n }\n return !!selectedItem && selectedItem === value;\n };\n\n // Handle item selection\n const handleItemClick = (value: string) => {\n if (multiple) {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n\n // If all items are selected, clicking any item should deselect all others\n if (isAllSelected()) {\n handleChange([value]);\n } else if (currentSelection.includes(value)) {\n // Remove from selection\n handleChange(currentSelection.filter((item) => item !== value));\n } else {\n // Add to selection\n handleChange([...currentSelection, value]);\n }\n } else {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n // Call the optional callback for single select\n onItemClick?.(value);\n }\n };\n\n // Handle select all\n const handleSelectAll = () => {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n const allValues = filteredItems\n .filter((item) => !item.disabled)\n .map((item) => item.value);\n\n if (currentSelection.length === allValues.length) {\n // Deselect all\n handleChange([]);\n } else {\n // Select all\n handleChange(allValues);\n }\n };\n\n // Check if all items are selected\n const isAllSelected = () => {\n if (!Array.isArray(selectedItem) || selectedItem.length === 0) return false;\n const selectableItems = filteredItems.filter((item) => !item.disabled);\n return (\n selectableItems.length > 0 &&\n selectedItem.length === selectableItems.length &&\n selectableItems.every((item) => selectedItem.includes(item.value))\n );\n };\n\n return (\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0, scale: 0.8, y: -15 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n transition={{ duration: 0.1, ease: swift }}\n exit={{ opacity: 0, scale: 0.8, y: -5 }}\n className={classNames(\n \"absolute top-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border\",\n (size === \"lg\" || size === \"md\") && \"min-w-[200px]\",\n animationOrigin === \"top-left\" && \"origin-top-left\",\n animationOrigin === \"top-center\" && \"origin-top-center\",\n animationOrigin === \"top-right\" && \"origin-top-right\",\n menuClassName\n )}\n >\n <div\n ref={scrollContainerRef}\n onScroll={handleScroll}\n className={classNames(\n \"flex flex-col gap-y-1\",\n isScrollable && [\n \"max-h-[250px] overflow-y-auto\",\n !isAtBottom &&\n \"[mask-image:linear-gradient(180deg,black,black_85%,transparent_100%)]\",\n ]\n )}\n >\n {multiple && (\n <div className=\"group flex flex-col gap-y-1\">\n <button\n onClick={handleSelectAll}\n className={classNames(\n \"py-3 pl-2.5 pr-3 flex items-center gap-x-2.5 outline-none bg-transparent transition-colors duration-100 ease-crisp hover:bg-border-light/50\"\n )}\n >\n <Checkbox checked={isAllSelected()} />\n <span className=\"text-sm text-shade-primary font-medium\">\n Select All\n </span>\n </button>\n <Divider direction=\"horizontal\" />\n </div>\n )}\n {filteredItems.length > 0 ? (\n filteredItems.map((item) => (\n <DropdownItem\n key={item.value}\n label={item.label}\n icon={\n item.icon?.name\n ? {\n name: item.icon.name,\n className: item.icon.className,\n size: item.icon.size,\n difficulties: item.icon.difficulties,\n }\n : undefined\n }\n onClick={() => handleItemClick(item.value)}\n disabled={item.disabled}\n isSelected={isItemSelected(item.value)}\n size={size}\n />\n ))\n ) : (\n <button\n onClick={() => {\n // Clear search by calling the onClearSearch callback\n if (onClearSearch) {\n onClearSearch();\n }\n }}\n className=\"py-3 pl-2.5 pr-3 text-sm font-mono text-shade-tertiary hover:bg-border-light/50 transition-colors duration-100 ease-crisp w-full text-center\"\n >\n No options found\n </button>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n\nexport const Dropdown = ({\n className,\n items,\n selectedItem,\n handleChange,\n label = \"View All\",\n multiSelectLabel,\n disabled,\n buttonClassName,\n menuClassName,\n multiple = false,\n menuIcon,\n size = \"md\",\n isScrollable = false,\n search,\n onClearSearch,\n}: DropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n // Handle item selection for single select (closes menu)\n const handleItemClick = (value: string) => {\n if (!multiple) {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n setIsOpen(false);\n }\n };\n\n const ref = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = () => {\n setIsOpen(false);\n };\n\n // Cast ref to RefObject<HTMLElement> to satisfy useOnClickOutside's expected type\n useOnClickOutside(ref as React.RefObject<HTMLElement>, handleClickOutside);\n\n // Get selected items for display in button\n const getSelectedItems = () => {\n if (multiple) {\n const selectedValues = Array.isArray(selectedItem) ? selectedItem : [];\n return items.filter((item) => selectedValues.includes(item.value));\n } else {\n const selected = items.find((item) => item.value === selectedItem);\n return selected ? [selected] : [];\n }\n };\n\n return (\n <div\n ref={ref}\n className={classNames(\n \"relative flex flex-col gap-y-1.5 items-start\",\n className\n )}\n >\n <DropdownButton\n label={label}\n multiSelectLabel={multiSelectLabel}\n disabled={disabled}\n className={buttonClassName}\n onClick={() => setIsOpen(!isOpen)}\n selectedItems={getSelectedItems()}\n multiple={multiple}\n count={getSelectedItems().length}\n menuIcon={menuIcon}\n size={size}\n />\n\n <DropdownMenu\n items={items}\n selectedItem={selectedItem}\n handleChange={handleChange}\n multiple={multiple}\n menuClassName={menuClassName}\n size={size}\n isOpen={isOpen}\n onItemClick={handleItemClick}\n isScrollable={isScrollable}\n search={search}\n onClearSearch={onClearSearch}\n />\n </div>\n );\n};\n\nexport const DropdownButton = ({\n label,\n multiSelectLabel,\n disabled,\n className,\n onClick,\n selectedItems = [],\n multiple = false,\n count = 0,\n menuIcon,\n size,\n}: DropdownButtonProps) => {\n const [isHovered, setIsHovered] = useState(false);\n\n // Determine what to display\n const hasSelection = selectedItems.length > 0;\n const isSingleSelection = selectedItems.length === 1;\n const isMultipleSelection = selectedItems.length > 1;\n\n // Compute icon and label based on selection state\n let buttonIcon: ButtonProps[\"icon\"] | undefined;\n let buttonLabel: string;\n\n if (hasSelection && isSingleSelection) {\n // Single selection: show selected item's icon and label\n const selectedItem = selectedItems[0];\n buttonIcon = selectedItem.icon\n ? {\n name: selectedItem.icon.name,\n className: selectedItem.icon.className || \"\",\n size: selectedItem.icon.size || 18,\n difficulties: selectedItem.icon.difficulties,\n }\n : menuIcon;\n buttonLabel = selectedItem.label;\n } else if (isMultipleSelection && multiple && multiSelectLabel) {\n // Multiple selections: show count and multiSelectLabel\n // Collect all difficulties from selected items\n const combinedDifficulties = selectedItems\n .filter((item) => item.icon?.difficulties)\n .flatMap((item) => item.icon!.difficulties!)\n .filter((value, index, self) => self.indexOf(value) === index) // Remove duplicates\n .sort((a, b) => a - b); // Sort in ascending order\n\n buttonIcon = menuIcon\n ? {\n name: menuIcon.name,\n className: menuIcon.className || \"\",\n size: menuIcon.size || 18,\n difficulties:\n combinedDifficulties.length > 0\n ? combinedDifficulties\n : menuIcon.difficulties,\n }\n : undefined;\n buttonLabel = `${count} ${multiSelectLabel}`;\n } else {\n // Default: no selection\n buttonIcon = menuIcon;\n buttonLabel = label;\n }\n\n return (\n <Button\n icon={buttonIcon}\n label={buttonLabel}\n disabled={disabled}\n size={size}\n variant=\"secondary\"\n className={classNames(\n \"!origin-bottom-left !justify-start w-full\",\n (size === \"md\" || size === \"lg\") && \"!pr-[18px] !pl-[12px]\",\n size === \"sm\" && \"!pr-4 !pl-3\",\n className\n )}\n useHoverEffect={false}\n crosshairProps={{\n variant: \"corners\",\n corners: [\"bottom-right\"],\n spacingX: !isHovered ? -6 : -4,\n spacingY: !isHovered ? -6 : -4,\n animationDuration: 0.5,\n animationDelay: 0,\n className: \"text-shade-mute group-hover:text-shade-primary\",\n }}\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n />\n );\n};\n\nexport const DropdownItem = ({\n label,\n icon,\n onClick,\n disabled,\n isSelected = false,\n size,\n}: DropdownItemProps) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={classNames(\n \"hover:bg-border-light/50 relative group/item disabled:opacity-40 flex items-center gap-x-2.5 outline-none transition-colors duration-100 ease-crisp\",\n size === \"lg\" && \"py-4 pl-3 pr-3 text-base\",\n size === \"md\" && \"py-3 pl-2.5 pr-3 text-sm\",\n size === \"sm\" && \"py-2 pl-2.5 pr-3 h-[36px] text-sm\",\n isSelected && \"bg-background/50\"\n )}\n >\n <div className=\"opacity-0 group-hover/item:!opacity-100 absolute inset-0.5\">\n <CrosshairCorners\n size={6}\n variant=\"corners\"\n corners={[\"bottom-right\"]}\n className=\"text-shade-mute\"\n animationDelay={0}\n animationDuration={0.5}\n />\n </div>\n\n {icon && (\n <Icon\n name={icon.name}\n className={classNames(\"flex-shrink-0\", icon.className)}\n size={icon.size || 18}\n difficulties={icon.difficulties}\n />\n )}\n <span\n className={classNames(\" text-shade-primary font-medium leading-[100%]\")}\n >\n {label}\n </span>\n </button>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/Dropdown.tsx"],"names":["useState","useCallback","useEffect","jsx","useRef","AnimatePresence","motion","swift","classNames","jsxs","Checkbox","Divider","useOnClickOutside","Button","Icon","CrosshairCorners"],"mappings":"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","file":"Dropdown.js","sourcesContent":["\"use client\";\n\nimport { Button, ButtonProps } from \"./Button\";\nimport { useRef, useState, useEffect, useCallback } from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport classNames from \"classnames\";\nimport { swift } from \"./utils/easings\";\nimport { Checkbox } from \"./Checkbox\";\nimport { Divider } from \"./Divider\";\nimport { Icon, type IconProps } from \"./Icon\";\nimport { useOnClickOutside } from \"usehooks-ts\";\nimport { CrosshairCorners } from \"./CrossHair\";\n\nexport type DropdownOption = {\n label: string;\n icon?: IconProps;\n value: string;\n disabled?: boolean;\n children?: DropdownOption[];\n};\n\nexport type DropdownProps = {\n className?: string;\n items: DropdownOption[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n disabled?: boolean;\n label: string;\n multiSelectLabel?: string;\n buttonClassName?: string;\n menuClassName?: string;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n showSelectAll?: boolean;\n};\n\nexport type DropdownButtonProps = {\n label: string;\n multiSelectLabel?: string;\n disabled?: boolean;\n className?: string;\n onClick: () => void;\n buttonClassName?: string;\n selectedItems?: DropdownProps[\"items\"];\n multiple?: boolean;\n count?: number;\n menuIcon?: IconProps;\n size?: \"sm\" | \"md\" | \"lg\";\n onClear?: () => void;\n};\n\nexport type DropdownItemProps = {\n label: string;\n icon?: IconProps;\n onClick: () => void;\n disabled?: boolean;\n isSelected?: boolean;\n size?: \"sm\" | \"md\" | \"lg\";\n};\n\nexport type DropdownMenuProps = {\n items: DropdownOption[];\n selectedItem?: string | string[] | undefined;\n handleChange: (item: string | string[] | undefined) => void;\n multiple?: boolean;\n menuClassName?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n isOpen: boolean;\n onItemClick?: (value: string) => void;\n isScrollable?: boolean;\n animationOrigin?: \"top-left\" | \"top-center\" | \"top-right\";\n search?: string;\n onClearSearch?: () => void;\n showSelectAll?: boolean;\n showSafeTriangle?: boolean;\n};\n\n// Track mouse position for SafeArea triangles\nconst useMousePosition = () => {\n const [mousePosition, setMousePosition] = useState<[number, number]>([0, 0]);\n\n const updateMousePosition = useCallback((ev: MouseEvent) => {\n setMousePosition([ev.clientX, ev.clientY]);\n }, []);\n\n useEffect(() => {\n const throttledUpdate = (ev: MouseEvent) => {\n requestAnimationFrame(() => updateMousePosition(ev));\n };\n\n window.addEventListener(\"mousemove\", throttledUpdate);\n return () => window.removeEventListener(\"mousemove\", throttledUpdate);\n }, [updateMousePosition]);\n\n return mousePosition;\n};\n\ntype MouseSafeAreaProps = {\n submenuRef: React.RefObject<HTMLDivElement | null>;\n parentRef: React.RefObject<HTMLDivElement | null>;\n onEnter?: () => void;\n onLeave?: () => void;\n debug?: boolean;\n};\n\n// Component to cover the area between the mouse cursor and the sub-menu, to allow moving cursor to lower parts of sub-menu without the sub-menu disappearing.\nconst MouseSafeArea = ({\n parentRef,\n submenuRef,\n onEnter,\n onLeave,\n debug = false,\n}: MouseSafeAreaProps) => {\n const {\n x = 0,\n y = 0,\n height: h = 0,\n width: w = 0,\n } = submenuRef.current?.getBoundingClientRect() || {};\n const [mouseX, mouseY] = useMousePosition();\n const positions = { x, y, h, w, mouseX, mouseY };\n\n return (\n <div\n style={{\n position: \"absolute\",\n left: getLeft(positions),\n right: getRight(positions),\n top: 0,\n width: getWidth(positions),\n height: h,\n clipPath: getClipPath(positions),\n pointerEvents: \"auto\",\n zIndex: 9999,\n backgroundColor: debug ? \"rgba(0, 179, 179, 0.25)\" : \"transparent\",\n }}\n onMouseEnter={onEnter}\n onMouseLeave={onLeave}\n />\n );\n};\n\ninterface Positions {\n /* Sub-menu x */\n x: number;\n /* Sub-menu y */\n y: number;\n /* Sub-menu height */\n h: number;\n /* Sub-menu width */\n w: number;\n /* Mouse x */\n mouseX: number;\n /* Mouse y */\n mouseY: number;\n}\n\nconst getLeft = ({ x, mouseX }: Positions) =>\n mouseX > x ? undefined : -Math.max(x - mouseX, 10) + \"px\";\nconst getRight = ({ x, w, mouseX }: Positions) =>\n mouseX > x ? -Math.max(mouseX - (x + w), 10) + \"px\" : undefined;\nconst getWidth = ({ x, w, mouseX }: Positions) =>\n mouseX > x\n ? Math.max(mouseX - (x + w), 10) + \"px\"\n : Math.max(x - mouseX, 10) + \"px\";\nconst getClipPath = ({ x, y, h, mouseX, mouseY }: Positions) =>\n mouseX < x\n ? `polygon(100% 0%, 0% ${(100 * (mouseY - y)) / h}%, 100% 100%)`\n : `polygon(0% 0%, 0% 100%, 100% ${(100 * (mouseY - y)) / h}%)`;\n\nexport const DropdownMenu = ({\n items,\n selectedItem,\n handleChange,\n multiple = false,\n menuClassName,\n size = \"md\",\n isOpen,\n onItemClick,\n isScrollable = false,\n animationOrigin = \"top-left\",\n search,\n onClearSearch,\n showSelectAll = true,\n showSafeTriangle = false,\n}: DropdownMenuProps) => {\n const [isAtBottom, setIsAtBottom] = useState(false);\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n\n // Filter items based on search term\n const filteredItems = (() => {\n // If search is provided, filter based on search\n if (search) {\n return items.filter((item) =>\n item.label.toLowerCase().includes(search.toLowerCase())\n );\n }\n\n // Default: show all items\n return items;\n })();\n\n // Handle scroll detection\n const handleScroll = useCallback(() => {\n const container = scrollContainerRef.current;\n if (!container) return;\n\n const { scrollTop, scrollHeight, clientHeight } = container;\n const threshold = 5; // Small threshold to account for rounding\n const isNearBottom = scrollTop + clientHeight >= scrollHeight - threshold;\n\n setIsAtBottom(isNearBottom);\n }, []);\n\n // Reset scroll state when items change or menu opens\n useEffect(() => {\n if (isOpen) {\n setIsAtBottom(false);\n }\n }, [isOpen, filteredItems.length]);\n\n // Check if content is actually scrollable\n useEffect(() => {\n const container = scrollContainerRef.current;\n if (!container || !isOpen) return;\n\n const { scrollHeight, clientHeight } = container;\n const hasScrollbar = scrollHeight > clientHeight;\n\n // If no scrollbar (content fits), consider it \"at bottom\"\n if (!hasScrollbar) {\n setIsAtBottom(true);\n }\n }, [isOpen, filteredItems.length]);\n\n // Helper to check if an item is selected\n const isItemSelected = (value: string) => {\n if (multiple) {\n return (\n Array.isArray(selectedItem) &&\n selectedItem.length > 0 &&\n selectedItem.includes(value)\n );\n }\n return !!selectedItem && selectedItem === value;\n };\n\n const flattenSelectable = (options: DropdownOption[]): DropdownOption[] => {\n const out: DropdownOption[] = [];\n const walk = (nodes: DropdownOption[]) => {\n nodes.forEach((n) => {\n if (n.children && n.children.length > 0) {\n walk(n.children);\n } else {\n out.push(n);\n }\n });\n };\n walk(options);\n return out;\n };\n\n // Handle item selection\n const handleItemClick = (value: string) => {\n if (multiple) {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n\n // If all items are selected, clicking any item should deselect all others\n if (isAllSelected()) {\n handleChange([value]);\n } else if (currentSelection.includes(value)) {\n // Remove from selection\n handleChange(currentSelection.filter((item) => item !== value));\n } else {\n // Add to selection\n handleChange([...currentSelection, value]);\n }\n } else {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n // Call the optional callback for single select\n onItemClick?.(value);\n }\n };\n\n // Handle select all\n const handleSelectAll = () => {\n const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];\n const allValues = flattenSelectable(filteredItems)\n .filter((item) => !item.disabled)\n .map((item) => item.value);\n\n if (currentSelection.length === allValues.length) {\n // Deselect all\n handleChange([]);\n } else {\n // Select all\n handleChange(allValues);\n }\n };\n\n // Check if all items are selected\n const isAllSelected = () => {\n if (!Array.isArray(selectedItem) || selectedItem.length === 0) return false;\n const selectableItems = flattenSelectable(filteredItems).filter(\n (item) => !item.disabled\n );\n return (\n selectableItems.length > 0 &&\n selectedItem.length === selectableItems.length &&\n selectableItems.every((item) => selectedItem.includes(item.value))\n );\n };\n\n return (\n <AnimatePresence>\n {isOpen && (\n <motion.div\n initial={{ opacity: 0, scale: 0.8, y: -15 }}\n animate={{ opacity: 1, scale: 1, y: 0 }}\n transition={{ duration: 0.1, ease: swift }}\n exit={{ opacity: 0, scale: 0.8, y: -5 }}\n className={classNames(\n \"z-50 absolute top-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border\",\n (size === \"lg\" || size === \"md\") && \"min-w-[200px]\",\n animationOrigin === \"top-left\" && \"origin-top-left\",\n animationOrigin === \"top-center\" && \"origin-top-center\",\n animationOrigin === \"top-right\" && \"origin-top-right\",\n menuClassName\n )}\n >\n <div\n ref={scrollContainerRef}\n onScroll={handleScroll}\n className={classNames(\n \"flex flex-col gap-y-1\",\n isScrollable && [\n \"max-h-[250px] overflow-y-auto\",\n !isAtBottom &&\n \"[mask-image:linear-gradient(180deg,black,black_85%,transparent_100%)]\",\n ]\n )}\n >\n {multiple && showSelectAll && (\n <div className=\"group flex flex-col gap-y-1\">\n <button\n onClick={handleSelectAll}\n className={classNames(\n \"py-3 pl-2.5 pr-3 flex items-center gap-x-2.5 outline-none bg-transparent transition-colors duration-100 ease-crisp hover:bg-border-light/50\"\n )}\n >\n <Checkbox checked={isAllSelected()} />\n <span className=\"text-sm text-shade-primary font-medium\">\n Select All\n </span>\n </button>\n <Divider direction=\"horizontal\" />\n </div>\n )}\n {filteredItems.length > 0 ? (\n filteredItems.map((item) =>\n item.children && item.children.length > 0 ? (\n <DropdownSubmenuItem\n key={item.value}\n item={item}\n size={size}\n onLeafClick={handleItemClick}\n isLeafSelected={isItemSelected}\n />\n ) : (\n <DropdownItem\n key={item.value}\n label={item.label}\n icon={\n item.icon?.name\n ? {\n name: item.icon.name,\n className: item.icon.className,\n size: item.icon.size,\n difficulties: item.icon.difficulties,\n }\n : undefined\n }\n onClick={() => handleItemClick(item.value)}\n disabled={item.disabled}\n isSelected={isItemSelected(item.value)}\n size={size}\n />\n )\n )\n ) : (\n <button\n onClick={() => {\n // Clear search by calling the onClearSearch callback\n if (onClearSearch) {\n onClearSearch();\n }\n }}\n className=\"py-3 pl-2.5 pr-3 text-sm font-mono text-shade-tertiary hover:bg-border-light/50 transition-colors duration-100 ease-crisp w-full text-center\"\n >\n No options found\n </button>\n )}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n};\n\nexport const Dropdown = ({\n className,\n items,\n selectedItem,\n handleChange,\n label = \"View All\",\n multiSelectLabel,\n disabled,\n buttonClassName,\n menuClassName,\n multiple = false,\n menuIcon,\n size = \"md\",\n isScrollable = false,\n search,\n onClearSearch,\n showSelectAll,\n}: DropdownProps) => {\n const [isOpen, setIsOpen] = useState(false);\n\n // Handle item selection for single select (closes menu)\n const handleItemClick = (value: string) => {\n if (!multiple) {\n // Single select - if clicking the already selected item, deselect it\n if (selectedItem === value) {\n handleChange(undefined);\n } else {\n // Otherwise, select the new item\n handleChange(value);\n }\n setIsOpen(false);\n }\n };\n\n const ref = useRef<HTMLDivElement>(null);\n\n const handleClickOutside = () => {\n setIsOpen(false);\n };\n\n // Cast ref to RefObject<HTMLElement> to satisfy useOnClickOutside's expected type\n useOnClickOutside(ref as React.RefObject<HTMLElement>, handleClickOutside);\n\n // Get selected items for display in button\n const getSelectedItems = () => {\n const flatten = (options: DropdownOption[]): DropdownOption[] => {\n const out: DropdownOption[] = [];\n const walk = (nodes: DropdownOption[]) => {\n nodes.forEach((n) => {\n if (n.children && n.children.length > 0) {\n walk(n.children);\n } else {\n out.push(n);\n }\n });\n };\n walk(options);\n return out;\n };\n\n const leaves = flatten(items);\n if (multiple) {\n const selectedValues = Array.isArray(selectedItem) ? selectedItem : [];\n return leaves.filter((item) => selectedValues.includes(item.value));\n }\n const selected = leaves.find((item) => item.value === selectedItem);\n return selected ? [selected] : [];\n };\n\n return (\n <div\n ref={ref}\n className={classNames(\n \"relative flex flex-col gap-y-1.5 items-start\",\n className\n )}\n >\n <DropdownButton\n label={label}\n multiSelectLabel={multiSelectLabel}\n disabled={disabled}\n className={buttonClassName}\n onClick={() => setIsOpen(!isOpen)}\n selectedItems={getSelectedItems()}\n multiple={multiple}\n count={getSelectedItems().length}\n menuIcon={menuIcon}\n size={size}\n onClear={() => handleChange(multiple ? [] : undefined)}\n />\n\n <DropdownMenu\n items={items}\n selectedItem={selectedItem}\n handleChange={handleChange}\n multiple={multiple}\n menuClassName={menuClassName}\n size={size}\n isOpen={isOpen}\n onItemClick={handleItemClick}\n isScrollable={isScrollable}\n search={search}\n onClearSearch={onClearSearch}\n showSelectAll={showSelectAll}\n />\n </div>\n );\n};\n\nexport const DropdownButton = ({\n label,\n multiSelectLabel,\n disabled,\n className,\n onClick,\n selectedItems = [],\n multiple = false,\n count = 0,\n menuIcon,\n size,\n onClear,\n}: DropdownButtonProps) => {\n const [isHovered, setIsHovered] = useState(false);\n\n // Determine what to display\n const hasSelection = selectedItems.length > 0;\n const isSingleSelection = selectedItems.length === 1;\n const isMultipleSelection = selectedItems.length > 1;\n\n // Compute icon and label based on selection state\n let buttonIcon: ButtonProps[\"icon\"] | undefined;\n let buttonLabel: string;\n\n if (hasSelection && isSingleSelection) {\n // Single selection: show selected item's icon and label\n const selectedItem = selectedItems[0];\n buttonIcon = selectedItem.icon\n ? {\n name: selectedItem.icon.name,\n className: selectedItem.icon.className || \"\",\n size: selectedItem.icon.size || 18,\n difficulties: selectedItem.icon.difficulties,\n }\n : menuIcon;\n buttonLabel = selectedItem.label;\n } else if (isMultipleSelection && multiple && multiSelectLabel) {\n // Multiple selections: show count and multiSelectLabel\n // Collect all difficulties from selected items\n const combinedDifficulties = selectedItems\n .filter((item) => item.icon?.difficulties)\n .flatMap((item) => item.icon!.difficulties!)\n .filter((value, index, self) => self.indexOf(value) === index) // Remove duplicates\n .sort((a, b) => a - b); // Sort in ascending order\n\n buttonIcon = menuIcon\n ? {\n name: menuIcon.name,\n className: menuIcon.className || \"\",\n size: menuIcon.size || 18,\n difficulties:\n combinedDifficulties.length > 0\n ? combinedDifficulties\n : menuIcon.difficulties,\n }\n : undefined;\n buttonLabel = `${count} ${multiSelectLabel}`;\n } else {\n // Default: no selection\n buttonIcon = menuIcon;\n buttonLabel = label;\n }\n\n return (\n <Button\n icon={buttonIcon}\n label={buttonLabel}\n disabled={disabled}\n size={size}\n variant=\"secondary\"\n className={classNames(\n \"!origin-bottom-left !justify-start w-full\",\n (size === \"md\" || size === \"lg\") && \"!pr-[18px] !pl-[12px]\",\n size === \"sm\" && \"!pr-4 !pl-3\",\n className\n )}\n useDecryptAnimation={false}\n useHoverEffect={false}\n crosshairProps={{\n variant: \"corners\",\n corners: [\"bottom-right\"],\n spacingX: !isHovered ? -6 : -4,\n spacingY: !isHovered ? -6 : -4,\n animationDuration: 0.5,\n animationDelay: 0,\n className: \"text-shade-mute group-hover:text-shade-primary\",\n }}\n onClick={onClick}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n children={\n hasSelection &&\n multiple && (\n <div\n className=\"absolute right-2 top-1/2 -translate-y-1/2 h-[24px] w-[24px] flex items-center justify-center hover:bg-background/40 transition duration-100 ease-crisp cursor-pointer\"\n onClick={(e) => {\n e.stopPropagation();\n onClear?.();\n }}\n >\n <Icon name=\"Close\" size={12} />\n </div>\n )\n }\n />\n );\n};\n\nexport const DropdownItem = ({\n label,\n icon,\n onClick,\n disabled,\n isSelected = false,\n size,\n}: DropdownItemProps) => {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={classNames(\n \"hover:bg-border-light/50 relative group/item disabled:opacity-40 flex items-center gap-x-2.5 outline-none transition-colors duration-100 ease-crisp\",\n size === \"lg\" && \"py-4 pl-3 pr-3 text-base\",\n size === \"md\" && \"py-3 pl-2.5 pr-3 text-sm\",\n size === \"sm\" && \"py-2 pl-2.5 pr-3 h-[36px] text-sm\",\n isSelected && \"bg-background/50\"\n )}\n >\n <div className=\"opacity-0 group-hover/item:!opacity-100 absolute inset-0.5\">\n <CrosshairCorners\n size={6}\n variant=\"corners\"\n corners={[\"bottom-right\"]}\n className=\"text-shade-mute\"\n animationDelay={0}\n animationDuration={0.5}\n />\n </div>\n\n {icon && (\n <Icon\n name={icon.name}\n className={classNames(\"flex-shrink-0\", icon.className)}\n size={icon.size || 18}\n difficulties={icon.difficulties}\n />\n )}\n <span\n className={classNames(\" text-shade-primary font-medium leading-[100%]\")}\n >\n {label}\n </span>\n </button>\n );\n};\n\ntype DropdownSubmenuItemProps = {\n item: DropdownOption;\n size?: \"sm\" | \"md\" | \"lg\";\n onLeafClick: (value: string) => void;\n isLeafSelected: (value: string) => boolean;\n};\n\nconst DropdownSubmenuItem = ({\n item,\n size = \"md\",\n onLeafClick,\n isLeafSelected,\n}: DropdownSubmenuItemProps) => {\n const parentRef = useRef<HTMLDivElement | null>(null);\n const submenuRef = useRef<HTMLDivElement | null>(null);\n\n const [hoverParent, setHoverParent] = useState(false);\n const [hoverSubmenu, setHoverSubmenu] = useState(false);\n const [hoverSafe, setHoverSafe] = useState(false);\n\n const open = hoverParent || hoverSubmenu || hoverSafe;\n\n return (\n <div\n ref={parentRef}\n className=\"relative\"\n onMouseEnter={() => setHoverParent(true)}\n onMouseLeave={() => setHoverParent(false)}\n >\n <button\n type=\"button\"\n className={classNames(\n \"hover:bg-border-light/50 relative group/item disabled:opacity-40 flex items-center justify-between gap-x-2.5 w-full outline-none transition-colors duration-100 ease-crisp\",\n size === \"lg\" && \"py-4 pl-3 pr-3 text-base\",\n size === \"md\" && \"py-3 pl-2.5 pr-3 text-sm\",\n size === \"sm\" && \"py-2 pl-2.5 pr-3 h-[36px] text-sm\",\n open && \"bg-border-light/50\"\n )}\n disabled={item.disabled}\n >\n <span className=\"flex items-center gap-x-2.5\">\n {item.icon?.name && (\n <Icon\n name={item.icon.name}\n className={classNames(\"flex-shrink-0\", item.icon.className)}\n size={item.icon.size || 18}\n difficulties={item.icon.difficulties}\n />\n )}\n <span className=\"text-shade-primary font-medium leading-[100%]\">\n {item.label}\n </span>\n </span>\n <Icon name=\"ChevronRight\" size={14} className=\"text-shade-tertiary\" />\n </button>\n\n {open && (\n <div\n ref={submenuRef}\n onMouseEnter={() => setHoverSubmenu(true)}\n onMouseLeave={() => setHoverSubmenu(false)}\n className={classNames(\n \"z-[60] absolute top-0 left-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border min-w-[180px]\"\n )}\n >\n <MouseSafeArea\n parentRef={parentRef}\n submenuRef={submenuRef}\n onEnter={() => setHoverSafe(true)}\n onLeave={() => setHoverSafe(false)}\n />\n <div className=\"flex flex-col gap-y-1\">\n {(item.children || []).map((child) =>\n child.children && child.children.length > 0 ? (\n <DropdownSubmenuItem\n key={child.value}\n item={child}\n size={size}\n onLeafClick={onLeafClick}\n isLeafSelected={isLeafSelected}\n />\n ) : (\n <DropdownItem\n key={child.value}\n label={child.label}\n icon={\n child.icon?.name\n ? {\n name: child.icon.name,\n className: child.icon.className,\n size: child.icon.size,\n difficulties: child.icon.difficulties,\n }\n : undefined\n }\n onClick={() => onLeafClick(child.value)}\n disabled={child.disabled}\n isSelected={isLeafSelected(child.value)}\n size={size}\n />\n )\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n"]}
package/dist/Dropdown.mjs CHANGED
@@ -10,6 +10,59 @@ import { Icon } from './Icon';
10
10
  import { useOnClickOutside } from 'usehooks-ts';
11
11
  import { CrosshairCorners } from './CrossHair';
12
12
 
13
+ const useMousePosition = () => {
14
+ const [mousePosition, setMousePosition] = useState([0, 0]);
15
+ const updateMousePosition = useCallback((ev) => {
16
+ setMousePosition([ev.clientX, ev.clientY]);
17
+ }, []);
18
+ useEffect(() => {
19
+ const throttledUpdate = (ev) => {
20
+ requestAnimationFrame(() => updateMousePosition(ev));
21
+ };
22
+ window.addEventListener("mousemove", throttledUpdate);
23
+ return () => window.removeEventListener("mousemove", throttledUpdate);
24
+ }, [updateMousePosition]);
25
+ return mousePosition;
26
+ };
27
+ const MouseSafeArea = ({
28
+ parentRef,
29
+ submenuRef,
30
+ onEnter,
31
+ onLeave,
32
+ debug = false
33
+ }) => {
34
+ const {
35
+ x = 0,
36
+ y = 0,
37
+ height: h = 0,
38
+ width: w = 0
39
+ } = submenuRef.current?.getBoundingClientRect() || {};
40
+ const [mouseX, mouseY] = useMousePosition();
41
+ const positions = { x, y, h, w, mouseX, mouseY };
42
+ return /* @__PURE__ */ jsx(
43
+ "div",
44
+ {
45
+ style: {
46
+ position: "absolute",
47
+ left: getLeft(positions),
48
+ right: getRight(positions),
49
+ top: 0,
50
+ width: getWidth(positions),
51
+ height: h,
52
+ clipPath: getClipPath(positions),
53
+ pointerEvents: "auto",
54
+ zIndex: 9999,
55
+ backgroundColor: debug ? "rgba(0, 179, 179, 0.25)" : "transparent"
56
+ },
57
+ onMouseEnter: onEnter,
58
+ onMouseLeave: onLeave
59
+ }
60
+ );
61
+ };
62
+ const getLeft = ({ x, mouseX }) => mouseX > x ? void 0 : -Math.max(x - mouseX, 10) + "px";
63
+ const getRight = ({ x, w, mouseX }) => mouseX > x ? -Math.max(mouseX - (x + w), 10) + "px" : void 0;
64
+ const getWidth = ({ x, w, mouseX }) => mouseX > x ? Math.max(mouseX - (x + w), 10) + "px" : Math.max(x - mouseX, 10) + "px";
65
+ const getClipPath = ({ x, y, h, mouseX, mouseY }) => mouseX < x ? `polygon(100% 0%, 0% ${100 * (mouseY - y) / h}%, 100% 100%)` : `polygon(0% 0%, 0% 100%, 100% ${100 * (mouseY - y) / h}%)`;
13
66
  const DropdownMenu = ({
14
67
  items,
15
68
  selectedItem,
@@ -22,7 +75,9 @@ const DropdownMenu = ({
22
75
  isScrollable = false,
23
76
  animationOrigin = "top-left",
24
77
  search,
25
- onClearSearch
78
+ onClearSearch,
79
+ showSelectAll = true,
80
+ showSafeTriangle = false
26
81
  }) => {
27
82
  const [isAtBottom, setIsAtBottom] = useState(false);
28
83
  const scrollContainerRef = useRef(null);
@@ -62,6 +117,20 @@ const DropdownMenu = ({
62
117
  }
63
118
  return !!selectedItem && selectedItem === value;
64
119
  };
120
+ const flattenSelectable = (options) => {
121
+ const out = [];
122
+ const walk = (nodes) => {
123
+ nodes.forEach((n) => {
124
+ if (n.children && n.children.length > 0) {
125
+ walk(n.children);
126
+ } else {
127
+ out.push(n);
128
+ }
129
+ });
130
+ };
131
+ walk(options);
132
+ return out;
133
+ };
65
134
  const handleItemClick = (value) => {
66
135
  if (multiple) {
67
136
  const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];
@@ -83,7 +152,7 @@ const DropdownMenu = ({
83
152
  };
84
153
  const handleSelectAll = () => {
85
154
  const currentSelection = Array.isArray(selectedItem) ? selectedItem : [];
86
- const allValues = filteredItems.filter((item) => !item.disabled).map((item) => item.value);
155
+ const allValues = flattenSelectable(filteredItems).filter((item) => !item.disabled).map((item) => item.value);
87
156
  if (currentSelection.length === allValues.length) {
88
157
  handleChange([]);
89
158
  } else {
@@ -92,7 +161,9 @@ const DropdownMenu = ({
92
161
  };
93
162
  const isAllSelected = () => {
94
163
  if (!Array.isArray(selectedItem) || selectedItem.length === 0) return false;
95
- const selectableItems = filteredItems.filter((item) => !item.disabled);
164
+ const selectableItems = flattenSelectable(filteredItems).filter(
165
+ (item) => !item.disabled
166
+ );
96
167
  return selectableItems.length > 0 && selectedItem.length === selectableItems.length && selectableItems.every((item) => selectedItem.includes(item.value));
97
168
  };
98
169
  return /* @__PURE__ */ jsx(AnimatePresence, { children: isOpen && /* @__PURE__ */ jsx(
@@ -103,7 +174,7 @@ const DropdownMenu = ({
103
174
  transition: { duration: 0.1, ease: swift },
104
175
  exit: { opacity: 0, scale: 0.8, y: -5 },
105
176
  className: classNames(
106
- "absolute top-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border",
177
+ "z-50 absolute top-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border",
107
178
  (size === "lg" || size === "md") && "min-w-[200px]",
108
179
  animationOrigin === "top-left" && "origin-top-left",
109
180
  animationOrigin === "top-center" && "origin-top-center",
@@ -123,7 +194,7 @@ const DropdownMenu = ({
123
194
  ]
124
195
  ),
125
196
  children: [
126
- multiple && /* @__PURE__ */ jsxs("div", { className: "group flex flex-col gap-y-1", children: [
197
+ multiple && showSelectAll && /* @__PURE__ */ jsxs("div", { className: "group flex flex-col gap-y-1", children: [
127
198
  /* @__PURE__ */ jsxs(
128
199
  "button",
129
200
  {
@@ -139,23 +210,34 @@ const DropdownMenu = ({
139
210
  ),
140
211
  /* @__PURE__ */ jsx(Divider, { direction: "horizontal" })
141
212
  ] }),
142
- filteredItems.length > 0 ? filteredItems.map((item) => /* @__PURE__ */ jsx(
143
- DropdownItem,
144
- {
145
- label: item.label,
146
- icon: item.icon?.name ? {
147
- name: item.icon.name,
148
- className: item.icon.className,
149
- size: item.icon.size,
150
- difficulties: item.icon.difficulties
151
- } : void 0,
152
- onClick: () => handleItemClick(item.value),
153
- disabled: item.disabled,
154
- isSelected: isItemSelected(item.value),
155
- size
156
- },
157
- item.value
158
- )) : /* @__PURE__ */ jsx(
213
+ filteredItems.length > 0 ? filteredItems.map(
214
+ (item) => item.children && item.children.length > 0 ? /* @__PURE__ */ jsx(
215
+ DropdownSubmenuItem,
216
+ {
217
+ item,
218
+ size,
219
+ onLeafClick: handleItemClick,
220
+ isLeafSelected: isItemSelected
221
+ },
222
+ item.value
223
+ ) : /* @__PURE__ */ jsx(
224
+ DropdownItem,
225
+ {
226
+ label: item.label,
227
+ icon: item.icon?.name ? {
228
+ name: item.icon.name,
229
+ className: item.icon.className,
230
+ size: item.icon.size,
231
+ difficulties: item.icon.difficulties
232
+ } : void 0,
233
+ onClick: () => handleItemClick(item.value),
234
+ disabled: item.disabled,
235
+ isSelected: isItemSelected(item.value),
236
+ size
237
+ },
238
+ item.value
239
+ )
240
+ ) : /* @__PURE__ */ jsx(
159
241
  "button",
160
242
  {
161
243
  onClick: () => {
@@ -188,7 +270,8 @@ const Dropdown = ({
188
270
  size = "md",
189
271
  isScrollable = false,
190
272
  search,
191
- onClearSearch
273
+ onClearSearch,
274
+ showSelectAll
192
275
  }) => {
193
276
  const [isOpen, setIsOpen] = useState(false);
194
277
  const handleItemClick = (value) => {
@@ -207,13 +290,27 @@ const Dropdown = ({
207
290
  };
208
291
  useOnClickOutside(ref, handleClickOutside);
209
292
  const getSelectedItems = () => {
293
+ const flatten = (options) => {
294
+ const out = [];
295
+ const walk = (nodes) => {
296
+ nodes.forEach((n) => {
297
+ if (n.children && n.children.length > 0) {
298
+ walk(n.children);
299
+ } else {
300
+ out.push(n);
301
+ }
302
+ });
303
+ };
304
+ walk(options);
305
+ return out;
306
+ };
307
+ const leaves = flatten(items);
210
308
  if (multiple) {
211
309
  const selectedValues = Array.isArray(selectedItem) ? selectedItem : [];
212
- return items.filter((item) => selectedValues.includes(item.value));
213
- } else {
214
- const selected = items.find((item) => item.value === selectedItem);
215
- return selected ? [selected] : [];
310
+ return leaves.filter((item) => selectedValues.includes(item.value));
216
311
  }
312
+ const selected = leaves.find((item) => item.value === selectedItem);
313
+ return selected ? [selected] : [];
217
314
  };
218
315
  return /* @__PURE__ */ jsxs(
219
316
  "div",
@@ -236,7 +333,8 @@ const Dropdown = ({
236
333
  multiple,
237
334
  count: getSelectedItems().length,
238
335
  menuIcon,
239
- size
336
+ size,
337
+ onClear: () => handleChange(multiple ? [] : void 0)
240
338
  }
241
339
  ),
242
340
  /* @__PURE__ */ jsx(
@@ -252,7 +350,8 @@ const Dropdown = ({
252
350
  onItemClick: handleItemClick,
253
351
  isScrollable,
254
352
  search,
255
- onClearSearch
353
+ onClearSearch,
354
+ showSelectAll
256
355
  }
257
356
  )
258
357
  ]
@@ -269,7 +368,8 @@ const DropdownButton = ({
269
368
  multiple = false,
270
369
  count = 0,
271
370
  menuIcon,
272
- size
371
+ size,
372
+ onClear
273
373
  }) => {
274
374
  const [isHovered, setIsHovered] = useState(false);
275
375
  const hasSelection = selectedItems.length > 0;
@@ -313,6 +413,7 @@ const DropdownButton = ({
313
413
  size === "sm" && "!pr-4 !pl-3",
314
414
  className
315
415
  ),
416
+ useDecryptAnimation: false,
316
417
  useHoverEffect: false,
317
418
  crosshairProps: {
318
419
  variant: "corners",
@@ -325,7 +426,18 @@ const DropdownButton = ({
325
426
  },
326
427
  onClick,
327
428
  onMouseEnter: () => setIsHovered(true),
328
- onMouseLeave: () => setIsHovered(false)
429
+ onMouseLeave: () => setIsHovered(false),
430
+ children: hasSelection && multiple && /* @__PURE__ */ jsx(
431
+ "div",
432
+ {
433
+ className: "absolute right-2 top-1/2 -translate-y-1/2 h-[24px] w-[24px] flex items-center justify-center hover:bg-background/40 transition duration-100 ease-crisp cursor-pointer",
434
+ onClick: (e) => {
435
+ e.stopPropagation();
436
+ onClear?.();
437
+ },
438
+ children: /* @__PURE__ */ jsx(Icon, { name: "Close", size: 12 })
439
+ }
440
+ )
329
441
  }
330
442
  );
331
443
  };
@@ -381,6 +493,109 @@ const DropdownItem = ({
381
493
  }
382
494
  );
383
495
  };
496
+ const DropdownSubmenuItem = ({
497
+ item,
498
+ size = "md",
499
+ onLeafClick,
500
+ isLeafSelected
501
+ }) => {
502
+ const parentRef = useRef(null);
503
+ const submenuRef = useRef(null);
504
+ const [hoverParent, setHoverParent] = useState(false);
505
+ const [hoverSubmenu, setHoverSubmenu] = useState(false);
506
+ const [hoverSafe, setHoverSafe] = useState(false);
507
+ const open = hoverParent || hoverSubmenu || hoverSafe;
508
+ return /* @__PURE__ */ jsxs(
509
+ "div",
510
+ {
511
+ ref: parentRef,
512
+ className: "relative",
513
+ onMouseEnter: () => setHoverParent(true),
514
+ onMouseLeave: () => setHoverParent(false),
515
+ children: [
516
+ /* @__PURE__ */ jsxs(
517
+ "button",
518
+ {
519
+ type: "button",
520
+ className: classNames(
521
+ "hover:bg-border-light/50 relative group/item disabled:opacity-40 flex items-center justify-between gap-x-2.5 w-full outline-none transition-colors duration-100 ease-crisp",
522
+ size === "lg" && "py-4 pl-3 pr-3 text-base",
523
+ size === "md" && "py-3 pl-2.5 pr-3 text-sm",
524
+ size === "sm" && "py-2 pl-2.5 pr-3 h-[36px] text-sm",
525
+ open && "bg-border-light/50"
526
+ ),
527
+ disabled: item.disabled,
528
+ children: [
529
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-x-2.5", children: [
530
+ item.icon?.name && /* @__PURE__ */ jsx(
531
+ Icon,
532
+ {
533
+ name: item.icon.name,
534
+ className: classNames("flex-shrink-0", item.icon.className),
535
+ size: item.icon.size || 18,
536
+ difficulties: item.icon.difficulties
537
+ }
538
+ ),
539
+ /* @__PURE__ */ jsx("span", { className: "text-shade-primary font-medium leading-[100%]", children: item.label })
540
+ ] }),
541
+ /* @__PURE__ */ jsx(Icon, { name: "ChevronRight", size: 14, className: "text-shade-tertiary" })
542
+ ]
543
+ }
544
+ ),
545
+ open && /* @__PURE__ */ jsxs(
546
+ "div",
547
+ {
548
+ ref: submenuRef,
549
+ onMouseEnter: () => setHoverSubmenu(true),
550
+ onMouseLeave: () => setHoverSubmenu(false),
551
+ className: classNames(
552
+ "z-[60] absolute top-0 left-[calc(100%+6px)] p-1 bg-card-foreground gradient-border before:bg-card-border min-w-[180px]"
553
+ ),
554
+ children: [
555
+ /* @__PURE__ */ jsx(
556
+ MouseSafeArea,
557
+ {
558
+ parentRef,
559
+ submenuRef,
560
+ onEnter: () => setHoverSafe(true),
561
+ onLeave: () => setHoverSafe(false)
562
+ }
563
+ ),
564
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-y-1", children: (item.children || []).map(
565
+ (child) => child.children && child.children.length > 0 ? /* @__PURE__ */ jsx(
566
+ DropdownSubmenuItem,
567
+ {
568
+ item: child,
569
+ size,
570
+ onLeafClick,
571
+ isLeafSelected
572
+ },
573
+ child.value
574
+ ) : /* @__PURE__ */ jsx(
575
+ DropdownItem,
576
+ {
577
+ label: child.label,
578
+ icon: child.icon?.name ? {
579
+ name: child.icon.name,
580
+ className: child.icon.className,
581
+ size: child.icon.size,
582
+ difficulties: child.icon.difficulties
583
+ } : void 0,
584
+ onClick: () => onLeafClick(child.value),
585
+ disabled: child.disabled,
586
+ isSelected: isLeafSelected(child.value),
587
+ size
588
+ },
589
+ child.value
590
+ )
591
+ ) })
592
+ ]
593
+ }
594
+ )
595
+ ]
596
+ }
597
+ );
598
+ };
384
599
 
385
600
  export { Dropdown, DropdownButton, DropdownItem, DropdownMenu };
386
601
  //# sourceMappingURL=Dropdown.mjs.map