@vuer-ai/vuer-uikit 0.0.120 → 0.0.121

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 (472) hide show
  1. package/dist/SyncScroll/SyncScroll.cjs +10 -10
  2. package/dist/SyncScroll/SyncScroll.mjs +3 -3
  3. package/dist/SyncScroll/index.cjs +10 -10
  4. package/dist/SyncScroll/index.mjs +3 -3
  5. package/dist/auth/components/index.cjs +83 -82
  6. package/dist/auth/components/index.mjs +82 -81
  7. package/dist/auth/components/user-avatar/index.cjs +83 -82
  8. package/dist/auth/components/user-avatar/index.mjs +82 -81
  9. package/dist/auth/index.cjs +83 -82
  10. package/dist/auth/index.mjs +82 -81
  11. package/dist/{chunk-42WQWP6X.cjs → chunk-22T2AL3G.cjs} +8 -8
  12. package/dist/{chunk-H6JGIEAU.mjs → chunk-2KQXKQNU.mjs} +1 -1
  13. package/dist/{chunk-S7CCCMMU.cjs → chunk-34NDAZS6.cjs} +18 -9
  14. package/dist/{chunk-DM43KZU7.cjs → chunk-3F3LBOQJ.cjs} +2 -2
  15. package/dist/chunk-3JMUI4R2.cjs +136 -0
  16. package/dist/{chunk-EOLUDKZ3.mjs → chunk-3P2OP4KO.mjs} +24 -46
  17. package/dist/{chunk-NMRFBO43.mjs → chunk-3SUV56TH.mjs} +3 -3
  18. package/dist/{chunk-CH3BSVL4.cjs → chunk-42DBXENE.cjs} +2 -2
  19. package/dist/{chunk-JW456O5K.mjs → chunk-4FB6B2ES.mjs} +1 -1
  20. package/dist/{chunk-TB5L3GBP.cjs → chunk-4G2LN6XU.cjs} +138 -107
  21. package/dist/{chunk-MNCBTS63.cjs → chunk-4TRHQ7MJ.cjs} +5 -5
  22. package/dist/{chunk-F2LEYFWW.cjs → chunk-4WKFVKFF.cjs} +5 -5
  23. package/dist/{chunk-EEGQLTSQ.cjs → chunk-4WWGBRQV.cjs} +77 -0
  24. package/dist/chunk-4Y5IF7R5.mjs +322 -0
  25. package/dist/{chunk-Q7VP2WSX.mjs → chunk-4YVKJKWV.mjs} +2 -2
  26. package/dist/{chunk-X6WOCNBX.cjs → chunk-57NITJN5.cjs} +2 -2
  27. package/dist/{chunk-QWBMDS3S.cjs → chunk-5HT74RHB.cjs} +5 -5
  28. package/dist/{chunk-4ODJAEOM.mjs → chunk-5JYH7TXY.mjs} +1 -1
  29. package/dist/{chunk-OJOWMXXY.mjs → chunk-67H3OSM3.mjs} +3 -3
  30. package/dist/{chunk-2CD4D2BR.cjs → chunk-6CJWNYHL.cjs} +3 -3
  31. package/dist/{chunk-CRX2ZCM2.cjs → chunk-6LTCLQH3.cjs} +6 -1
  32. package/dist/{chunk-64VVW5YR.mjs → chunk-6NSLYQ35.mjs} +1 -1
  33. package/dist/{chunk-WKK5UX2W.mjs → chunk-6U6LRS37.mjs} +2 -2
  34. package/dist/{chunk-4OUQ6NSX.cjs → chunk-6VIKDPCD.cjs} +2 -2
  35. package/dist/{chunk-LMYA5IOK.mjs → chunk-6ZLK2RYS.mjs} +3 -3
  36. package/dist/{chunk-LYGYXV7S.cjs → chunk-7ICRKPIO.cjs} +16 -16
  37. package/dist/{chunk-ZCSJGDX7.mjs → chunk-7MR3M2HW.mjs} +1 -1
  38. package/dist/{chunk-Q37KC3CL.mjs → chunk-7RRQ2HHL.mjs} +114 -17
  39. package/dist/{chunk-FMKD5JBL.mjs → chunk-7TD77VF4.mjs} +10 -6
  40. package/dist/{chunk-5ARBIWXX.cjs → chunk-7TXGEIV3.cjs} +10 -10
  41. package/dist/{chunk-SLXM4F24.cjs → chunk-7YFUNCKT.cjs} +9 -9
  42. package/dist/{chunk-LGFWHV23.cjs → chunk-ACGXE2IO.cjs} +2 -2
  43. package/dist/{chunk-EGIIZWP3.mjs → chunk-AFR23IX6.mjs} +1 -1
  44. package/dist/{chunk-XS5IUI62.cjs → chunk-B6CIRZI4.cjs} +2 -2
  45. package/dist/{chunk-REZAPK6Z.mjs → chunk-BDFUHPX2.mjs} +1 -1
  46. package/dist/{chunk-CXPF274N.mjs → chunk-BK77KKIM.mjs} +1 -1
  47. package/dist/{chunk-ZJSL6HSL.mjs → chunk-BLG4IPRR.mjs} +1 -1
  48. package/dist/{chunk-JQYMF2FW.cjs → chunk-BSDIS4KS.cjs} +4 -4
  49. package/dist/{chunk-35ZN6IW7.mjs → chunk-BYZ7HIIK.mjs} +1 -1
  50. package/dist/{chunk-6C53NKMF.mjs → chunk-C4U5BMQH.mjs} +1 -1
  51. package/dist/{chunk-2IS7TXTN.mjs → chunk-CENP2PIB.mjs} +1 -1
  52. package/dist/{chunk-NJWKR5WR.mjs → chunk-CEYNTMQP.mjs} +1 -1
  53. package/dist/{chunk-CIOLL5LX.mjs → chunk-CN6SZKJZ.mjs} +1 -1
  54. package/dist/{chunk-WDSOII5A.cjs → chunk-COJRGW3A.cjs} +2 -2
  55. package/dist/{chunk-GRXUYMZJ.cjs → chunk-COL2MXGC.cjs} +4 -4
  56. package/dist/chunk-CRY23RMB.mjs +30 -0
  57. package/dist/{chunk-CKGEV2JL.cjs → chunk-CV2EDA3W.cjs} +2 -2
  58. package/dist/{chunk-7AAMQGY2.cjs → chunk-CYWVJ3HF.cjs} +7 -7
  59. package/dist/{chunk-CWS5PF67.cjs → chunk-D5WTSBUX.cjs} +3 -3
  60. package/dist/{chunk-ASZIBFA6.cjs → chunk-DG2EVWIW.cjs} +10 -10
  61. package/dist/chunk-DGJ7E77I.mjs +23 -0
  62. package/dist/{chunk-SR3M2R3S.mjs → chunk-DSQPFXYL.mjs} +22 -24
  63. package/dist/chunk-DVUN6GQI.cjs +21 -0
  64. package/dist/chunk-E7ACJ3NX.cjs +45 -0
  65. package/dist/{chunk-T4U3BG2V.mjs → chunk-EGJLY5VZ.mjs} +1 -1
  66. package/dist/{chunk-PRNBDGOF.cjs → chunk-EMZEL54F.cjs} +27 -49
  67. package/dist/{chunk-7AEOJFD4.cjs → chunk-EOTGD64D.cjs} +2 -2
  68. package/dist/{chunk-K2ZYSKRU.mjs → chunk-EZ536NLQ.mjs} +1 -1
  69. package/dist/chunk-FB3M2JJV.cjs +21 -0
  70. package/dist/{chunk-DDU3SPCC.mjs → chunk-FUMJBAQI.mjs} +57 -4
  71. package/dist/{chunk-QXFFRQ7E.mjs → chunk-G45SP3DA.mjs} +90 -60
  72. package/dist/{chunk-HB65PF7F.cjs → chunk-GBRIW266.cjs} +2 -2
  73. package/dist/chunk-GHQA7PER.mjs +107 -0
  74. package/dist/{chunk-XQ3MWA3D.mjs → chunk-GJKFQHUX.mjs} +3 -3
  75. package/dist/{chunk-ND3WJ63Z.cjs → chunk-GVRVRBDU.cjs} +2 -2
  76. package/dist/chunk-GZ2BG42R.mjs +34 -0
  77. package/dist/chunk-H3JRYX2U.mjs +19 -0
  78. package/dist/{chunk-T66ETI7E.mjs → chunk-HBEU2PU2.mjs} +6 -1
  79. package/dist/{chunk-EVBYVJTW.mjs → chunk-HGN7J4CP.mjs} +2 -2
  80. package/dist/{chunk-SMXN2KOV.mjs → chunk-HGTL7DFT.mjs} +1 -1
  81. package/dist/{chunk-QO2AM6MF.mjs → chunk-HIDTQ4Z2.mjs} +1 -1
  82. package/dist/{chunk-3NIMV5PH.mjs → chunk-HUPECWNG.mjs} +1 -1
  83. package/dist/{chunk-H7RH4CZ7.cjs → chunk-HVACIZB5.cjs} +7 -7
  84. package/dist/{chunk-R4HT3SYR.cjs → chunk-HZBP6QTE.cjs} +2 -2
  85. package/dist/{chunk-2GXIGEKC.mjs → chunk-IKSER6BF.mjs} +2 -2
  86. package/dist/{chunk-UQQBUPGF.mjs → chunk-IPMWGCAI.mjs} +5 -21
  87. package/dist/{chunk-Q7WCKEXG.cjs → chunk-JF43YF6J.cjs} +3 -3
  88. package/dist/{chunk-MXGPFCLN.cjs → chunk-JVZ6J2UX.cjs} +2 -2
  89. package/dist/{chunk-EY6PKK4X.cjs → chunk-KKGDRIR2.cjs} +2 -2
  90. package/dist/{chunk-SAXISARG.cjs → chunk-KWSH253U.cjs} +2 -2
  91. package/dist/{chunk-K2BQNNEX.cjs → chunk-L6W77P4B.cjs} +8 -8
  92. package/dist/{chunk-N4Y5CBOI.cjs → chunk-LGUQR5AR.cjs} +4 -4
  93. package/dist/{chunk-MYZHDWBF.mjs → chunk-LJYIEOGQ.mjs} +11 -11
  94. package/dist/{chunk-332A4MHC.mjs → chunk-LNYUFL3Q.mjs} +1 -1
  95. package/dist/{chunk-JFPIUDGT.mjs → chunk-LOMLR5AA.mjs} +1 -1
  96. package/dist/{chunk-6D7FGGSX.cjs → chunk-MMQR4IEY.cjs} +27 -27
  97. package/dist/{chunk-BUAWPPXA.cjs → chunk-MQ5DGLVE.cjs} +11 -11
  98. package/dist/{chunk-EXY6WRH4.mjs → chunk-N6KP2HIC.mjs} +2 -2
  99. package/dist/{chunk-NKGUQZTD.cjs → chunk-NC2U7QTW.cjs} +2 -2
  100. package/dist/{chunk-V75PKBIV.cjs → chunk-NEJKCSS5.cjs} +9 -9
  101. package/dist/{chunk-KPGZOX2A.cjs → chunk-NHFIDL5X.cjs} +5 -5
  102. package/dist/{chunk-JNV3UBBP.cjs → chunk-NIACIZWY.cjs} +6 -22
  103. package/dist/{chunk-PC5DHSC4.mjs → chunk-NKUK73WB.mjs} +71 -1
  104. package/dist/{chunk-5OZS5UJX.cjs → chunk-NSPAT6XV.cjs} +7 -7
  105. package/dist/{chunk-4BQPIY5Z.mjs → chunk-O2NGB7YP.mjs} +1 -1
  106. package/dist/{chunk-7H7U2X45.cjs → chunk-O3DFVRON.cjs} +17 -13
  107. package/dist/{chunk-IAFCABPY.mjs → chunk-O5YP3JQ4.mjs} +1 -1
  108. package/dist/chunk-OBWKFURE.cjs +2 -0
  109. package/dist/{chunk-S37MJNNP.cjs → chunk-OCADGDGL.cjs} +2 -2
  110. package/dist/{chunk-UMGNAR3W.cjs → chunk-OON7LFBQ.cjs} +8 -8
  111. package/dist/{chunk-ZSAPBZ36.mjs → chunk-OW653F7T.mjs} +1 -1
  112. package/dist/{chunk-GQYUSBSO.mjs → chunk-P3FBRYWH.mjs} +3 -10
  113. package/dist/{chunk-P3YSHGT5.mjs → chunk-P55DAW6H.mjs} +1 -1
  114. package/dist/{chunk-JOOURIX7.cjs → chunk-P6E4WLMD.cjs} +4 -4
  115. package/dist/{chunk-SCUMWMIN.mjs → chunk-PC42NEBI.mjs} +1 -1
  116. package/dist/{chunk-F3HOBNGR.cjs → chunk-PMG3NZF5.cjs} +4 -4
  117. package/dist/{chunk-PV6CEMTT.cjs → chunk-PWZ4F3WY.cjs} +4 -4
  118. package/dist/{chunk-7A5EMDZH.mjs → chunk-PZDC5ZKG.mjs} +5 -5
  119. package/dist/{chunk-LVIZRMYN.cjs → chunk-QF3JWGWX.cjs} +2 -2
  120. package/dist/{chunk-BXZSWY4N.mjs → chunk-QYJZ5KA6.mjs} +1 -1
  121. package/dist/{chunk-AE5YDMFT.mjs → chunk-QYYMLZFE.mjs} +3 -3
  122. package/dist/{chunk-JYYAGDLZ.cjs → chunk-R22VW3EK.cjs} +2 -2
  123. package/dist/{chunk-U22YVR7M.mjs → chunk-RLY4A3IY.mjs} +15 -6
  124. package/dist/{chunk-OLYHHP67.mjs → chunk-RS4T6S3Z.mjs} +1 -1
  125. package/dist/{chunk-L2XJ5Q7T.cjs → chunk-RTZNHV43.cjs} +21 -21
  126. package/dist/{chunk-D562KO2I.mjs → chunk-RWHVZM2B.mjs} +2 -2
  127. package/dist/{chunk-PR3BCKLJ.mjs → chunk-S4BL7C3Y.mjs} +1 -1
  128. package/dist/chunk-S4C7HO32.cjs +36 -0
  129. package/dist/{chunk-DAVMLI3P.cjs → chunk-SNUQOJLK.cjs} +4 -4
  130. package/dist/{chunk-KY2PYKDZ.mjs → chunk-SO5KFX2C.mjs} +1 -1
  131. package/dist/{chunk-WDS3VL7E.mjs → chunk-SQJL67BU.mjs} +3 -3
  132. package/dist/{chunk-RW4T7UBU.cjs → chunk-STJMH4NX.cjs} +3 -3
  133. package/dist/{chunk-VYINXXYX.cjs → chunk-SUWJDU3Y.cjs} +59 -61
  134. package/dist/chunk-T2BDPMCF.cjs +358 -0
  135. package/dist/{chunk-U5W4ZALG.cjs → chunk-T2OAWYOU.cjs} +6 -6
  136. package/dist/{chunk-RGOZPSTI.mjs → chunk-TMBHKVKH.mjs} +1 -1
  137. package/dist/{chunk-VTW2DF63.mjs → chunk-TWDDNHRP.mjs} +1 -1
  138. package/dist/chunk-U4AANBRZ.mjs +1 -0
  139. package/dist/{chunk-DDIB73SZ.mjs → chunk-UB3ELCFR.mjs} +4 -4
  140. package/dist/chunk-UCAIVC2B.cjs +32 -0
  141. package/dist/{chunk-EK3BTKZP.cjs → chunk-UFYHIDMC.cjs} +123 -26
  142. package/dist/{chunk-KQW3YARN.cjs → chunk-UTHAZV2T.cjs} +62 -9
  143. package/dist/{chunk-G5VBLDAM.mjs → chunk-VBEVJE7Q.mjs} +1 -1
  144. package/dist/{chunk-66NKH2SV.cjs → chunk-VW2NEQHK.cjs} +6 -6
  145. package/dist/{chunk-VWVYCQWF.mjs → chunk-WBM7ATPT.mjs} +1 -1
  146. package/dist/{chunk-QBAZ6TKZ.cjs → chunk-WQT7JQN4.cjs} +2 -2
  147. package/dist/{chunk-DAA2GQAS.cjs → chunk-WRJAYU2L.cjs} +27 -27
  148. package/dist/{chunk-GTBXRWCK.cjs → chunk-WYD3KNAT.cjs} +3 -3
  149. package/dist/{chunk-EBFPZBUQ.cjs → chunk-WYUJM72T.cjs} +7 -7
  150. package/dist/{chunk-XTLGNJIO.mjs → chunk-XC25ZQ7H.mjs} +1 -1
  151. package/dist/{chunk-4PMXRQXC.cjs → chunk-XDIHVSZ5.cjs} +6 -6
  152. package/dist/{chunk-7ACZU3BT.mjs → chunk-XHNM6XE3.mjs} +1 -1
  153. package/dist/{chunk-WHV6Z7YX.mjs → chunk-XIESS6HW.mjs} +1 -1
  154. package/dist/{chunk-IU65XB2K.cjs → chunk-XMVARRN6.cjs} +2 -2
  155. package/dist/{chunk-UIJEAY6H.mjs → chunk-XTZURZIR.mjs} +1 -1
  156. package/dist/{chunk-7AZ3PLUC.mjs → chunk-XZLQHASB.mjs} +1 -1
  157. package/dist/{chunk-SRZ56OJH.mjs → chunk-XZTEU7ME.mjs} +3 -3
  158. package/dist/{chunk-RLTLA7VS.mjs → chunk-Y2IIKDRY.mjs} +1 -1
  159. package/dist/{chunk-5AKVDZMA.cjs → chunk-YAFKQ5ZV.cjs} +12 -12
  160. package/dist/{chunk-3DIFS7CO.mjs → chunk-YBUMQX6M.mjs} +1 -1
  161. package/dist/{chunk-CR6JOOO3.cjs → chunk-YGZHBIZP.cjs} +3 -10
  162. package/dist/{chunk-TWQONYWC.mjs → chunk-YMMSHGYC.mjs} +1 -1
  163. package/dist/{chunk-ZS7ESTKH.cjs → chunk-Z42BBOSG.cjs} +8 -12
  164. package/dist/{chunk-ZA7WOIIB.mjs → chunk-Z7PWETGZ.mjs} +1 -1
  165. package/dist/{chunk-3ZEQVODC.cjs → chunk-ZAK7AFVY.cjs} +2 -2
  166. package/dist/{chunk-W3IHFG4B.cjs → chunk-ZG33TW5I.cjs} +8 -8
  167. package/dist/chunk-ZQ2DPA2M.mjs +43 -0
  168. package/dist/{chunk-AHD46BFN.mjs → chunk-ZQOQB6GF.mjs} +1 -1
  169. package/dist/dial/DialPanel.cjs +88 -86
  170. package/dist/dial/DialPanel.d.cts +2 -3
  171. package/dist/dial/DialPanel.d.ts +2 -3
  172. package/dist/dial/DialPanel.mjs +87 -85
  173. package/dist/dial/DialProvider.d.cts +16 -51
  174. package/dist/dial/DialProvider.d.ts +16 -51
  175. package/dist/dial/index.cjs +104 -102
  176. package/dist/dial/index.d.cts +2 -1
  177. package/dist/dial/index.d.ts +2 -1
  178. package/dist/dial/index.mjs +87 -85
  179. package/dist/dial/types.cjs +4 -0
  180. package/dist/dial/types.d.cts +110 -0
  181. package/dist/dial/types.d.ts +110 -0
  182. package/dist/dial/types.mjs +1 -0
  183. package/dist/dial/wrapped-inputs/ControlledInputs.cjs +92 -90
  184. package/dist/dial/wrapped-inputs/ControlledInputs.d.cts +1 -2
  185. package/dist/dial/wrapped-inputs/ControlledInputs.d.ts +1 -2
  186. package/dist/dial/wrapped-inputs/ControlledInputs.mjs +87 -85
  187. package/dist/dial/wrapped-inputs/DialInputs.cjs +101 -99
  188. package/dist/dial/wrapped-inputs/DialInputs.d.cts +1 -2
  189. package/dist/dial/wrapped-inputs/DialInputs.d.ts +1 -2
  190. package/dist/dial/wrapped-inputs/DialInputs.mjs +87 -85
  191. package/dist/dial/wrapped-inputs/DialInterfaceInput.cjs +129 -0
  192. package/dist/dial/wrapped-inputs/DialInterfaceInput.d.cts +8 -0
  193. package/dist/dial/wrapped-inputs/DialInterfaceInput.d.ts +8 -0
  194. package/dist/dial/wrapped-inputs/DialInterfaceInput.mjs +120 -0
  195. package/dist/dial/wrapped-inputs/DialPresetsInput.cjs +83 -82
  196. package/dist/dial/wrapped-inputs/DialPresetsInput.d.cts +1 -2
  197. package/dist/dial/wrapped-inputs/DialPresetsInput.d.ts +1 -2
  198. package/dist/dial/wrapped-inputs/DialPresetsInput.mjs +82 -81
  199. package/dist/dial/wrapped-inputs/DialVectorInput.cjs +88 -86
  200. package/dist/dial/wrapped-inputs/DialVectorInput.mjs +87 -85
  201. package/dist/dial/wrapped-inputs/index.cjs +108 -106
  202. package/dist/dial/wrapped-inputs/index.d.cts +1 -2
  203. package/dist/dial/wrapped-inputs/index.d.ts +1 -2
  204. package/dist/dial/wrapped-inputs/index.mjs +87 -85
  205. package/dist/highlight-cursor/cursor-provider.cjs +3 -3
  206. package/dist/highlight-cursor/cursor-provider.mjs +2 -2
  207. package/dist/highlight-cursor/enhanced-components.cjs +13 -13
  208. package/dist/highlight-cursor/enhanced-components.d.cts +1 -1
  209. package/dist/highlight-cursor/enhanced-components.d.ts +1 -1
  210. package/dist/highlight-cursor/enhanced-components.mjs +8 -8
  211. package/dist/highlight-cursor/index.cjs +18 -18
  212. package/dist/highlight-cursor/index.mjs +9 -9
  213. package/dist/hooks/cn.cjs +2 -2
  214. package/dist/hooks/cn.mjs +1 -1
  215. package/dist/hooks/index.cjs +4 -4
  216. package/dist/hooks/index.mjs +2 -2
  217. package/dist/hooks/useIsMobile.cjs +2 -2
  218. package/dist/hooks/useIsMobile.mjs +1 -1
  219. package/dist/index.cjs +463 -369
  220. package/dist/index.css +0 -63
  221. package/dist/index.d.cts +7 -4
  222. package/dist/index.d.ts +7 -4
  223. package/dist/index.mjs +87 -85
  224. package/dist/ui/DialBadge.cjs +7 -7
  225. package/dist/ui/DialBadge.mjs +3 -3
  226. package/dist/ui/UIKitBadge.cjs +7 -7
  227. package/dist/ui/UIKitBadge.mjs +3 -3
  228. package/dist/ui/avatar.cjs +7 -7
  229. package/dist/ui/avatar.mjs +3 -3
  230. package/dist/ui/badge.cjs +5 -5
  231. package/dist/ui/badge.d.cts +1 -1
  232. package/dist/ui/badge.d.ts +1 -1
  233. package/dist/ui/badge.mjs +3 -3
  234. package/dist/ui/button.cjs +5 -5
  235. package/dist/ui/button.d.cts +1 -1
  236. package/dist/ui/button.d.ts +1 -1
  237. package/dist/ui/button.mjs +3 -3
  238. package/dist/ui/card.cjs +11 -10
  239. package/dist/ui/card.d.cts +14 -2
  240. package/dist/ui/card.d.ts +14 -2
  241. package/dist/ui/card.mjs +4 -3
  242. package/dist/ui/checkbox.cjs +4 -4
  243. package/dist/ui/checkbox.mjs +3 -3
  244. package/dist/ui/collapsible.cjs +6 -6
  245. package/dist/ui/collapsible.mjs +3 -3
  246. package/dist/ui/context-menu.cjs +76 -0
  247. package/dist/ui/context-menu.d.cts +28 -0
  248. package/dist/ui/context-menu.d.ts +28 -0
  249. package/dist/ui/context-menu.mjs +11 -0
  250. package/dist/ui/drawer.cjs +13 -13
  251. package/dist/ui/drawer.mjs +3 -3
  252. package/dist/ui/dropdown.cjs +18 -18
  253. package/dist/ui/dropdown.mjs +3 -3
  254. package/dist/ui/icons/index.cjs +9 -9
  255. package/dist/ui/icons/index.mjs +1 -1
  256. package/dist/ui/index.cjs +423 -330
  257. package/dist/ui/index.d.cts +5 -3
  258. package/dist/ui/index.d.ts +5 -3
  259. package/dist/ui/index.mjs +81 -80
  260. package/dist/ui/inputs/color-input.cjs +5 -5
  261. package/dist/ui/inputs/color-input.mjs +4 -4
  262. package/dist/ui/inputs/index.cjs +61 -61
  263. package/dist/ui/inputs/index.mjs +22 -22
  264. package/dist/ui/inputs/input-numbers.cjs +5 -5
  265. package/dist/ui/inputs/input-numbers.mjs +4 -4
  266. package/dist/ui/inputs/input.cjs +6 -6
  267. package/dist/ui/inputs/input.mjs +3 -3
  268. package/dist/ui/inputs/number-inputs/CmInput.cjs +6 -6
  269. package/dist/ui/inputs/number-inputs/CmInput.mjs +5 -5
  270. package/dist/ui/inputs/number-inputs/DegInput.cjs +6 -6
  271. package/dist/ui/inputs/number-inputs/DegInput.mjs +5 -5
  272. package/dist/ui/inputs/number-inputs/EulerDegInput.cjs +8 -8
  273. package/dist/ui/inputs/number-inputs/EulerDegInput.mjs +7 -7
  274. package/dist/ui/inputs/number-inputs/EulerInput.cjs +7 -7
  275. package/dist/ui/inputs/number-inputs/EulerInput.mjs +6 -6
  276. package/dist/ui/inputs/number-inputs/EulerRadInput.cjs +7 -7
  277. package/dist/ui/inputs/number-inputs/EulerRadInput.mjs +6 -6
  278. package/dist/ui/inputs/number-inputs/InchInput.cjs +6 -6
  279. package/dist/ui/inputs/number-inputs/InchInput.mjs +5 -5
  280. package/dist/ui/inputs/number-inputs/IntInput.cjs +6 -6
  281. package/dist/ui/inputs/number-inputs/IntInput.mjs +5 -5
  282. package/dist/ui/inputs/number-inputs/KVectorInput.cjs +7 -7
  283. package/dist/ui/inputs/number-inputs/KVectorInput.mjs +6 -6
  284. package/dist/ui/inputs/number-inputs/QuaternionInput.cjs +7 -7
  285. package/dist/ui/inputs/number-inputs/QuaternionInput.mjs +6 -6
  286. package/dist/ui/inputs/number-inputs/RadInput.cjs +6 -6
  287. package/dist/ui/inputs/number-inputs/RadInput.mjs +5 -5
  288. package/dist/ui/inputs/number-inputs/TimeInput.cjs +6 -6
  289. package/dist/ui/inputs/number-inputs/TimeInput.mjs +5 -5
  290. package/dist/ui/inputs/number-inputs/Vec3Input.cjs +7 -7
  291. package/dist/ui/inputs/number-inputs/Vec3Input.mjs +6 -6
  292. package/dist/ui/inputs/number-inputs/VectorInput.cjs +6 -6
  293. package/dist/ui/inputs/number-inputs/VectorInput.mjs +5 -5
  294. package/dist/ui/inputs/number-inputs/index.cjs +42 -42
  295. package/dist/ui/inputs/number-inputs/index.mjs +17 -17
  296. package/dist/ui/inputs/presets-input.cjs +7 -7
  297. package/dist/ui/inputs/presets-input.mjs +6 -6
  298. package/dist/ui/inputs/presets-rad-input.cjs +8 -8
  299. package/dist/ui/inputs/presets-rad-input.mjs +7 -7
  300. package/dist/ui/inputs/text-input.cjs +5 -5
  301. package/dist/ui/inputs/text-input.mjs +4 -4
  302. package/dist/ui/label.cjs +4 -4
  303. package/dist/ui/label.mjs +3 -3
  304. package/dist/ui/layout.cjs +4 -4
  305. package/dist/ui/layout.mjs +3 -3
  306. package/dist/ui/layouts/dock-layout/DockLayoutView.cjs +5 -5
  307. package/dist/ui/layouts/dock-layout/DockLayoutView.d.cts +2 -1
  308. package/dist/ui/layouts/dock-layout/DockLayoutView.d.ts +2 -1
  309. package/dist/ui/layouts/dock-layout/DockLayoutView.mjs +4 -4
  310. package/dist/ui/layouts/dock-layout/LayoutSlots.cjs +9 -9
  311. package/dist/ui/layouts/dock-layout/LayoutSlots.mjs +3 -3
  312. package/dist/ui/layouts/dock-layout/index.cjs +11 -11
  313. package/dist/ui/layouts/dock-layout/index.mjs +4 -4
  314. package/dist/ui/layouts/index.cjs +18 -18
  315. package/dist/ui/layouts/index.mjs +7 -7
  316. package/dist/ui/layouts/liquid-layout/LayoutSlots.cjs +9 -9
  317. package/dist/ui/layouts/liquid-layout/LayoutSlots.mjs +3 -3
  318. package/dist/ui/layouts/liquid-layout/LiquidLayoutView.cjs +5 -5
  319. package/dist/ui/layouts/liquid-layout/LiquidLayoutView.d.cts +13 -1
  320. package/dist/ui/layouts/liquid-layout/LiquidLayoutView.d.ts +13 -1
  321. package/dist/ui/layouts/liquid-layout/LiquidLayoutView.mjs +4 -4
  322. package/dist/ui/layouts/liquid-layout/index.cjs +5 -5
  323. package/dist/ui/layouts/liquid-layout/index.mjs +4 -4
  324. package/dist/ui/modal.cjs +13 -13
  325. package/dist/ui/modal.mjs +3 -3
  326. package/dist/ui/navigation.cjs +5 -5
  327. package/dist/ui/navigation.mjs +4 -4
  328. package/dist/ui/pagination.cjs +11 -11
  329. package/dist/ui/pagination.mjs +4 -4
  330. package/dist/ui/popover.cjs +7 -7
  331. package/dist/ui/popover.mjs +3 -3
  332. package/dist/ui/progress.cjs +4 -4
  333. package/dist/ui/progress.d.cts +1 -1
  334. package/dist/ui/progress.d.ts +1 -1
  335. package/dist/ui/progress.mjs +3 -3
  336. package/dist/ui/radio-group.cjs +5 -5
  337. package/dist/ui/radio-group.mjs +3 -3
  338. package/dist/ui/resizable.cjs +6 -6
  339. package/dist/ui/resizable.mjs +3 -3
  340. package/dist/ui/select.cjs +14 -14
  341. package/dist/ui/select.mjs +3 -3
  342. package/dist/ui/separator.cjs +4 -4
  343. package/dist/ui/separator.mjs +3 -3
  344. package/dist/ui/sheet.cjs +11 -11
  345. package/dist/ui/sheet.d.cts +26 -13
  346. package/dist/ui/sheet.d.ts +26 -13
  347. package/dist/ui/sheet.mjs +3 -3
  348. package/dist/ui/sidebar.cjs +33 -33
  349. package/dist/ui/sidebar.mjs +9 -9
  350. package/dist/ui/simple-tree-view.cjs +4 -4
  351. package/dist/ui/simple-tree-view.mjs +3 -3
  352. package/dist/ui/skeleton.cjs +4 -4
  353. package/dist/ui/skeleton.mjs +3 -3
  354. package/dist/ui/slider.cjs +4 -4
  355. package/dist/ui/slider.mjs +3 -3
  356. package/dist/ui/switch.cjs +4 -4
  357. package/dist/ui/switch.mjs +3 -3
  358. package/dist/ui/table.cjs +11 -11
  359. package/dist/ui/table.mjs +3 -3
  360. package/dist/ui/tabs.cjs +7 -7
  361. package/dist/ui/tabs.d.cts +21 -6
  362. package/dist/ui/tabs.d.ts +21 -6
  363. package/dist/ui/tabs.mjs +3 -3
  364. package/dist/ui/textarea.cjs +4 -4
  365. package/dist/ui/textarea.mjs +3 -3
  366. package/dist/ui/theme/ThemeProvider.d.cts +1 -1
  367. package/dist/ui/theme/ThemeProvider.d.ts +1 -1
  368. package/dist/ui/theme/ThemeToggles.cjs +7 -7
  369. package/dist/ui/theme/ThemeToggles.mjs +5 -5
  370. package/dist/ui/theme/index.cjs +7 -7
  371. package/dist/ui/theme/index.mjs +5 -5
  372. package/dist/ui/toast.cjs +19 -3
  373. package/dist/ui/toast.d.cts +1 -1
  374. package/dist/ui/toast.d.ts +1 -1
  375. package/dist/ui/toast.mjs +17 -1
  376. package/dist/ui/toggle-buttons.cjs +8 -8
  377. package/dist/ui/toggle-buttons.mjs +3 -3
  378. package/dist/ui/toggle-group.cjs +6 -6
  379. package/dist/ui/toggle-group.mjs +3 -3
  380. package/dist/ui/toggle.cjs +5 -5
  381. package/dist/ui/toggle.mjs +3 -3
  382. package/dist/ui/toolbar.cjs +6 -6
  383. package/dist/ui/toolbar.mjs +3 -3
  384. package/dist/ui/tooltip.cjs +7 -7
  385. package/dist/ui/tooltip.d.cts +2 -2
  386. package/dist/ui/tooltip.d.ts +2 -2
  387. package/dist/ui/tooltip.mjs +3 -3
  388. package/dist/ui/tree-view/TreeSearchBar.cjs +6 -6
  389. package/dist/ui/tree-view/TreeSearchBar.mjs +5 -5
  390. package/dist/ui/tree-view/TreeView.cjs +7 -5
  391. package/dist/ui/tree-view/TreeView.d.cts +12 -6
  392. package/dist/ui/tree-view/TreeView.d.ts +12 -6
  393. package/dist/ui/tree-view/TreeView.mjs +5 -3
  394. package/dist/ui/tree-view/hooks.cjs +31 -3
  395. package/dist/ui/tree-view/hooks.d.cts +33 -1
  396. package/dist/ui/tree-view/hooks.d.ts +33 -1
  397. package/dist/ui/tree-view/hooks.mjs +1 -1
  398. package/dist/ui/tree-view/index.cjs +46 -17
  399. package/dist/ui/tree-view/index.d.cts +1 -1
  400. package/dist/ui/tree-view/index.d.ts +1 -1
  401. package/dist/ui/tree-view/index.mjs +8 -7
  402. package/dist/ui/tree-view-legacy.cjs +10 -10
  403. package/dist/ui/tree-view-legacy.mjs +6 -6
  404. package/dist/ui/waterfall/CursorOverlay.cjs +4 -4
  405. package/dist/ui/waterfall/CursorOverlay.mjs +3 -3
  406. package/dist/ui/waterfall/TimelineEvent.cjs +4 -4
  407. package/dist/ui/waterfall/TimelineEvent.mjs +3 -3
  408. package/dist/ui/waterfall/TimelineProcessBar.cjs +4 -4
  409. package/dist/ui/waterfall/TimelineProcessBar.mjs +3 -3
  410. package/dist/ui/waterfall/Wedges.cjs +5 -5
  411. package/dist/ui/waterfall/Wedges.mjs +3 -3
  412. package/dist/ui/waterfall/index.cjs +16 -15
  413. package/dist/ui/waterfall/index.mjs +15 -14
  414. package/package.json +2 -1
  415. package/src/auth/components/index.ts +1 -1
  416. package/src/dial/DialPanel.tsx +52 -27
  417. package/src/dial/DialProvider.tsx +20 -68
  418. package/src/dial/index.ts +7 -5
  419. package/src/dial/types.ts +40 -0
  420. package/src/dial/wrapped-inputs/ControlledInputs.tsx +6 -5
  421. package/src/dial/wrapped-inputs/DialInputs.tsx +2 -1
  422. package/src/dial/wrapped-inputs/DialInterfaceInput.tsx +44 -0
  423. package/src/dial/wrapped-inputs/DialPresetsInput.tsx +3 -2
  424. package/src/dial/wrapped-inputs/DialVectorInput.tsx +3 -18
  425. package/src/hooks/cn.ts +5 -0
  426. package/src/hooks/useIsMobile.ts +14 -30
  427. package/src/index.css +0 -1
  428. package/src/ui/DialBadge.tsx +7 -5
  429. package/src/ui/card.tsx +76 -4
  430. package/src/ui/context-menu.tsx +358 -0
  431. package/src/ui/index.ts +2 -0
  432. package/src/ui/inputs/number-inputs/EulerRadInput.tsx +43 -42
  433. package/src/ui/inputs/number-inputs/VectorInput.tsx +0 -1
  434. package/src/ui/inputs/presets-rad-input.tsx +5 -2
  435. package/src/ui/inputs/text-input.tsx +1 -1
  436. package/src/ui/layouts/dock-layout/DockLayoutView.tsx +15 -4
  437. package/src/ui/layouts/dock-layout/LayoutSlots.tsx +14 -5
  438. package/src/ui/layouts/liquid-layout/LiquidLayoutView.tsx +44 -5
  439. package/src/ui/progress.tsx +7 -14
  440. package/src/ui/separator.tsx +1 -1
  441. package/src/ui/sheet.tsx +14 -116
  442. package/src/ui/sidebar.tsx +18 -19
  443. package/src/ui/tabs.tsx +27 -57
  444. package/src/ui/toast.tsx +15 -16
  445. package/src/ui/tooltip.tsx +3 -30
  446. package/src/ui/tree-view/TreeView.tsx +147 -18
  447. package/src/ui/tree-view/hooks.tsx +148 -0
  448. package/src/ui/tree-view/types.ts +1 -1
  449. package/src/ui/waterfall/TimelineProcessBar.tsx +10 -4
  450. package/dist/chunk-EOSYXHEH.mjs +0 -27
  451. package/dist/chunk-EXXV3BXT.cjs +0 -23
  452. package/dist/chunk-FZAGJSW2.cjs +0 -47
  453. package/dist/chunk-IPQU5CJD.mjs +0 -21
  454. package/dist/chunk-JR4TVE43.cjs +0 -31
  455. package/dist/chunk-LAPOK2L4.mjs +0 -193
  456. package/dist/chunk-MFYDZKQF.mjs +0 -28
  457. package/dist/chunk-Q3CJUGX3.cjs +0 -21
  458. package/dist/chunk-RTYZO2AC.cjs +0 -30
  459. package/dist/chunk-V5T6XOSB.cjs +0 -222
  460. package/dist/chunk-XHJDRQD7.mjs +0 -29
  461. package/dist/chunk-Y2XVZEXM.mjs +0 -45
  462. package/dist/dial/DialProvider.example.cjs +0 -72
  463. package/dist/dial/DialProvider.example.d.cts +0 -7
  464. package/dist/dial/DialProvider.example.d.ts +0 -7
  465. package/dist/dial/DialProvider.example.mjs +0 -68
  466. package/dist/styles/toast.css +0 -64
  467. package/dist/styles/toast.d.cts +0 -2
  468. package/dist/styles/toast.d.ts +0 -2
  469. package/src/dial/DialProvider.example.tsx +0 -80
  470. package/src/styles/toast.css +0 -67
  471. /package/dist/{chunk-YYLBP356.mjs → chunk-6THKQIF7.mjs} +0 -0
  472. /package/dist/{chunk-YWECB5GR.cjs → chunk-F4NQLN5E.cjs} +0 -0
