@vuer-ai/vuer-uikit 0.0.96 → 0.0.98

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 (341) hide show
  1. package/README.md +106 -7
  2. package/cli/dial-cli.js +49 -7
  3. package/dist/SyncScroll/SyncScroll.cjs +10 -10
  4. package/dist/SyncScroll/SyncScroll.mjs +3 -3
  5. package/dist/SyncScroll/index.cjs +10 -10
  6. package/dist/SyncScroll/index.mjs +3 -3
  7. package/dist/chunk-3HEZVWRW.mjs +62 -0
  8. package/dist/chunk-4KWGGESI.cjs +494 -0
  9. package/dist/{chunk-CCMKL2OA.cjs → chunk-7GWDO25E.cjs} +2 -2
  10. package/dist/chunk-A5LCX2UQ.cjs +208 -0
  11. package/dist/chunk-BEJIZ56L.mjs +300 -0
  12. package/dist/chunk-C7VGRU3O.mjs +283 -0
  13. package/dist/{chunk-LONOMMFA.cjs → chunk-LJMNHTTG.cjs} +21 -21
  14. package/dist/chunk-O66RESRR.cjs +285 -0
  15. package/dist/{chunk-RINTUFYQ.cjs → chunk-RMK6W774.cjs} +24 -19
  16. package/dist/{chunk-BFQ2WL5U.mjs → chunk-TTYSYGVE.mjs} +2 -2
  17. package/dist/chunk-VA3PEYFM.mjs +489 -0
  18. package/dist/chunk-VBBJSIY7.cjs +308 -0
  19. package/dist/{chunk-AIINOWEH.mjs → chunk-W4JCKCW7.mjs} +5 -5
  20. package/dist/chunk-WWGF6TBZ.mjs +206 -0
  21. package/dist/chunk-ZGN4UEJR.cjs +679 -0
  22. package/dist/chunk-ZQLRMOUW.mjs +661 -0
  23. package/dist/dial/DialPanel.cjs +24 -24
  24. package/dist/dial/DialPanel.mjs +23 -23
  25. package/dist/dial/DialProvider.cjs +3 -3
  26. package/dist/dial/DialProvider.d.cts +1 -0
  27. package/dist/dial/DialProvider.d.ts +1 -0
  28. package/dist/dial/DialProvider.example.cjs +72 -0
  29. package/dist/dial/DialProvider.example.d.cts +7 -0
  30. package/dist/dial/DialProvider.example.d.ts +7 -0
  31. package/dist/dial/DialProvider.example.mjs +68 -0
  32. package/dist/dial/DialProvider.mjs +1 -1
  33. package/dist/dial/index.cjs +42 -42
  34. package/dist/dial/index.mjs +23 -23
  35. package/dist/dial/wrapped-inputs/ControlledInputs.cjs +27 -27
  36. package/dist/dial/wrapped-inputs/ControlledInputs.mjs +23 -23
  37. package/dist/dial/wrapped-inputs/DialInputs.cjs +34 -34
  38. package/dist/dial/wrapped-inputs/DialInputs.mjs +23 -23
  39. package/dist/dial/wrapped-inputs/DialVectorInput.cjs +24 -24
  40. package/dist/dial/wrapped-inputs/DialVectorInput.mjs +23 -23
  41. package/dist/dial/wrapped-inputs/index.cjs +39 -39
  42. package/dist/dial/wrapped-inputs/index.mjs +23 -23
  43. package/dist/highlight-cursor/cursor-provider.cjs +3 -3
  44. package/dist/highlight-cursor/cursor-provider.mjs +2 -2
  45. package/dist/highlight-cursor/enhanced-components.cjs +10 -10
  46. package/dist/highlight-cursor/enhanced-components.mjs +5 -5
  47. package/dist/highlight-cursor/index.cjs +16 -16
  48. package/dist/highlight-cursor/index.mjs +6 -6
  49. package/dist/hooks/index.cjs +5 -5
  50. package/dist/hooks/index.mjs +1 -1
  51. package/dist/index.cjs +190 -190
  52. package/dist/index.mjs +23 -23
  53. package/dist/ui/UIKitBadge.cjs +6 -6
  54. package/dist/ui/UIKitBadge.mjs +2 -2
  55. package/dist/ui/avatar.cjs +1 -1
  56. package/dist/ui/avatar.mjs +1 -1
  57. package/dist/ui/badge.cjs +1 -1
  58. package/dist/ui/badge.d.cts +1 -1
  59. package/dist/ui/badge.d.ts +1 -1
  60. package/dist/ui/badge.mjs +1 -1
  61. package/dist/ui/button.cjs +1 -1
  62. package/dist/ui/button.mjs +1 -1
  63. package/dist/ui/card.cjs +1 -1
  64. package/dist/ui/card.mjs +1 -1
  65. package/dist/ui/checkbox.cjs +1 -1
  66. package/dist/ui/checkbox.mjs +1 -1
  67. package/dist/ui/collapsible.cjs +1 -1
  68. package/dist/ui/collapsible.mjs +1 -1
  69. package/dist/ui/drawer.cjs +1 -1
  70. package/dist/ui/drawer.mjs +1 -1
  71. package/dist/ui/dropdown.cjs +1 -1
  72. package/dist/ui/dropdown.mjs +1 -1
  73. package/dist/ui/index.cjs +107 -107
  74. package/dist/ui/index.mjs +17 -17
  75. package/dist/ui/inputs/color-input.cjs +1 -1
  76. package/dist/ui/inputs/color-input.mjs +1 -1
  77. package/dist/ui/inputs/index.cjs +11 -11
  78. package/dist/ui/inputs/index.mjs +3 -3
  79. package/dist/ui/inputs/input-numbers.cjs +1 -1
  80. package/dist/ui/inputs/input-numbers.mjs +1 -1
  81. package/dist/ui/inputs/input.cjs +1 -1
  82. package/dist/ui/inputs/input.d.cts +1 -1
  83. package/dist/ui/inputs/input.d.ts +1 -1
  84. package/dist/ui/inputs/input.mjs +1 -1
  85. package/dist/ui/inputs/number-inputs/CmInput.cjs +1 -1
  86. package/dist/ui/inputs/number-inputs/CmInput.mjs +1 -1
  87. package/dist/ui/inputs/number-inputs/DegInput.cjs +1 -1
  88. package/dist/ui/inputs/number-inputs/DegInput.mjs +1 -1
  89. package/dist/ui/inputs/number-inputs/EulerDegInput.cjs +1 -1
  90. package/dist/ui/inputs/number-inputs/EulerDegInput.mjs +1 -1
  91. package/dist/ui/inputs/number-inputs/EulerInput.cjs +1 -1
  92. package/dist/ui/inputs/number-inputs/EulerInput.mjs +1 -1
  93. package/dist/ui/inputs/number-inputs/EulerRadInput.cjs +1 -1
  94. package/dist/ui/inputs/number-inputs/EulerRadInput.mjs +1 -1
  95. package/dist/ui/inputs/number-inputs/InchInput.cjs +1 -1
  96. package/dist/ui/inputs/number-inputs/InchInput.mjs +1 -1
  97. package/dist/ui/inputs/number-inputs/IntInput.cjs +1 -1
  98. package/dist/ui/inputs/number-inputs/IntInput.mjs +1 -1
  99. package/dist/ui/inputs/number-inputs/KVectorInput.cjs +1 -1
  100. package/dist/ui/inputs/number-inputs/KVectorInput.mjs +1 -1
  101. package/dist/ui/inputs/number-inputs/QuaternionInput.cjs +1 -1
  102. package/dist/ui/inputs/number-inputs/QuaternionInput.mjs +1 -1
  103. package/dist/ui/inputs/number-inputs/RadInput.cjs +1 -1
  104. package/dist/ui/inputs/number-inputs/RadInput.mjs +1 -1
  105. package/dist/ui/inputs/number-inputs/TimeInput.cjs +1 -1
  106. package/dist/ui/inputs/number-inputs/TimeInput.mjs +1 -1
  107. package/dist/ui/inputs/number-inputs/Vec3Input.cjs +1 -1
  108. package/dist/ui/inputs/number-inputs/Vec3Input.mjs +1 -1
  109. package/dist/ui/inputs/number-inputs/VectorInput.cjs +1 -1
  110. package/dist/ui/inputs/number-inputs/VectorInput.mjs +1 -1
  111. package/dist/ui/inputs/number-inputs/index.cjs +11 -11
  112. package/dist/ui/inputs/number-inputs/index.mjs +3 -3
  113. package/dist/ui/inputs/presets-input.cjs +1 -1
  114. package/dist/ui/inputs/presets-input.mjs +1 -1
  115. package/dist/ui/label.cjs +1 -1
  116. package/dist/ui/label.mjs +1 -1
  117. package/dist/ui/layout.cjs +1 -1
  118. package/dist/ui/layout.mjs +1 -1
  119. package/dist/ui/layouts/dock-layout/DockLayoutView.cjs +1 -1
  120. package/dist/ui/layouts/dock-layout/DockLayoutView.mjs +1 -1
  121. package/dist/ui/layouts/dock-layout/LayoutSlots.cjs +1 -1
  122. package/dist/ui/layouts/dock-layout/LayoutSlots.mjs +1 -1
  123. package/dist/ui/layouts/dock-layout/index.cjs +1 -1
  124. package/dist/ui/layouts/dock-layout/index.mjs +1 -1
  125. package/dist/ui/layouts/index.cjs +2 -2
  126. package/dist/ui/layouts/index.mjs +2 -2
  127. package/dist/ui/layouts/liquid-layout/LayoutSlots.cjs +1 -1
  128. package/dist/ui/layouts/liquid-layout/LayoutSlots.mjs +1 -1
  129. package/dist/ui/layouts/liquid-layout/LiquidLayoutView.cjs +1 -1
  130. package/dist/ui/layouts/liquid-layout/LiquidLayoutView.mjs +1 -1
  131. package/dist/ui/layouts/liquid-layout/index.cjs +1 -1
  132. package/dist/ui/layouts/liquid-layout/index.mjs +1 -1
  133. package/dist/ui/modal.cjs +1 -1
  134. package/dist/ui/modal.mjs +1 -1
  135. package/dist/ui/navigation.cjs +1 -1
  136. package/dist/ui/navigation.mjs +1 -1
  137. package/dist/ui/pagination.cjs +1 -1
  138. package/dist/ui/pagination.mjs +1 -1
  139. package/dist/ui/panel.cjs +1 -1
  140. package/dist/ui/panel.mjs +1 -1
  141. package/dist/ui/popover.cjs +1 -1
  142. package/dist/ui/popover.mjs +1 -1
  143. package/dist/ui/radio-group.cjs +1 -1
  144. package/dist/ui/radio-group.mjs +1 -1
  145. package/dist/ui/resizable.cjs +1 -1
  146. package/dist/ui/resizable.mjs +1 -1
  147. package/dist/ui/select.cjs +1 -1
  148. package/dist/ui/select.d.cts +1 -1
  149. package/dist/ui/select.d.ts +1 -1
  150. package/dist/ui/select.mjs +1 -1
  151. package/dist/ui/separator.cjs +1 -1
  152. package/dist/ui/separator.mjs +1 -1
  153. package/dist/ui/sheet.cjs +1 -1
  154. package/dist/ui/sheet.mjs +1 -1
  155. package/dist/ui/sidebar.cjs +26 -26
  156. package/dist/ui/sidebar.mjs +2 -2
  157. package/dist/ui/simple-tree-view.cjs +1 -1
  158. package/dist/ui/simple-tree-view.mjs +1 -1
  159. package/dist/ui/skeleton.cjs +1 -1
  160. package/dist/ui/skeleton.mjs +1 -1
  161. package/dist/ui/slider.cjs +1 -1
  162. package/dist/ui/slider.mjs +1 -1
  163. package/dist/ui/switch.cjs +1 -1
  164. package/dist/ui/switch.mjs +1 -1
  165. package/dist/ui/table.cjs +1 -1
  166. package/dist/ui/table.mjs +1 -1
  167. package/dist/ui/tabs.cjs +1 -1
  168. package/dist/ui/tabs.mjs +1 -1
  169. package/dist/ui/textarea.cjs +1 -1
  170. package/dist/ui/textarea.d.cts +1 -1
  171. package/dist/ui/textarea.d.ts +1 -1
  172. package/dist/ui/textarea.mjs +1 -1
  173. package/dist/ui/theme/ThemeToggles.cjs +1 -1
  174. package/dist/ui/theme/ThemeToggles.mjs +1 -1
  175. package/dist/ui/theme/index.cjs +1 -1
  176. package/dist/ui/theme/index.mjs +1 -1
  177. package/dist/ui/toggle-buttons.cjs +1 -1
  178. package/dist/ui/toggle-buttons.mjs +1 -1
  179. package/dist/ui/toggle-group.cjs +1 -1
  180. package/dist/ui/toggle-group.mjs +1 -1
  181. package/dist/ui/toggle.cjs +1 -1
  182. package/dist/ui/toggle.mjs +1 -1
  183. package/dist/ui/toolbar.cjs +1 -1
  184. package/dist/ui/toolbar.mjs +1 -1
  185. package/dist/ui/tooltip.cjs +1 -1
  186. package/dist/ui/tooltip.mjs +1 -1
  187. package/dist/ui/tree-view/TreeSearchBar.cjs +1 -1
  188. package/dist/ui/tree-view/TreeSearchBar.mjs +1 -1
  189. package/dist/ui/tree-view/TreeView.cjs +1 -1
  190. package/dist/ui/tree-view/TreeView.mjs +1 -1
  191. package/dist/ui/tree-view/index.cjs +6 -6
  192. package/dist/ui/tree-view/index.mjs +2 -2
  193. package/dist/ui/tree-view-legacy.cjs +9 -9
  194. package/dist/ui/tree-view-legacy.mjs +5 -5
  195. package/dist/ui/waterfall/CursorOverlay.cjs +1 -1
  196. package/dist/ui/waterfall/CursorOverlay.mjs +1 -1
  197. package/dist/ui/waterfall/TimelineEvent.cjs +1 -1
  198. package/dist/ui/waterfall/TimelineEvent.mjs +1 -1
  199. package/dist/ui/waterfall/TimelineProcessBar.cjs +1 -1
  200. package/dist/ui/waterfall/TimelineProcessBar.mjs +1 -1
  201. package/dist/ui/waterfall/Wedges.cjs +1 -1
  202. package/dist/ui/waterfall/Wedges.mjs +1 -1
  203. package/dist/ui/waterfall/index.cjs +8 -8
  204. package/dist/ui/waterfall/index.mjs +7 -7
  205. package/package.json +28 -2
  206. package/src/SyncScroll/README.md +283 -0
  207. package/src/SyncScroll/SyncScroll.tsx +361 -0
  208. package/src/SyncScroll/index.ts +22 -0
  209. package/src/SyncScroll/useSyncScroll.tsx +226 -0
  210. package/src/cli/dial-cli.ts +1133 -0
  211. package/src/dial/DialPanel.tsx +208 -0
  212. package/src/dial/DialProvider.example.tsx +80 -0
  213. package/src/dial/DialProvider.tsx +138 -0
  214. package/src/dial/index.ts +26 -0
  215. package/src/dial/wrapped-inputs/ControlledInputs.tsx +176 -0
  216. package/src/dial/wrapped-inputs/DialInputs.tsx +401 -0
  217. package/src/dial/wrapped-inputs/DialVectorInput.tsx +125 -0
  218. package/src/dial/wrapped-inputs/index.ts +25 -0
  219. package/src/highlight-cursor/cursor-context.tsx +23 -0
  220. package/src/highlight-cursor/cursor-provider.tsx +264 -0
  221. package/src/highlight-cursor/enhanced-components.tsx +16 -0
  222. package/src/highlight-cursor/index.ts +21 -0
  223. package/src/highlight-cursor/tabs-cursor-context.tsx +121 -0
  224. package/src/highlight-cursor/types.ts +40 -0
  225. package/src/highlight-cursor/with-cursor.tsx +144 -0
  226. package/src/hooks/clientOnly.tsx +54 -0
  227. package/src/hooks/cn.ts +33 -0
  228. package/src/hooks/index.ts +9 -0
  229. package/src/hooks/useDocument.tsx +18 -0
  230. package/src/hooks/useDragSelect.ts +116 -0
  231. package/src/hooks/useIsMobile.ts +35 -0
  232. package/src/hooks/useLocalStorage.ts +122 -0
  233. package/src/hooks/useLocation.tsx +95 -0
  234. package/src/hooks/useQueryParams.tsx +31 -0
  235. package/src/hooks/useWindow.tsx +18 -0
  236. package/src/index.css +5 -0
  237. package/src/index.ts +5 -0
  238. package/src/styles/.editorconfig +0 -0
  239. package/src/styles/theme.css +152 -0
  240. package/src/styles/toast.css +67 -0
  241. package/src/styles/variables.css +229 -0
  242. package/src/ui/UIKitBadge.tsx +171 -0
  243. package/src/ui/avatar.tsx +221 -0
  244. package/src/ui/badge.tsx +74 -0
  245. package/src/ui/button.tsx +143 -0
  246. package/src/ui/card.tsx +146 -0
  247. package/src/ui/checkbox.tsx +78 -0
  248. package/src/ui/collapsible.tsx +43 -0
  249. package/src/ui/drag-selectable/DragSelectProvider.tsx +178 -0
  250. package/src/ui/drag-selectable/createSelectable.tsx +43 -0
  251. package/src/ui/drag-selectable/index.ts +2 -0
  252. package/src/ui/drawer.tsx +137 -0
  253. package/src/ui/dropdown.tsx +707 -0
  254. package/src/ui/icons/MouseCursorIcons.tsx +39 -0
  255. package/src/ui/icons/cursor.tsx +38 -0
  256. package/src/ui/icons/index.ts +2 -0
  257. package/src/ui/index.ts +45 -0
  258. package/src/ui/inputs/color-input.tsx +61 -0
  259. package/src/ui/inputs/index.tsx +5 -0
  260. package/src/ui/inputs/input-numbers.tsx +394 -0
  261. package/src/ui/inputs/input.tsx +155 -0
  262. package/src/ui/inputs/number-inputs/CmInput.tsx +26 -0
  263. package/src/ui/inputs/number-inputs/DegInput.tsx +26 -0
  264. package/src/ui/inputs/number-inputs/EulerDegInput.tsx +14 -0
  265. package/src/ui/inputs/number-inputs/EulerInput.tsx +30 -0
  266. package/src/ui/inputs/number-inputs/EulerRadInput.tsx +14 -0
  267. package/src/ui/inputs/number-inputs/InchInput.tsx +26 -0
  268. package/src/ui/inputs/number-inputs/IntInput.tsx +46 -0
  269. package/src/ui/inputs/number-inputs/KVectorInput.tsx +20 -0
  270. package/src/ui/inputs/number-inputs/QuaternionInput.tsx +27 -0
  271. package/src/ui/inputs/number-inputs/RadInput.tsx +26 -0
  272. package/src/ui/inputs/number-inputs/TimeInput.tsx +26 -0
  273. package/src/ui/inputs/number-inputs/Vec3Input.tsx +26 -0
  274. package/src/ui/inputs/number-inputs/VectorInput.tsx +38 -0
  275. package/src/ui/inputs/number-inputs/index.ts +38 -0
  276. package/src/ui/inputs/presets-input.tsx +59 -0
  277. package/src/ui/label.tsx +35 -0
  278. package/src/ui/layout.tsx +43 -0
  279. package/src/ui/layouts/dock-layout/DockLayoutView.tsx +128 -0
  280. package/src/ui/layouts/dock-layout/LayoutSlots.tsx +85 -0
  281. package/src/ui/layouts/dock-layout/index.tsx +2 -0
  282. package/src/ui/layouts/index.ts +2 -0
  283. package/src/ui/layouts/liquid-layout/LayoutSlots.tsx +82 -0
  284. package/src/ui/layouts/liquid-layout/LiquidLayoutView.tsx +76 -0
  285. package/src/ui/layouts/liquid-layout/index.ts +1 -0
  286. package/src/ui/modal.tsx +211 -0
  287. package/src/ui/navigation.tsx +86 -0
  288. package/src/ui/pagination.tsx +129 -0
  289. package/src/ui/panel.tsx +146 -0
  290. package/src/ui/popover.tsx +112 -0
  291. package/src/ui/radio-group.tsx +63 -0
  292. package/src/ui/resizable.tsx +52 -0
  293. package/src/ui/select.tsx +365 -0
  294. package/src/ui/separator.tsx +26 -0
  295. package/src/ui/sheet.tsx +257 -0
  296. package/src/ui/sidebar.tsx +695 -0
  297. package/src/ui/simple-tree-view.tsx +604 -0
  298. package/src/ui/skeleton.tsx +15 -0
  299. package/src/ui/slider.tsx +204 -0
  300. package/src/ui/switch.tsx +45 -0
  301. package/src/ui/table.tsx +99 -0
  302. package/src/ui/tabs.tsx +192 -0
  303. package/src/ui/textarea.tsx +55 -0
  304. package/src/ui/theme/ThemeProvider.tsx +319 -0
  305. package/src/ui/theme/ThemeToggles.tsx +84 -0
  306. package/src/ui/theme/index.ts +21 -0
  307. package/src/ui/theme/themeScript.tsx +179 -0
  308. package/src/ui/theme/types.ts +61 -0
  309. package/src/ui/toast.tsx +30 -0
  310. package/src/ui/toggle-buttons.tsx +290 -0
  311. package/src/ui/toggle-group.tsx +236 -0
  312. package/src/ui/toggle.tsx +94 -0
  313. package/src/ui/toolbar.tsx +54 -0
  314. package/src/ui/tooltip.tsx +171 -0
  315. package/src/ui/tree-view/TreeSearchBar.tsx +88 -0
  316. package/src/ui/tree-view/TreeView.tsx +232 -0
  317. package/src/ui/tree-view/hooks.tsx +289 -0
  318. package/src/ui/tree-view/index.ts +4 -0
  319. package/src/ui/tree-view/types.ts +23 -0
  320. package/src/ui/tree-view-legacy.tsx +644 -0
  321. package/src/ui/version-badge.tsx +0 -0
  322. package/src/ui/waterfall/CursorOverlay.tsx +96 -0
  323. package/src/ui/waterfall/NavigationControls.tsx +42 -0
  324. package/src/ui/waterfall/Tick.tsx +51 -0
  325. package/src/ui/waterfall/TimeRuleEventDot.tsx +19 -0
  326. package/src/ui/waterfall/TimelineEvent.tsx +60 -0
  327. package/src/ui/waterfall/TimelineProcessBar.tsx +207 -0
  328. package/src/ui/waterfall/Wedges.tsx +67 -0
  329. package/src/ui/waterfall/WheelZoomContext.tsx +128 -0
  330. package/src/ui/waterfall/hooks/useTimelineState.tsx +134 -0
  331. package/src/ui/waterfall/hooks/useViewport.tsx +293 -0
  332. package/src/ui/waterfall/index.tsx +326 -0
  333. package/src/ui/waterfall/types.ts +20 -0
  334. package/src/ui/waterfall/utils.ts +91 -0
  335. package/dist/chunk-W2YAQV5N.mjs +0 -57
  336. package/dist/{chunk-QLCEHV4Q.mjs → chunk-2OZK5DY5.mjs} +2 -2
  337. package/dist/{chunk-Z35DNFRZ.cjs → chunk-7IS37C3P.cjs} +2 -2
  338. package/dist/{chunk-4AOAH77D.mjs → chunk-A2PCEL5S.mjs} +2 -2
  339. package/dist/{chunk-K4VD5PPY.mjs → chunk-BIUDC66P.mjs} +1 -1
  340. package/dist/{chunk-RKJR6RZU.cjs → chunk-OYNLQTHW.cjs} +1 -1
  341. package/dist/{chunk-VE3XLQLO.cjs → chunk-QUFZWF4E.cjs} +2 -2
