@@ -103,6 +103,39 @@ export function ReactQueryDevtools({
103103 initialIsOpen
104104 )
105105 const [ isResolvedOpen , setIsResolvedOpen ] = useSafeState ( false )
106+ const [ isResizing , setIsResizing ] = useSafeState ( false )
107+
108+ const handleDragStart = ( panelElement , startEvent ) => {
109+ if ( startEvent . button !== 0 ) return // Only allow left click for drag
110+
111+ setIsResizing ( true )
112+
113+ const dragInfo = {
114+ originalHeight : panelElement . getBoundingClientRect ( ) . height ,
115+ pageY : startEvent . pageY ,
116+ }
117+
118+ const run = moveEvent => {
119+ const delta = dragInfo . pageY - moveEvent . pageY
120+ const newHeight = dragInfo . originalHeight + delta
121+
122+ if ( newHeight < 70 ) {
123+ setIsOpen ( false )
124+ } else {
125+ setIsOpen ( true )
126+ panelElement . style . height = `${ newHeight } px`
127+ }
128+ }
129+
130+ const unsub = ( ) => {
131+ setIsResizing ( false )
132+ document . removeEventListener ( 'mousemove' , run )
133+ document . removeEventListener ( 'mouseUp' , unsub )
134+ }
135+
136+ document . addEventListener ( 'mousemove' , run )
137+ document . addEventListener ( 'mouseup' , unsub )
138+ }
106139
107140 React . useEffect ( ( ) => {
108141 setIsResolvedOpen ( isOpen )
@@ -114,6 +147,7 @@ export function ReactQueryDevtools({
114147
115148 const run = ( ) => {
116149 const containerHeight = panelRef . current ?. getBoundingClientRect ( ) . height
150+ console . log ( containerHeight )
117151 rootRef . current . parentElement . style . paddingBottom = `${ containerHeight } px`
118152 }
119153
@@ -144,25 +178,43 @@ export function ReactQueryDevtools({
144178
145179 return (
146180 < Container ref = { rootRef } className = "ReactQueryDevtools" >
147- { isResolvedOpen ? (
148- < ThemeProvider theme = { theme } >
149- < ReactQueryDevtoolsPanel
150- ref = { panelRef }
151- { ...otherPanelProps }
152- style = { {
153- position : 'fixed' ,
154- bottom : '0' ,
155- right : '0' ,
156- zIndex : '99999' ,
157- width : '100%' ,
158- height : '500px' ,
159- maxHeight : '90%' ,
160- boxShadow : '0 0 20px rgba(0,0,0,.3)' ,
161- borderTop : `1px solid ${ theme . gray } ` ,
162- ...panelStyle ,
163- } }
164- setIsOpen = { setIsOpen }
165- />
181+ < ThemeProvider theme = { theme } >
182+ < ReactQueryDevtoolsPanel
183+ ref = { panelRef }
184+ { ...otherPanelProps }
185+ style = { {
186+ position : 'fixed' ,
187+ bottom : '0' ,
188+ right : '0' ,
189+ zIndex : '99999' ,
190+ width : '100%' ,
191+ height : '500px' ,
192+ maxHeight : '90%' ,
193+ boxShadow : '0 0 20px rgba(0,0,0,.3)' ,
194+ borderTop : `1px solid ${ theme . gray } ` ,
195+ transformOrigin : 'top' ,
196+ ...panelStyle ,
197+ ...( isResizing
198+ ? {
199+ transition : `none` ,
200+ }
201+ : { transition : `all .2s ease` } ) ,
202+ ...( isResolvedOpen
203+ ? {
204+ opacity : 1 ,
205+ pointerEvents : 'all' ,
206+ transform : `translateY(0) scale(1)` ,
207+ }
208+ : {
209+ opacity : 0 ,
210+ pointerEvents : 'none' ,
211+ transform : `translateY(15px) scale(1.02)` ,
212+ } ) ,
213+ } }
214+ setIsOpen = { setIsOpen }
215+ handleDragStart = { e => handleDragStart ( panelRef . current , e ) }
216+ />
217+ { isResolvedOpen ? (
166218 < Button
167219 { ...otherCloseButtonProps }
168220 onClick = { ( ) => {
@@ -194,8 +246,9 @@ export function ReactQueryDevtools({
194246 >
195247 Close
196248 </ Button >
197- </ ThemeProvider >
198- ) : (
249+ ) : null }
250+ </ ThemeProvider >
251+ { ! isResolvedOpen ? (
199252 < button
200253 { ...otherToggleButtonProps }
201254 aria-label = "Open React Query Devtools"
@@ -240,7 +293,7 @@ export function ReactQueryDevtools({
240293 >
241294 < Logo aria-hidden />
242295 </ button >
243- ) }
296+ ) : null }
244297 </ Container >
245298 )
246299}
@@ -264,7 +317,7 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
264317 props : DevtoolsPanelOptions ,
265318 ref
266319 ) : React . ReactElement {
267- const { setIsOpen, ...panelProps } = props
320+ const { setIsOpen, handleDragStart , ...panelProps } = props
268321
269322 const queryClient = useQueryClient ( )
270323 const queryCache = queryClient . getQueryCache ( )
@@ -281,8 +334,6 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
281334 false
282335 )
283336
284- const [ isDragging , setIsDragging ] = useSafeState ( false )
285-
286337 const sortFn = React . useMemo ( ( ) => sortFns [ sort ] , [ sort ] )
287338
288339 React [ isServer ? 'useEffect' : 'useLayoutEffect' ] ( ( ) => {
@@ -291,36 +342,6 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
291342 }
292343 } , [ setSort , sortFn ] )
293344
294- React [ isServer ? 'useEffect' : 'useLayoutEffect' ] ( ( ) => {
295- if ( isDragging ) {
296- const run = e => {
297- const containerHeight = window . innerHeight - e . pageY
298-
299- if ( containerHeight < 70 ) {
300- setIsOpen ( false )
301- } else {
302- ref . current . style . height = `${ containerHeight } px`
303- }
304- }
305- document . addEventListener ( 'mousemove' , run )
306- document . addEventListener ( 'mouseup' , handleDragEnd )
307-
308- return ( ) => {
309- document . removeEventListener ( 'mousemove' , run )
310- document . removeEventListener ( 'mouseup' , handleDragEnd )
311- }
312- }
313- } , [ isDragging ] )
314-
315- const handleDragStart = e => {
316- if ( e . button !== 0 ) return // Only allow left click for drag
317- setIsDragging ( true )
318- }
319-
320- const handleDragEnd = e => {
321- setIsDragging ( false )
322- }
323-
324345 const [ unsortedQueries , setUnsortedQueries ] = useSafeState (
325346 Object . values ( queryCache . findAll ( ) )
326347 )
@@ -366,6 +387,30 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
366387 return (
367388 < ThemeProvider theme = { theme } >
368389 < Panel ref = { ref } className = "ReactQueryDevtoolsPanel" { ...panelProps } >
390+ < style
391+ dangerouslySetInnerHTML = { {
392+ __html : `
393+ .ReactQueryDevtoolsPanel * {
394+ scrollbar-color: ${ theme . backgroundAlt } ${ theme . gray } ;
395+ }
396+
397+ .ReactQueryDevtoolsPanel *::-webkit-scrollbar, .ReactQueryDevtoolsPanel scrollbar {
398+ width: 1rem;
399+ height: 1rem;
400+ }
401+
402+ .ReactQueryDevtoolsPanel *::-webkit-scrollbar-track, .ReactQueryDevtoolsPanel scrollbar-track {
403+ background: ${ theme . backgroundAlt } ;
404+ }
405+
406+ .ReactQueryDevtoolsPanel *::-webkit-scrollbar-thumb, .ReactQueryDevtoolsPanel scrollbar-thumb {
407+ background: ${ theme . gray } ;
408+ border-radius: .5rem;
409+ border: 3px solid ${ theme . backgroundAlt } ;
410+ }
411+ ` ,
412+ } }
413+ />
369414 < div
370415 style = { {
371416 position : 'absolute' ,
@@ -378,7 +423,6 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
378423 zIndex : 100000 ,
379424 } }
380425 onMouseDown = { handleDragStart }
381- onMouseUp = { handleDragEnd }
382426 > </ div >
383427 < div
384428 style = { {
@@ -497,7 +541,8 @@ export const ReactQueryDevtoolsPanel = React.forwardRef(
497541 </ div >
498542 < div
499543 style = { {
500- overflow : 'auto scroll' ,
544+ overflowY : 'auto' ,
545+ flex : '1' ,
501546 } }
502547 >
503548 { queries . map ( ( query , i ) => (
0 commit comments