package/src/ui/tabs.tsx CHANGED
@@ -3,7 +3,7 @@ import { cva } from "class-variance-authority";
3
3
  import { type ComponentProps, createContext, useContext } from "react";
4
4
 
5
5
  import { TabsCursorProvider, useTabsCursor } from "../highlight-cursor/tabs-cursor-context";
6
- import { cn, createClientOnlyComponent } from "../hooks";
6
+ import { cn } from "../hooks";
7
7
 
8
8
  interface TabsContextType {
9
9
  size?: "sm" | "base" | "lg";
@@ -29,7 +29,7 @@ interface TabsProps extends ComponentProps<typeof TabsPrimitive.Root> {
29
29
  * @param props -
30
30
  * @param className -
31
31
  * @param size - Control size ("sm" | "base" | "lg"), defaults to "base" */
32
- function TabsRoot({ className, size = "base", ...props }: TabsProps) {
32
+ function Tabs({ className, size = "base", ...props }: TabsProps) {
33
33
  return (
34
34
  <TabsContext.Provider value={{ size }}>
35
35
  <TabsPrimitive.Root
@@ -41,16 +41,6 @@ function TabsRoot({ className, size = "base", ...props }: TabsProps) {
41
41
  );
42
42
  }
43
43
 
44
- function TabsFallback({ className, size = "base", ...props }: TabsProps & ComponentProps<"div">) {
45
- return (
46
- <TabsContext.Provider value={{ size }}>
47
- <div data-slot="tabs" className={cn("flex w-full flex-col", className)} {...props} />
48
- </TabsContext.Provider>
49
- );
50
- }
51
-
52
- const Tabs = createClientOnlyComponent(TabsRoot, TabsFallback);
53
-
54
44
  const tabsListVariants = cva(["inline-flex", "items-center", "justify-center"], {
55
45
  variants: {
56
46
  size: {
@@ -69,36 +59,38 @@ type TabsListProps = ComponentProps<typeof TabsPrimitive.List>;
69
59
  /**
70
60
  * Container for tab triggers. Emits cursor interactions for visual effects.
71
61
  */
72
- function TabsListRoot({ className, ...props }: TabsListProps) {
73
- const { setCursorTarget } = useTabsCursor();
62
+ function TabsList({ className, onMouseLeave, ...props }: TabsListProps) {
74
63
  const { size } = useTabsContext();
75
64
  return (
76
65
  <TabsCursorProvider>
77
- <TabsPrimitive.List
78
- onMouseLeave={() => setCursorTarget(null)}
79
- data-slot="tabs-list"
80
- className={cn(tabsListVariants({ size }), "justify-start", className)}
81
- {...props}
82
- />
66
+ <TabsListInner className={className} size={size} onMouseLeave={onMouseLeave} {...props} />
83
67
  </TabsCursorProvider>
84
68
  );
85
69
  }
86
70
 
87
- function TabsListFallback({ className, ...props }: TabsListProps & ComponentProps<"div">) {
88
- const { size } = useTabsContext();
71
+ function TabsListInner({
72
+ className,
73
+ size,
74
+ onMouseLeave,
75
+ ...props
76
+ }: TabsListProps & { size?: "sm" | "base" | "lg" }) {
77
+ const { setCursorTarget } = useTabsCursor();
78
+
79
+ const handleMouseLeave = (e: React.MouseEvent<HTMLDivElement>) => {
80
+ setCursorTarget(null);
81
+ onMouseLeave?.(e);
82
+ };
83
+
89
84
  return (
90
- <TabsCursorProvider>
91
- <div
92
- data-slot="tabs-list"
93
- className={cn(tabsListVariants({ size }), "justify-start", className)}
94
- {...props}
95
- />
96
- </TabsCursorProvider>
85
+ <TabsPrimitive.List
86
+ onMouseLeave={handleMouseLeave}
87
+ data-slot="tabs-list"
88
+ className={cn(tabsListVariants({ size }), "justify-start", className)}
89
+ {...props}
90
+ />
97
91
  );
98
92
  }
99
93
 
100
- const TabsList = createClientOnlyComponent(TabsListRoot, TabsListFallback);
101
-
102
94
  const tabsTriggerVariants = cva(
103
95
  [
104
96
  "inline-flex",
@@ -114,8 +106,9 @@ const tabsTriggerVariants = cva(
114
106
  "shrink-0",
115
107
  "[&_svg]:shrink-0",
116
108
  "outline-none",
117
- "text-text-primary",
109
+ "text-text-secondary",
118
110
  "data-[state=active]:bg-bg-secondary",
111
+ "data-[state=active]:text-text-primary",
119
112
  "data-[state=active]:font-medium",
120
113
  ],
121
114
  {
@@ -137,7 +130,7 @@ type TabsTriggerProps = ComponentProps<typeof TabsPrimitive.Trigger>;
137
130
  /**
138
131
  * Single tab trigger button.
139
132
  */
140
- function TabsTriggerRoot({ className, ...props }: TabsTriggerProps) {
133
+ function TabsTrigger({ className, ...props }: TabsTriggerProps) {
141
134
  const { setCursorTarget } = useTabsCursor();
142
135
  const { size } = useTabsContext();
143
136
  return (
@@ -150,27 +143,12 @@ function TabsTriggerRoot({ className, ...props }: TabsTriggerProps) {
150
143
  );
151
144
  }
152
145
 
153
- function TabsTriggerFallback({ className, ...props }: TabsTriggerProps & ComponentProps<"button">) {
154
- const { setCursorTarget } = useTabsCursor();
155
- const { size } = useTabsContext();
156
- return (
157
- <button
158
- onMouseEnter={(e) => setCursorTarget(e.currentTarget)}
159
- data-slot="tabs-trigger"
160
- className={cn(tabsTriggerVariants({ size }), className)}
161
- {...props}
162
- />
163
- );
164
- }
165
-
166
- const TabsTrigger = createClientOnlyComponent(TabsTriggerRoot, TabsTriggerFallback);
167
-
168
146
  type TabsContentProps = ComponentProps<typeof TabsPrimitive.Content>;
169
147
 
170
148
  /**
171
149
  * Content area for a tab panel.
172
150
  */
173
- function TabsContentRoot({ className, ...props }: TabsContentProps) {
151
+ function TabsContent({ className, ...props }: TabsContentProps) {
174
152
  return (
175
153
  <TabsPrimitive.Content
176
154
  data-slot="tabs-content"
@@ -180,13 +158,5 @@ function TabsContentRoot({ className, ...props }: TabsContentProps) {
180
158
  );
181
159
  }
182
160
 
183
- function TabsContentFallback({ className, ...props }: TabsContentProps & ComponentProps<"div">) {
184
- return (
185
- <div data-slot="tabs-content" className={cn("flex-1 outline-none", className)} {...props} />
186
- );
187
- }
188
-
189
- const TabsContent = createClientOnlyComponent(TabsContentRoot, TabsContentFallback);
190
-
191
161
  export { Tabs, TabsList, TabsTrigger, TabsContent };
192
162
  export type { TabsProps, TabsListProps, TabsTriggerProps, TabsContentProps };
package/src/ui/toast.tsx CHANGED
@@ -1,27 +1,26 @@
1
- import { useEffect, useState } from "react";
2
- import { Toaster as Sonner, ToasterProps, toast } from "sonner";
1
+ import { CSSProperties } from "react";
2
+ import { toast, Toaster as Sonner, type ToasterProps } from "sonner";
3
+
4
+ import { useTheme } from "./theme";
3
5
 
4
6
  /**
5
7
  * Client-only Toaster wrapper applying default classes.
6
8
  */
7
- const Toaster = ({ ...props }: ToasterProps) => {
8
- const [isClient, setIsClient] = useState(false);
9
9
 
10
- useEffect(() => {
11
- setIsClient(true);
12
- }, []);
13
-
14
- // Don't render anything during SSR
15
- if (!isClient) {
16
- return null;
17
- }
10
+ const Toaster = ({ ...props }: ToasterProps) => {
11
+ const { baseTheme = "system" } = useTheme();
18
12
 
19
13
  return (
20
14
  <Sonner
21
- toastOptions={{
22
- className: "vk-toast liquid-dark:liquid-dark-bg liquid-light:liquid-light-bg",
23
- descriptionClassName: "vk-toast-description",
24
- }}
15
+ theme={baseTheme}
16
+ className="toaster group"
17
+ style={
18
+ {
19
+ "--normal-bg": "var(--bg-primary)",
20
+ "--normal-text": "var(--text-primary)",
21
+ "--normal-border": "var(--bg-secondary)",
22
+ } as CSSProperties
23
+ }
25
24
  {...props}
26
25
  />
27
26
  );
@@ -8,7 +8,6 @@ import { cn } from "../hooks";
8
8
  */
9
9
  function TooltipProvider({
10
10
  delayDuration = 0,
11
- children,
12
11
  ...props
13
12
  }: ComponentProps<typeof TooltipPrimitive.Provider>) {
14
13
  return (
@@ -16,32 +15,17 @@ function TooltipProvider({
16
15
  data-slot="tooltip-provider"
17
16
  delayDuration={delayDuration}
18
17
  {...props}
19
- >
20
- {children}
21
- </TooltipPrimitive.Provider>
18
+ />
22
19
  );
23
20
  }
24
21
 
25
22
  /**
26
23
  * Wrapper root for a tooltip. Skips tooltip logic during SSR.
27
24
  */
28
- function Tooltip({ children, ...props }: ComponentProps<typeof TooltipPrimitive.Root>) {
29
- const [isClient, setIsClient] = useState(false);
30
-
31
- useEffect(() => {
32
- setIsClient(true);
33
- }, []);
34
-
35
- // During SSR, just render children without tooltip functionality
36
- if (!isClient) {
37
- return <>{children}</>;
38
- }
39
-
25
+ function Tooltip({ ...props }: ComponentProps<typeof TooltipPrimitive.Root>) {
40
26
  return (
41
27
  <TooltipProvider>
42
- <TooltipPrimitive.Root data-slot="tooltip" {...props}>
43
- {children}
44
- </TooltipPrimitive.Root>
28
+ <TooltipPrimitive.Root data-slot="tooltip" {...props} />
45
29
  </TooltipProvider>
46
30
  );
47
31
  }
@@ -50,17 +34,6 @@ function Tooltip({ children, ...props }: ComponentProps<typeof TooltipPrimitive.
50
34
  * Element that triggers the tooltip.
51
35
  */
52
36
  function TooltipTrigger({ ...props }: ComponentProps<typeof TooltipPrimitive.Trigger>) {
53
- const [isClient, setIsClient] = useState(false);
54
-
55
- useEffect(() => {
56
- setIsClient(true);
57
- }, []);
58
-
59
- // During SSR, just render children without tooltip functionality
60
- if (!isClient) {
61
- return <>{props.children}</>;
62
- }
63
-
64
37
  return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />;
65
38
  }
66
39
 
@@ -1,8 +1,15 @@
1
1
  import { ChevronDown } from "lucide-react";
2
- import { type ReactNode } from "react";
2
+ import React, { type ReactNode, useState } from "react";
3
3
 
4
+ import {
5
+ getMultiSelectState,
6
+ getRangeIds,
7
+ cleanIndirectSelectedNodes,
8
+ getAdjacentSelectionState,
9
+ } from "./hooks";
4
10
  import { TreeDataItem, TreeDataItemWithMeta } from "./types";
5
11
  import { cn } from "../../hooks";
12
+ import { ContextMenu, ContextMenuTrigger } from "../context-menu";
6
13
 
7
14
  /**
8
15
  * Props for the view-only tree component
@@ -15,12 +22,14 @@ export type TreeViewProps<T extends TreeDataItem> = {
15
22
  onItemHover?: (id: string | null) => void;
16
23
  hoveredId?: string | null;
17
24
  isSelectable?: boolean;
18
- selectedItemId?: string | null;
19
- onSelectChange?: (id: string | null) => void;
25
+ selectedItemIds?: Set<string>;
26
+ onSelectionChange?: (ids: Set<string>) => void;
20
27
  hideExpand?: boolean;
21
28
  hasDescendants?: (id: string) => boolean;
22
29
  renderLabel?: (label: string, itemId: string) => ReactNode;
23
30
  className?: string;
31
+ renderContextMenu?: (item: T) => ReactNode;
32
+ selectionMode?: "single" | "multi";
24
33
  };
25
34
 
26
35
  /**
@@ -36,13 +45,17 @@ export function TreeView<T extends TreeDataItem>({
36
45
  onItemHover,
37
46
  hoveredId,
38
47
  isSelectable = false,
39
- selectedItemId,
40
- onSelectChange,
48
+ selectedItemIds,
49
+ onSelectionChange,
41
50
  hideExpand = false,
42
51
  hasDescendants = () => false,
43
52
  renderLabel = (label) => label,
44
53
  className,
54
+ renderContextMenu,
55
+ selectionMode = "multi",
45
56
  }: TreeViewProps<T>) {
57
+ const [lastSelectedId, setLastSelectedId] = useState<string | null>(null);
58
+
46
59
  return (
47
60
  <div className={cn("flex-1 overflow-y-auto", className)}>
48
61
  {data.map((item) => (
@@ -52,8 +65,10 @@ export function TreeView<T extends TreeDataItem>({
52
65
  hoveredId={hoveredId}
53
66
  onItemHover={onItemHover}
54
67
  isSelectable={isSelectable}
55
- selectedItemId={selectedItemId}
56
- onSelectChange={onSelectChange}
68
+ selectedItemIds={selectedItemIds}
69
+ onSelectionChange={onSelectionChange}
70
+ lastSelectedId={lastSelectedId}
71
+ setLastSelectedId={setLastSelectedId}
57
72
  expandedItems={expandedItems}
58
73
  toggleItem={onToggleItem}
59
74
  hideExpand={hideExpand}
@@ -61,6 +76,8 @@ export function TreeView<T extends TreeDataItem>({
61
76
  getIcon={getIcon}
62
77
  renderLabel={renderLabel}
63
78
  dataWithMeta={data}
79
+ renderContextMenu={renderContextMenu}
80
+ selectionMode={selectionMode}
64
81
  />
65
82
  ))}
66
83
  </div>
@@ -75,8 +92,10 @@ export function TreeEntryItem<T extends TreeDataItem>({
75
92
  hoveredId,
76
93
  onItemHover,
77
94
  isSelectable,
78
- selectedItemId,
79
- onSelectChange,
95
+ selectedItemIds,
96
+ onSelectionChange,
97
+ lastSelectedId,
98
+ setLastSelectedId,
80
99
  expandedItems,
81
100
  toggleItem = () => {},
82
101
  hideExpand = false,
@@ -84,13 +103,17 @@ export function TreeEntryItem<T extends TreeDataItem>({
84
103
  getIcon = () => null,
85
104
  renderLabel = (label) => label,
86
105
  dataWithMeta = [],
106
+ renderContextMenu,
107
+ selectionMode = "multi",
87
108
  }: {
88
109
  item: TreeDataItemWithMeta<T>;
89
110
  hoveredId?: string | null;
90
111
  onItemHover?: (id: string | null) => void;
91
112
  isSelectable?: boolean;
92
- selectedItemId?: string | null;
93
- onSelectChange?: (id: string | null) => void;
113
+ selectedItemIds?: Set<string>;
114
+ onSelectionChange?: (ids: Set<string>) => void;
115
+ lastSelectedId?: string | null;
116
+ setLastSelectedId?: (id: string | null) => void;
94
117
  expandedItems?: Set<string>;
95
118
  toggleItem?: (id: string) => void;
96
119
  hideExpand?: boolean;
@@ -98,10 +121,58 @@ export function TreeEntryItem<T extends TreeDataItem>({
98
121
  getIcon?: (item: T, expanded?: boolean) => ReactNode;
99
122
  renderLabel?: (label: string, itemId: string) => ReactNode;
100
123
  dataWithMeta?: TreeDataItemWithMeta<T>[];
124
+ renderContextMenu?: (item: T) => ReactNode;
125
+ selectionMode?: "single" | "multi";
101
126
  }) {
102
- const handleItemSelect = () => {
103
- if (!item.disable && isSelectable && onSelectChange) {
104
- onSelectChange(selectedItemId === item.id ? null : item.id);
127
+ const handleItemSelect = (event: React.MouseEvent) => {
128
+ if (!item.disable && isSelectable) {
129
+ const isMultiSelectMode = selectionMode === "multi" && (event.ctrlKey || event.metaKey);
130
+ const isRangeSelectMode = selectionMode === "multi" && event.shiftKey;
131
+
132
+ if (isMultiSelectMode) {
133
+ const selectState = getMultiSelectState(
134
+ item.id,
135
+ selectedItemIds || new Set(),
136
+ dataWithMeta,
137
+ );
138
+ // prevent selection of indirectly selected nodes in multi-select mode
139
+ if (selectState === "indirect") {
140
+ return;
141
+ }
142
+ }
143
+
144
+ let newSelectedIds: Set<string>;
145
+
146
+ if (isRangeSelectMode && lastSelectedId) {
147
+ if (selectedItemIds) {
148
+ newSelectedIds = new Set(selectedItemIds);
149
+ const rangeIds = getRangeIds(lastSelectedId, item.id, dataWithMeta);
150
+ rangeIds.forEach((id) => newSelectedIds.add(id));
151
+ } else {
152
+ newSelectedIds = new Set([item.id]);
153
+ }
154
+ } else if (isMultiSelectMode) {
155
+ if (selectedItemIds) {
156
+ newSelectedIds = new Set(selectedItemIds);
157
+ if (newSelectedIds.has(item.id)) {
158
+ newSelectedIds.delete(item.id);
159
+ } else {
160
+ newSelectedIds.add(item.id);
161
+ }
162
+ } else {
163
+ newSelectedIds = new Set([item.id]);
164
+ }
165
+ } else {
166
+ // Single select mode: clear other selections and select only current item
167
+ newSelectedIds = new Set([item.id]);
168
+ }
169
+
170
+ const cleanedSelectedIds = cleanIndirectSelectedNodes(newSelectedIds, dataWithMeta);
171
+
172
+ if (onSelectionChange) {
173
+ onSelectionChange(cleanedSelectedIds);
174
+ setLastSelectedId?.(item.id);
175
+ }
105
176
  }
106
177
  };
107
178
 
@@ -110,18 +181,65 @@ export function TreeEntryItem<T extends TreeDataItem>({
110
181
  const indent = item.indent || 0;
111
182
  const isLast = item.isLast !== undefined ? item.isLast : false;
112
183
 
113
- return (
184
+ const getSelectState = () => {
185
+ if (selectedItemIds) {
186
+ return getMultiSelectState(item.id, selectedItemIds, dataWithMeta);
187
+ }
188
+ return "unselected";
189
+ };
190
+
191
+ const selectState = getSelectState();
192
+ const isSelected = selectState === "selected";
193
+ const isIndirectlySelected = selectState === "indirect";
194
+
195
+ const { hasPrevSelected, hasNextSelected } = getAdjacentSelectionState(
196
+ item.id,
197
+ selectedItemIds || new Set(),
198
+ dataWithMeta,
199
+ );
200
+
201
+ // Calculate border radius classes based on adjacent selection
202
+ const getBorderRadiusClass = () => {
203
+ if (!isSelectable || (!isSelected && !isIndirectlySelected)) {
204
+ return "rounded-uk-md";
205
+ }
206
+
207
+ // Remove top radius if previous item is selected, remove bottom radius if next item is selected
208
+ if (hasPrevSelected && hasNextSelected) {
209
+ return "";
210
+ } else if (hasPrevSelected) {
211
+ return "rounded-b-uk-md";
212
+ } else if (hasNextSelected) {
213
+ return "rounded-t-uk-md";
214
+ }
215
+
216
+ return "rounded-uk-md";
217
+ };
218
+
219
+ const handleContextMenuOpenChange = (open: boolean) => {
220
+ // If item is not selected when opening context menu, select it first
221
+ if (open && isSelectable && !isSelected && !isIndirectlySelected && onSelectionChange) {
222
+ onSelectionChange(new Set([item.id]));
223
+ }
224
+ };
225
+
226
+ const treeItemContent = (
114
227
  <div
115
228
  className={cn(
116
229
  "group relative flex h-[32px] items-center",
117
- isSelectable && "rounded-uk-md",
118
- !item.disable && "cursor-pointer",
230
+ getBorderRadiusClass(),
119
231
  hoveredId === item.id && !item.disable && "bg-bg-secondary",
120
- isSelectable && selectedItemId === item.id && "bg-brand-primary text-text-withbg",
232
+ isSelectable && isSelected && "bg-brand-primary text-text-withbg",
233
+ isSelectable && isIndirectlySelected && "bg-shadow-secondary text-text-primary",
121
234
  )}
122
235
  onMouseEnter={() => onItemHover?.(item.id)}
123
236
  onMouseLeave={() => onItemHover?.(null)}
124
237
  onClick={handleItemSelect}
238
+ onMouseDown={(e) => {
239
+ if (e.shiftKey || e.ctrlKey || e.metaKey) {
240
+ e.preventDefault();
241
+ }
242
+ }}
125
243
  >
126
244
  {/* Guidelines */}
127
245
  <div className="absolute top-0 left-[-0.28rem] z-0 flex h-full items-center">
@@ -229,4 +347,15 @@ export function TreeEntryItem<T extends TreeDataItem>({
229
347
  </div>
230
348
  </div>
231
349
  );
350
+
351
+ if (renderContextMenu) {
352
+ return (
353
+ <ContextMenu onOpenChange={handleContextMenuOpenChange}>
354
+ <ContextMenuTrigger asChild>{treeItemContent}</ContextMenuTrigger>
355
+ {renderContextMenu(item)}
356
+ </ContextMenu>
357
+ );
358
+ }
359
+
360
+ return treeItemContent;
232
361
  }
@@ -2,6 +2,154 @@ import { useCallback, useMemo, useState } from "react";
2
2
 
3
3
  import { TreeDataItem, TreeDataItemWithMeta } from "./types";
4
4
 
5
+ /**
6
+ * Get all descendant node IDs of a node
7
+ */
8
+ export function getDescendantIds<T extends TreeDataItem>(
9
+ itemId: string,
10
+ data: TreeDataItemWithMeta<T>[],
11
+ childrenMap: Map<string | null, T[]>,
12
+ ): string[] {
13
+ const descendants: string[] = [];
14
+ const children = childrenMap.get(itemId) || [];
15
+
16
+ children.forEach((child) => {
17
+ descendants.push(child.id);
18
+ descendants.push(...getDescendantIds(child.id, data, childrenMap));
19
+ });
20
+
21
+ return descendants;
22
+ }
23
+
24
+ /**
25
+ * Get all ancestor node IDs of a node
26
+ */
27
+ export function getAncestorIds<T extends TreeDataItem>(
28
+ itemId: string,
29
+ data: TreeDataItemWithMeta<T>[],
30
+ ): string[] {
31
+ const ancestors: string[] = [];
32
+ const dataMap = new Map(data.map((item) => [item.id, item]));
33
+ let current = dataMap.get(itemId)?.parentId;
34
+
35
+ while (current) {
36
+ ancestors.push(current);
37
+ current = dataMap.get(current)?.parentId;
38
+ }
39
+
40
+ return ancestors;
41
+ }
42
+
43
+ /**
44
+ * Check if a node is indirectly selected (parent node is selected)
45
+ */
46
+ export function isIndirectlySelected<T extends TreeDataItem>(
47
+ itemId: string,
48
+ selectedIds: Set<string>,
49
+ data: TreeDataItemWithMeta<T>[],
50
+ ): boolean {
51
+ const ancestors = getAncestorIds(itemId, data);
52
+ return ancestors.some((ancestorId) => selectedIds.has(ancestorId));
53
+ }
54
+
55
+ /**
56
+ * Get multi-select state: selected, indirect, or unselected
57
+ */
58
+ export function getMultiSelectState<T extends TreeDataItem>(
59
+ itemId: string,
60
+ selectedIds: Set<string>,
61
+ data: TreeDataItemWithMeta<T>[],
62
+ ): "selected" | "indirect" | "unselected" {
63
+ if (isIndirectlySelected(itemId, selectedIds, data)) {
64
+ return "indirect";
65
+ }
66
+ if (selectedIds.has(itemId)) {
67
+ return "selected";
68
+ }
69
+ return "unselected";
70
+ }
71
+
72
+ /**
73
+ * Get all node IDs for range selection (from lastSelectedId to currentId)
74
+ */
75
+ export function getRangeIds<T extends TreeDataItem>(
76
+ lastSelectedId: string | null,
77
+ currentId: string,
78
+ data: TreeDataItemWithMeta<T>[],
79
+ ): string[] {
80
+ if (!lastSelectedId) {
81
+ return [currentId];
82
+ }
83
+
84
+ // Find the indices of both nodes in the data
85
+ const lastIndex = data.findIndex((item) => item.id === lastSelectedId);
86
+ const currentIndex = data.findIndex((item) => item.id === currentId);
87
+
88
+ if (lastIndex === -1 || currentIndex === -1) {
89
+ return [currentId];
90
+ }
91
+
92
+ // Get all node IDs within the range
93
+ const startIndex = Math.min(lastIndex, currentIndex);
94
+ const endIndex = Math.max(lastIndex, currentIndex);
95
+ const rangeIds: string[] = [];
96
+
97
+ for (let i = startIndex; i <= endIndex; i++) {
98
+ rangeIds.push(data[i].id);
99
+ }
100
+
101
+ return rangeIds;
102
+ }
103
+
104
+ /**
105
+ * Clean up indirectly selected child nodes, keep only directly selected nodes
106
+ */
107
+ export function cleanIndirectSelectedNodes<T extends TreeDataItem>(
108
+ selectedIds: Set<string>,
109
+ data: TreeDataItemWithMeta<T>[],
110
+ ): Set<string> {
111
+ const cleanedIds = new Set<string>();
112
+
113
+ for (const id of selectedIds) {
114
+ // Check if this node is indirectly selected (i.e., its ancestor node is selected)
115
+ const isNodeIndirectlySelected = isIndirectlySelected(id, selectedIds, data);
116
+
117
+ // If this node is not indirectly selected, keep it
118
+ if (!isNodeIndirectlySelected) {
119
+ cleanedIds.add(id);
120
+ }
121
+ }
122
+
123
+ return cleanedIds;
124
+ }
125
+
126
+ /**
127
+ * Check if adjacent items are selected (directly or indirectly)
128
+ * Returns whether previous and next items are selected
129
+ */
130
+ export function getAdjacentSelectionState<T extends TreeDataItem>(
131
+ itemId: string,
132
+ selectedIds: Set<string>,
133
+ data: TreeDataItemWithMeta<T>[],
134
+ ): { hasPrevSelected: boolean; hasNextSelected: boolean } {
135
+ const currentIndex = data.findIndex((item) => item.id === itemId);
136
+
137
+ if (currentIndex === -1) {
138
+ return { hasPrevSelected: false, hasNextSelected: false };
139
+ }
140
+
141
+ const prevIndex = currentIndex - 1;
142
+ const hasPrevSelected =
143
+ prevIndex >= 0 && getMultiSelectState(data[prevIndex].id, selectedIds, data) !== "unselected";
144
+
145
+ const nextIndex = currentIndex + 1;
146
+ const hasNextSelected =
147
+ nextIndex < data.length &&
148
+ getMultiSelectState(data[nextIndex].id, selectedIds, data) !== "unselected";
149
+
150
+ return { hasPrevSelected, hasNextSelected };
151
+ }
152
+
5
153
  /**
6
154
  * Hook for managing tree search functionality
7
155
  */
@@ -20,4 +20,4 @@ export type TreeDataItemWithMeta<T extends TreeDataItem> = T & {
20
20
  indent: number;
21
21
  isLast: boolean;
22
22
  ancestors: T[];
23
- };
23
+ };