@@ -1,25 +1,29 @@
1
1
  'use strict';
2
2
 
3
3
  require('../../chunk-G5NT42YF.cjs');
4
+ var chunk55RSKLJ5_cjs = require('../../chunk-55RSKLJ5.cjs');
4
5
  var chunkHAVTMZR3_cjs = require('../../chunk-HAVTMZR3.cjs');
5
6
  var chunkEEGQLTSQ_cjs = require('../../chunk-EEGQLTSQ.cjs');
6
7
  require('../../chunk-VOTZLQ6J.cjs');
7
- var chunk55RSKLJ5_cjs = require('../../chunk-55RSKLJ5.cjs');
8
8
  require('../../chunk-2CZEFXEW.cjs');
9
9
  require('../../chunk-3UEVUYFQ.cjs');
10
10
  require('../../chunk-QN4N4I3Z.cjs');
11
11
  require('../../chunk-LYZJNEOR.cjs');
12
12
  require('../../chunk-YZIR6LIY.cjs');
13
13
  require('../../chunk-RPTRTGC2.cjs');
14
- require('../../chunk-OHIB3TEN.cjs');
15
14
  require('../../chunk-LBWMTA5T.cjs');
16
15
  require('../../chunk-Q7E73DVJ.cjs');
17
16
  require('../../chunk-JR4TVE43.cjs');
