6
6
import {
7
7
vw ,
8
8
sanitizeSidebarWidth ,
9
+ getRemInPixel ,
9
10
} from "src/util.js"
10
11
import {
11
12
useLayoutStore ,
@@ -15,45 +16,51 @@ import {
15
16
export const SideBar = ( { page, children} ) => {
16
17
let dragging = useViewStateStore ( state => state . dragging )
17
18
let setDragging = useViewStateStore ( state => state . setDragging )
19
+ let dragOffset = useRef ( 0 )
18
20
let sidebarWidth = useLayoutStore ( state => state . sidebarWidth [ page ] )
21
+ let sidebarWidthRef = useRef ( )
22
+ sidebarWidthRef . current = sidebarWidth
19
23
let setSidebarWidth = useLayoutStore ( state => state . setSidebarWidth )
20
24
let draggingRef = useRef ( )
21
- let ghostWidthRef = useRef ( )
22
25
draggingRef . current = dragging
23
- ghostWidthRef . current = sidebarWidth
26
+
24
27
useEffect ( ( ) => {
25
- let mousemove = ( e ) => {
28
+ let onMouseMove = ( e ) => {
26
29
if ( ! draggingRef . current ) {
27
30
return
28
31
}
29
- let width = sanitizeSidebarWidth ( vw ( ) - e . clientX )
32
+ let offset = dragOffset . current
33
+ let width = sanitizeSidebarWidth ( vw ( ) - e . clientX + offset )
30
34
setSidebarWidth ( page , width )
31
35
}
32
- let mouseup = ( ) => setDragging ( false )
33
- window . document . addEventListener ( "mousemove" , mousemove )
34
- window . document . addEventListener ( "mouseup" , mouseup )
36
+ let onMouseUp = ( ) => setDragging ( false )
37
+ window . document . addEventListener ( "mousemove" , onMouseMove )
38
+ window . document . addEventListener ( "mouseup" , onMouseUp )
35
39
return ( ) => {
36
- window . document . removeEventListener ( "mousemove" , mousemove )
37
- window . document . removeEventListener ( "mouseup" , mouseup )
40
+ window . document . removeEventListener ( "mousemove" , onMouseMove )
41
+ window . document . removeEventListener ( "mouseup" , onMouseUp )
38
42
}
39
- } , [ page , draggingRef , setDragging , setSidebarWidth ] )
43
+ } , [ page , setDragging , setSidebarWidth ] )
44
+
40
45
let onMouseDown = useCallback ( ( e ) => {
41
46
e . preventDefault ( )
42
47
setDragging ( true )
48
+ let sidebarWidth = sidebarWidthRef . current
49
+ dragOffset . current = sidebarWidth + e . clientX - vw ( )
43
50
} , [ setDragging ] )
51
+
52
+ let ghostWidth = Math . trunc ( getRemInPixel ( ) * 0.5 ) + 2
44
53
return (
45
54
< div
46
55
style = { { width : sidebarWidth + "px" } }
47
- className = "fixed top-0 right-0 h-full bg-slate-800" >
56
+ className = "absolute border-l border-gray-500 top-0 right-0 h-full bg-slate-800" >
48
57
< div
49
- onMouseDown = { onMouseDown }
50
- style = { { right : sidebarWidth + "px" } }
51
- className = "fixed top-0 w-[3px] h-full bg-slate-700 z-10 cursor-col-resize" />
52
- { dragging && (
53
- < div
54
- style = { { right : sidebarWidth + "px" } }
55
- className = "fixed top-0 w-[3px] h-full bg-slate-600 z-20" />
56
- ) }
58
+ onMouseDown = { ! dragging ? onMouseDown : undefined }
59
+ style = { {
60
+ right : ( sidebarWidth - ghostWidth + 1 ) ,
61
+ width : Math . trunc ( getRemInPixel ( ) * 0.5 ) + 2 ,
62
+ } }
63
+ className = "absolute top-0 h-full bg-transparent z-20 cursor-col-resize" />
57
64
{ children }
58
65
</ div >
59
66
)
0 commit comments