18
17
  require('../../chunk-VXZURKMQ.cjs');
19
18
  require('../../chunk-6BOWMGFG.cjs');
19
+ require('../../chunk-OHIB3TEN.cjs');
20
20
 
21
21
 
22
22
 
23
+ Object.defineProperty(exports, "TreeSearchBar", {
24
+ enumerable: true,
25
+ get: function () { return chunk55RSKLJ5_cjs.TreeSearchBar; }
26
+ });
23
27
  Object.defineProperty(exports, "TreeEntryItem", {
24
28
  enumerable: true,
25
29
  get: function () { return chunkHAVTMZR3_cjs.TreeEntryItem; }
@@ -36,7 +40,3 @@ Object.defineProperty(exports, "useTreeState", {
36
40
  enumerable: true,
37
41
  get: function () { return chunkEEGQLTSQ_cjs.useTreeState; }
38
42
  });
39
- Object.defineProperty(exports, "TreeSearchBar", {
40
- enumerable: true,
41
- get: function () { return chunk55RSKLJ5_cjs.TreeSearchBar; }
42
- });
@@ -1,17 +1,17 @@
1
1
  import '../../chunk-HVVT3D2T.mjs';
2
+ export { TreeSearchBar } from '../../chunk-73VF2W3D.mjs';
2
3
  export { TreeEntryItem, TreeView } from '../../chunk-VQPJ7TLB.mjs';
3
4
  export { useTreeSearch, useTreeState } from '../../chunk-PC5DHSC4.mjs';
4
5
  import '../../chunk-HTAFERCZ.mjs';
5
- export { TreeSearchBar } from '../../chunk-73VF2W3D.mjs';
6
6
  import '../../chunk-ZNPI2TYG.mjs';
7
7
  import '../../chunk-4XUJBMDE.mjs';
8
8
  import '../../chunk-F7ZHPSLA.mjs';
9
9
  import '../../chunk-OEIF3JCH.mjs';
10
10
  import '../../chunk-VA4LUFKD.mjs';
11
11
  import '../../chunk-4F2GSF2T.mjs';
12
- import '../../chunk-HMN4IKTG.mjs';
13
12
  import '../../chunk-IDUVYPN7.mjs';
14
13
  import '../../chunk-3QT5VABC.mjs';
15
14
  import '../../chunk-XHJDRQD7.mjs';
16
15
  import '../../chunk-LQOPO4KU.mjs';
17
16
  import '../../chunk-IZARTVYN.mjs';
17
+ import '../../chunk-HMN4IKTG.mjs';
@@ -1,37 +1,37 @@
1
1
  'use strict';
2
2
 
3
- var chunkEC4HJUX6_cjs = require('../chunk-EC4HJUX6.cjs');
3
+ var chunk4KWGGESI_cjs = require('../chunk-4KWGGESI.cjs');
4
4
  require('../chunk-2CZEFXEW.cjs');
5
- require('../chunk-3UEVUYFQ.cjs');
6
5
  require('../chunk-JMCH2AFN.cjs');
7
- require('../chunk-G5JZGNKY.cjs');
6
+ require('../chunk-VBBJSIY7.cjs');
7
+ require('../chunk-G4FJGNY5.cjs');
8
+ require('../chunk-3UEVUYFQ.cjs');
8
9
  require('../chunk-QN4N4I3Z.cjs');
9
10
  require('../chunk-LYZJNEOR.cjs');
10
11
  require('../chunk-YZIR6LIY.cjs');
11
12
  require('../chunk-RPTRTGC2.cjs');
12
- require('../chunk-OHIB3TEN.cjs');
13
13
  require('../chunk-LBWMTA5T.cjs');
14
14
  require('../chunk-Q7E73DVJ.cjs');
15
15
  require('../chunk-JR4TVE43.cjs');
16
16
  require('../chunk-VXZURKMQ.cjs');
17
17
  require('../chunk-6BOWMGFG.cjs');
18
- require('../chunk-G4FJGNY5.cjs');
18
+ require('../chunk-OHIB3TEN.cjs');
19
19
 
20
20
 
21
21
 
22
22
  Object.defineProperty(exports, "TreeEntries", {
23
23
  enumerable: true,
24
- get: function () { return chunkEC4HJUX6_cjs.TreeEntries; }
24
+ get: function () { return chunk4KWGGESI_cjs.TreeEntries; }
25
25
  });
26
26
  Object.defineProperty(exports, "TreeEntryItem", {
27
27
  enumerable: true,
28
- get: function () { return chunkEC4HJUX6_cjs.TreeEntryItem; }
28
+ get: function () { return chunk4KWGGESI_cjs.TreeEntryItem; }
29
29
  });
30
30
  Object.defineProperty(exports, "TreeSearchBar", {
31
31
  enumerable: true,
32
- get: function () { return chunkEC4HJUX6_cjs.TreeSearchBar; }
32
+ get: function () { return chunk4KWGGESI_cjs.TreeSearchBar; }
33
33
  });
34
34
  Object.defineProperty(exports, "TreeView", {
35
35
  enumerable: true,
36
- get: function () { return chunkEC4HJUX6_cjs.TreeView; }
36
+ get: function () { return chunk4KWGGESI_cjs.TreeView; }
37
37
  });
@@ -1,16 +1,16 @@
1
- export { TreeEntries, TreeEntryItem, TreeSearchBar, TreeView } from '../chunk-CUOGY4FW.mjs';
1
+ export { TreeEntries, TreeEntryItem, TreeSearchBar, TreeView } from '../chunk-VA3PEYFM.mjs';
2
2
  import '../chunk-ZNPI2TYG.mjs';
3
- import '../chunk-4XUJBMDE.mjs';
4
3
  import '../chunk-BNDRHLLZ.mjs';
5
- import '../chunk-PDOFOJ4P.mjs';
4
+ import '../chunk-BEJIZ56L.mjs';
5
+ import '../chunk-SAGQV2YZ.mjs';
6
+ import '../chunk-4XUJBMDE.mjs';
6
7
  import '../chunk-F7ZHPSLA.mjs';
7
8
  import '../chunk-OEIF3JCH.mjs';
8
9
  import '../chunk-VA4LUFKD.mjs';
9
10
  import '../chunk-4F2GSF2T.mjs';
10
- import '../chunk-HMN4IKTG.mjs';
11
11
  import '../chunk-IDUVYPN7.mjs';
12
12
  import '../chunk-3QT5VABC.mjs';
13
13
  import '../chunk-XHJDRQD7.mjs';
14
14
  import '../chunk-LQOPO4KU.mjs';
15
15
  import '../chunk-IZARTVYN.mjs';
16
- import '../chunk-SAGQV2YZ.mjs';
16
+ import '../chunk-HMN4IKTG.mjs';
@@ -5,12 +5,12 @@ require('../../chunk-QN4N4I3Z.cjs');
5
5
  require('../../chunk-LYZJNEOR.cjs');
6
6
  require('../../chunk-YZIR6LIY.cjs');
7
7
  require('../../chunk-RPTRTGC2.cjs');
8
- require('../../chunk-OHIB3TEN.cjs');
9
8
  require('../../chunk-LBWMTA5T.cjs');
10
9
  require('../../chunk-Q7E73DVJ.cjs');
11
10
  require('../../chunk-JR4TVE43.cjs');
12
11
  require('../../chunk-VXZURKMQ.cjs');
13
12
  require('../../chunk-6BOWMGFG.cjs');
13
+ require('../../chunk-OHIB3TEN.cjs');
14
14
 
15
15
 
16
16
 
@@ -3,9 +3,9 @@ import '../../chunk-F7ZHPSLA.mjs';
3
3
  import '../../chunk-OEIF3JCH.mjs';
4
4
  import '../../chunk-VA4LUFKD.mjs';
5
5
  import '../../chunk-4F2GSF2T.mjs';
6
- import '../../chunk-HMN4IKTG.mjs';
7
6
  import '../../chunk-IDUVYPN7.mjs';
8
7
  import '../../chunk-3QT5VABC.mjs';
9
8
  import '../../chunk-XHJDRQD7.mjs';
10
9
  import '../../chunk-LQOPO4KU.mjs';
11
10
  import '../../chunk-IZARTVYN.mjs';
11
+ import '../../chunk-HMN4IKTG.mjs';
@@ -6,12 +6,12 @@ require('../../chunk-QN4N4I3Z.cjs');
6
6
  require('../../chunk-LYZJNEOR.cjs');
7
7
  require('../../chunk-YZIR6LIY.cjs');
8
8
  require('../../chunk-RPTRTGC2.cjs');
9
- require('../../chunk-OHIB3TEN.cjs');
10
9
  require('../../chunk-LBWMTA5T.cjs');
11
10
  require('../../chunk-Q7E73DVJ.cjs');
12
11
  require('../../chunk-JR4TVE43.cjs');
13
12
  require('../../chunk-VXZURKMQ.cjs');
14
13
  require('../../chunk-6BOWMGFG.cjs');
14
+ require('../../chunk-OHIB3TEN.cjs');
15
15
 
16
16
 
17
17
 
@@ -4,9 +4,9 @@ import '../../chunk-F7ZHPSLA.mjs';
4
4
  import '../../chunk-OEIF3JCH.mjs';
5
5
  import '../../chunk-VA4LUFKD.mjs';
6
6
  import '../../chunk-4F2GSF2T.mjs';
7
- import '../../chunk-HMN4IKTG.mjs';
8
7
  import '../../chunk-IDUVYPN7.mjs';
9
8
  import '../../chunk-3QT5VABC.mjs';
10
9
  import '../../chunk-XHJDRQD7.mjs';
11
10
  import '../../chunk-LQOPO4KU.mjs';
12
11
  import '../../chunk-IZARTVYN.mjs';
12
+ import '../../chunk-HMN4IKTG.mjs';
@@ -6,12 +6,12 @@ require('../../chunk-QN4N4I3Z.cjs');
6
6
  require('../../chunk-LYZJNEOR.cjs');
7
7
  require('../../chunk-YZIR6LIY.cjs');
8
8
  require('../../chunk-RPTRTGC2.cjs');
9
- require('../../chunk-OHIB3TEN.cjs');
10
9
  require('../../chunk-LBWMTA5T.cjs');
11
10
  require('../../chunk-Q7E73DVJ.cjs');
12
11
  require('../../chunk-JR4TVE43.cjs');
13
12
  require('../../chunk-VXZURKMQ.cjs');
14
13
  require('../../chunk-6BOWMGFG.cjs');
14
+ require('../../chunk-OHIB3TEN.cjs');
15
15
 
16
16
 
17
17
 
@@ -4,9 +4,9 @@ import '../../chunk-F7ZHPSLA.mjs';
4
4
  import '../../chunk-OEIF3JCH.mjs';
5
5
  import '../../chunk-VA4LUFKD.mjs';
6
6
  import '../../chunk-4F2GSF2T.mjs';
7
- import '../../chunk-HMN4IKTG.mjs';
8
7
  import '../../chunk-IDUVYPN7.mjs';
9
8
  import '../../chunk-3QT5VABC.mjs';
10
9
  import '../../chunk-XHJDRQD7.mjs';
11
10
  import '../../chunk-LQOPO4KU.mjs';
12
11
  import '../../chunk-IZARTVYN.mjs';
12
+ import '../../chunk-HMN4IKTG.mjs';
@@ -5,12 +5,12 @@ require('../../chunk-QN4N4I3Z.cjs');
5
5
  require('../../chunk-LYZJNEOR.cjs');
6
6
  require('../../chunk-YZIR6LIY.cjs');
7
7
  require('../../chunk-RPTRTGC2.cjs');
8
- require('../../chunk-OHIB3TEN.cjs');
9
8
  require('../../chunk-LBWMTA5T.cjs');
10
9
  require('../../chunk-Q7E73DVJ.cjs');
11
10
  require('../../chunk-JR4TVE43.cjs');
12
11
  require('../../chunk-VXZURKMQ.cjs');
13
12
  require('../../chunk-6BOWMGFG.cjs');
13
+ require('../../chunk-OHIB3TEN.cjs');
14
14
 
15
15
 
16
16
 
@@ -3,9 +3,9 @@ import '../../chunk-F7ZHPSLA.mjs';
3
3
  import '../../chunk-OEIF3JCH.mjs';
4
4
  import '../../chunk-VA4LUFKD.mjs';
5
5
  import '../../chunk-4F2GSF2T.mjs';
6
- import '../../chunk-HMN4IKTG.mjs';
7
6
  import '../../chunk-IDUVYPN7.mjs';
8
7
  import '../../chunk-3QT5VABC.mjs';
9
8
  import '../../chunk-XHJDRQD7.mjs';
10
9
  import '../../chunk-LQOPO4KU.mjs';
11
10
  import '../../chunk-IZARTVYN.mjs';
11
+ import '../../chunk-HMN4IKTG.mjs';
@@ -1,14 +1,16 @@
1
1
  'use strict';
2
2
 
3
- var chunkZ35DNFRZ_cjs = require('../../chunk-Z35DNFRZ.cjs');
3
+ var chunkO66RESRR_cjs = require('../../chunk-O66RESRR.cjs');
4
4
  require('../../chunk-WJL5HMO6.cjs');
5
5
  require('../../chunk-RJ7I6ZQK.cjs');
6
+ require('../../chunk-MVAFOQ67.cjs');
6
7
  require('../../chunk-TUYG6BYZ.cjs');
7
8
  require('../../chunk-YXFHJKNW.cjs');
8
9
  require('../../chunk-5MNZYCN2.cjs');
9
10
  require('../../chunk-Z6UDRPC2.cjs');
10
11
  require('../../chunk-YJ6X6T5K.cjs');
11
12
  require('../../chunk-G5NT42YF.cjs');
13
+ require('../../chunk-55RSKLJ5.cjs');
12
14
  require('../../chunk-HAVTMZR3.cjs');
13
15
  require('../../chunk-EEGQLTSQ.cjs');
14
16
  require('../../chunk-VOTZLQ6J.cjs');
@@ -16,29 +18,27 @@ require('../../chunk-2J75MYQA.cjs');
16
18
  require('../../chunk-LP3AGGRK.cjs');
17
19
  var chunkG2ZYONQO_cjs = require('../../chunk-G2ZYONQO.cjs');
18
20
  require('../../chunk-6TSA7KXX.cjs');
19
- require('../../chunk-MVAFOQ67.cjs');
20
- require('../../chunk-55RSKLJ5.cjs');
21
21
  require('../../chunk-2CZEFXEW.cjs');
22
- require('../../chunk-3UEVUYFQ.cjs');
23
22
  require('../../chunk-JMCH2AFN.cjs');
24
- require('../../chunk-G5JZGNKY.cjs');
23
+ require('../../chunk-VBBJSIY7.cjs');
24
+ require('../../chunk-G4FJGNY5.cjs');
25
+ require('../../chunk-3UEVUYFQ.cjs');
25
26
  require('../../chunk-QN4N4I3Z.cjs');
26
27
  require('../../chunk-LYZJNEOR.cjs');
27
28
  require('../../chunk-YZIR6LIY.cjs');
28
29
  require('../../chunk-RPTRTGC2.cjs');
29
- require('../../chunk-OHIB3TEN.cjs');
30
30
  require('../../chunk-LBWMTA5T.cjs');
31
31
  require('../../chunk-Q7E73DVJ.cjs');
32
32
  require('../../chunk-JR4TVE43.cjs');
33
33
  require('../../chunk-VXZURKMQ.cjs');
34
34
  require('../../chunk-6BOWMGFG.cjs');
35
- require('../../chunk-G4FJGNY5.cjs');
35
+ require('../../chunk-OHIB3TEN.cjs');
36
36
 
37
37
 
38
38
 
39
39
  Object.defineProperty(exports, "Waterfall", {
40
40
  enumerable: true,
41
- get: function () { return chunkZ35DNFRZ_cjs.Waterfall; }
41
+ get: function () { return chunkO66RESRR_cjs.Waterfall; }
42
42
  });
43
43
  Object.defineProperty(exports, "TOTAL_DURATION", {
44
44
  enumerable: true,
@@ -1,12 +1,14 @@
1
- export { Waterfall } from '../../chunk-QLCEHV4Q.mjs';
1
+ export { Waterfall } from '../../chunk-C7VGRU3O.mjs';
2
2
  import '../../chunk-JWKOW2OV.mjs';
3
3
  import '../../chunk-VPQ5SSY3.mjs';
4
+ import '../../chunk-OC4HRPZU.mjs';
4
5
  import '../../chunk-N6DSPSMM.mjs';
5
6
  import '../../chunk-CO6EASQO.mjs';
6
7
  import '../../chunk-IR334P7F.mjs';
7
8
  import '../../chunk-CIPI2V54.mjs';
8
9
  import '../../chunk-WPDU2YYR.mjs';
9
10
  import '../../chunk-HVVT3D2T.mjs';
11
+ import '../../chunk-73VF2W3D.mjs';
10
12
  import '../../chunk-VQPJ7TLB.mjs';
11
13
  import '../../chunk-PC5DHSC4.mjs';
12
14
  import '../../chunk-HTAFERCZ.mjs';
@@ -14,20 +16,18 @@ import '../../chunk-SA5WKLYB.mjs';
14
16
  import '../../chunk-5EXV5EWF.mjs';
15
17
  export { TOTAL_DURATION, borderColorClasses, colorClasses, formatDuration, leftWedgeClasses, rightWedgeClasses } from '../../chunk-4U232QAX.mjs';
16
18
  import '../../chunk-K22BEXUA.mjs';
17
- import '../../chunk-OC4HRPZU.mjs';
18
- import '../../chunk-73VF2W3D.mjs';
19
19
  import '../../chunk-ZNPI2TYG.mjs';
20
- import '../../chunk-4XUJBMDE.mjs';
21
20
  import '../../chunk-BNDRHLLZ.mjs';
22
- import '../../chunk-PDOFOJ4P.mjs';
21
+ import '../../chunk-BEJIZ56L.mjs';
22
+ import '../../chunk-SAGQV2YZ.mjs';
23
+ import '../../chunk-4XUJBMDE.mjs';
23
24
  import '../../chunk-F7ZHPSLA.mjs';
24
25
  import '../../chunk-OEIF3JCH.mjs';
25
26
  import '../../chunk-VA4LUFKD.mjs';
26
27
  import '../../chunk-4F2GSF2T.mjs';
27
- import '../../chunk-HMN4IKTG.mjs';
28
28
  import '../../chunk-IDUVYPN7.mjs';
29
29
  import '../../chunk-3QT5VABC.mjs';
30
30
  import '../../chunk-XHJDRQD7.mjs';
31
31
  import '../../chunk-LQOPO4KU.mjs';
32
32
  import '../../chunk-IZARTVYN.mjs';
33
- import '../../chunk-SAGQV2YZ.mjs';
33
+ import '../../chunk-HMN4IKTG.mjs';
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@vuer-ai/vuer-uikit",
3
3
  "author": "Ge Yang",
4
- "version": "0.0.96",
4
+ "version": "0.0.98",
5
5
  "files": [
6
6
  "/dist",
7
- "/cli"
7
+ "/cli",
8
+ "/src"
8
9
  ],
9
10
  "bin": {
10
11
  "dial-cli": "./cli/dial-cli.js"
@@ -19,6 +20,31 @@
19
20
  "import": "./dist/index.mjs",
20
21
  "require": "./dist/index.cjs"
21
22
  },
23
+ "./src": {
24
+ "types": "./src/index.ts",
25
+ "import": "./src/index.ts",
26
+ "require": "./src/index.ts"
27
+ },
28
+ "./src/dial": {
29
+ "types": "./src/dial/index.ts",
30
+ "import": "./src/dial/index.ts",
31
+ "require": "./src/dial/index.ts"
32
+ },
33
+ "./src/ui/card": {
34
+ "types": "./src/ui/card.tsx",
35
+ "import": "./src/ui/card.tsx",
36
+ "require": "./src/ui/card.tsx"
37
+ },
38
+ "./src/ui/button": {
39
+ "types": "./src/ui/button.tsx",
40
+ "import": "./src/ui/button.tsx",
41
+ "require": "./src/ui/button.tsx"
42
+ },
43
+ "./src/ui/alert": {
44
+ "types": "./src/ui/alert.tsx",
45
+ "import": "./src/ui/alert.tsx",
46
+ "require": "./src/ui/alert.tsx"
47
+ },
22
48
  "./index.css": "./dist/index.css",
23
49
  "./styles/theme.css": "./dist/styles/theme.css",
24
50
  "./styles/toast.css": "./dist/styles/toast.css",
@@ -0,0 +1,283 @@
1
+ # Sync Scroll Module
2
+
3
+ A React module for synchronizing scroll positions between multiple components with master-slave-drag relationships.
4
+
5
+ ## Features
6
+
7
+ - 🔄 **Master-Slave Architecture** - Masters control slaves, slaves can't control masters
8
+ - 🎯 **Drag Role** - Special role for drag-based scroll controls
9
+ - ⚡ **High performance** - Uses requestAnimationFrame for smooth syncing
10
+ - 🎮 **Full control** - Enable/disable syncing dynamically
11
+ - 📦 **TypeScript support** - Fully typed for excellent DX
12
+ - 🧹 **Auto cleanup** - Proper cleanup on unmount
13
+
14
+ ## Quick Start
15
+
16
+ ### Basic Example
17
+
18
+ ```tsx
19
+ import { SyncScrollProvider, useSyncScroll } from "@/components/waterfall/SyncScroll";
20
+
21
+ function App() {
22
+ return (
23
+ <SyncScrollProvider>
24
+ <MasterPanel />
25
+ <SlavePanel />
26
+ </SyncScrollProvider>
27
+ );
28
+ }
29
+
30
+ function MasterPanel() {
31
+ const scrollRef = useSyncScroll({
32
+ id: "master",
33
+ role: "master", // Controls all panels
34
+ });
35
+
36
+ return (
37
+ <div ref={scrollRef} className="h-96 overflow-y-auto">
38
+ {/* Content */}
39
+ </div>
40
+ );
41
+ }
42
+
43
+ function SlavePanel() {
44
+ const scrollRef = useSyncScroll({
45
+ id: "slave",
46
+ role: "slave", // Controlled by master
47
+ });
48
+
49
+ return (
50
+ <div ref={scrollRef} className="h-96 overflow-y-auto">
51
+ {/* Content */}
52
+ </div>
53
+ );
54
+ }
55
+ ```
56
+
57
+ ### Complete Example with Drag Control
58
+
59
+ ```tsx
60
+ "use client";
61
+
62
+ import React from "react";
63
+ import { SyncScrollProvider, useSyncScroll, ScrollRole } from "@/components/waterfall/SyncScroll";
64
+
65
+ // Scrollable panel component
66
+ function Panel({
67
+ id,
68
+ title,
69
+ color,
70
+ role = "slave",
71
+ isDraggable = false,
72
+ }: {
73
+ id: string;
74
+ title: string;
75
+ color: string;
76
+ role?: ScrollRole;
77
+ isDraggable?: boolean;
78
+ }) {
79
+ const scrollRef = useSyncScroll({ id, role });
80
+ const [isDragging, setIsDragging] = React.useState(false);
81
+ const dragStartY = React.useRef(0);
82
+ const scrollStartTop = React.useRef(0);
83
+
84
+ const handleMouseDown = (e: React.MouseEvent) => {
85
+ if (!isDraggable || !scrollRef.current) return;
86
+
87
+ setIsDragging(true);
88
+ dragStartY.current = e.clientY;
89
+ scrollStartTop.current = scrollRef.current.scrollTop;
90
+ e.preventDefault();
91
+ };
92
+
93
+ React.useEffect(() => {
94
+ if (!isDraggable) return;
95
+
96
+ const handleMouseMove = (e: MouseEvent) => {
97
+ if (!isDragging || !scrollRef.current) return;
98
+
99
+ const deltaY = e.clientY - dragStartY.current;
100
+ scrollRef.current.scrollTop = scrollStartTop.current - deltaY * 2;
101
+ };
102
+
103
+ const handleMouseUp = () => {
104
+ setIsDragging(false);
105
+ };
106
+
107
+ if (isDragging) {
108
+ document.addEventListener("mousemove", handleMouseMove);
109
+ document.addEventListener("mouseup", handleMouseUp);
110
+
111
+ return () => {
112
+ document.removeEventListener("mousemove", handleMouseMove);
113
+ document.removeEventListener("mouseup", handleMouseUp);
114
+ };
115
+ }
116
+ }, [isDragging, isDraggable, scrollRef]);
117
+
118
+ return (
119
+ <div className="h-96 overflow-hidden rounded-lg border">
120
+ <div className={`p-3 font-semibold ${color} flex justify-between text-white`}>
121
+ <span>{title}</span>
122
+ <span className="rounded bg-black/20 px-2 py-1 text-xs">{role.toUpperCase()}</span>
123
+ </div>
124
+ <div
125
+ ref={scrollRef}
126
+ className={`h-full overflow-y-auto p-4 ${isDraggable ? "cursor-grab active:cursor-grabbing" : ""}`}
127
+ onMouseDown={handleMouseDown}
128
+ style={{ userSelect: isDragging ? "none" : "auto" }}
129
+ >
130
+ {isDraggable && (
131
+ <div className="mb-4 rounded bg-yellow-100 p-2 text-sm dark:bg-yellow-900">
132
+ 🖱️ Click and drag to scroll all panels
133
+ </div>
134
+ )}
135
+ {Array.from({ length: 50 }, (_, i) => (
136
+ <div key={i} className="border-b py-3">
137
+ Item {i + 1}
138
+ </div>
139
+ ))}
140
+ </div>
141
+ </div>
142
+ );
143
+ }
144
+
145
+ export default function SyncScrollDemo() {
146
+ return (
147
+ <main className="min-h-screen p-8">
148
+ <div className="mx-auto max-w-6xl space-y-8">
149
+ <h1 className="mb-2 text-center text-3xl font-bold">Master-Slave Sync Scroll Demo</h1>
150
+
151
+ <SyncScrollProvider>
152
+ <div className="grid grid-cols-3 gap-4">
153
+ <Panel id="master" title="Master Panel" color="bg-red-500" role="master" />
154
+ <Panel
155
+ id="drag"
156
+ title="Drag Control"
157
+ color="bg-yellow-500"
158
+ role="drag"
159
+ isDraggable={true}
160
+ />
161
+ <Panel id="slave" title="Slave Panel" color="bg-blue-500" role="slave" />
162
+ </div>
163
+ </SyncScrollProvider>
164
+ </div>
165
+ </main>
166
+ );
167
+ }
168
+ ```
169
+
170
+ ## API Reference
171
+
172
+ ### `SyncScrollProvider`
173
+
174
+ The context provider that manages scroll synchronization.
175
+
176
+ ```tsx
177
+ <SyncScrollProvider>{children}</SyncScrollProvider>
178
+ ```
179
+
180
+ ### `useSyncScroll(options)`
181
+
182
+ Hook that returns a ref to attach to your scrollable element.
183
+
184
+ #### Options
185
+
186
+ | Option | Type | Default | Description |
187
+ | --------- | -------------------------------------- | ------------ | -------------------------------------------- |
188
+ | `id` | `string` | required | Unique identifier for the scrollable element |
189
+ | `role` | `'master' \| 'slave' \| 'drag'` | `'slave'` | Scroll control role (see Roles section) |
190
+ | `enabled` | `boolean` | `true` | Enable/disable scroll syncing |
191
+ | `axis` | `'vertical' \| 'horizontal' \| 'both'` | `'vertical'` | Axis to synchronize |
192
+
193
+ #### Returns
194
+
195
+ - `RefObject<HTMLDivElement>` - Ref to attach to your scrollable element
196
+
197
+ ### Scroll Roles
198
+
199
+ The sync scroll system supports three types of roles:
200
+
201
+ #### **Master**
202
+
203
+ - Controls all other elements (masters and slaves)
204
+ - Can sync with other masters
205
+ - Use case: Main content area that drives the scroll
206
+
207
+ #### **Slave**
208
+
209
+ - Controlled by masters
210
+ - Can only sync with other slaves (cannot control masters)
211
+ - Use case: Secondary panels that follow the main content
212
+
213
+ #### **Drag**
214
+
215
+ - Acts like master (controls all elements)
216
+ - Designed for drag-based scroll interactions
217
+ - Use case: Custom scrollbars or drag handles
218
+
219
+ #### Role Relationships
220
+
221
+ | Source → Target | Master | Slave | Drag |
222
+ | --------------- | ------ | ----- | ---- |
223
+ | **Master →** | ✅ | ✅ | ✅ |
224
+ | **Slave →** | ❌ | ✅ | ❌ |
225
+ | **Drag →** | ✅ | ✅ | ✅ |
226
+
227
+ ### `useSyncScrollWithRef(ref, options)`
228
+
229
+ Alternative hook when you already have a ref.
230
+
231
+ ```tsx
232
+ const myRef = useRef<HTMLDivElement>(null);
233
+ useSyncScrollWithRef(myRef, { id: "sidebar", role: "master" });
234
+
235
+ return <div ref={myRef}>...</div>;
236
+ ```
237
+
238
+ ## Use Cases
239
+
240
+ - **Timeline Components** - Keep timeline and event list synchronized with master-slave control
241
+ - **Code Editors** - Line numbers as master, code content as slave
242
+ - **Data Tables** - Header as master, scrollable content as slave
243
+ - **Documentation** - Navigation as master, content preview as slave
244
+ - **Custom Scrollbars** - Drag handle controls multiple panels
245
+
246
+ ## Performance Considerations
247
+
248
+ - Uses `requestAnimationFrame` for smooth updates
249
+ - Prevents circular updates with intelligent tracking
250
+ - Passive event listeners for better scroll performance
251
+ - Automatic cleanup prevents memory leaks
252
+
253
+ ## Troubleshooting
254
+
255
+ ### Elements not syncing
256
+
257
+ 1. Ensure all elements are wrapped in the same `SyncScrollProvider`
258
+ 2. Check that each element has a unique `id`
259
+ 3. Verify `enabled` is `true` (or omitted)
260
+ 4. Check role relationships - slaves can't control masters
261
+
262
+ ### Jerky scrolling
263
+
264
+ - This usually happens if elements have different content heights
265
+ - Ensure synced elements have similar scroll ranges
266
+ - Consider using `transform` instead of scroll for smoother animation
267
+
268
+ ### Memory leaks
269
+
270
+ - The module automatically cleans up on unmount
271
+ - If using `useSyncScrollWithRef`, ensure the ref is stable (not recreated on each render)
272
+
273
+ ## Browser Support
274
+
275
+ Works in all modern browsers that support:
276
+
277
+ - React 16.8+ (Hooks)
278
+ - `requestAnimationFrame`
279
+ - Passive event listeners
280
+
281
+ ## License
282
+
283
+ Part of the Timeline Waterfall component library.