@@ -9,28 +9,48 @@ import { isDev } from "./utils/isDev";
99import { useGetSocket } from "./hooks/useGetSocket" ;
1010import { Radio } from "lucide-react" ;
1111import { useResize } from "./hooks/useResize" ;
12+ import { useLocation } from "@remix-run/react" ;
1213
1314interface Props {
15+ position :
16+ | "bottom-right"
17+ | "bottom-left"
18+ | "top-right"
19+ | "top-left"
20+ | "middle-right"
21+ | "middle-left" ;
1422 defaultOpen : boolean ;
1523}
1624
17- const RemixDevTools = ( { defaultOpen } : Props ) => {
25+ const RemixDevTools = ( { defaultOpen, position } : Props ) => {
1826 const [ isOpen , setIsOpen ] = useState ( defaultOpen ) ;
1927 const { activeTab, setActiveTab, setShouldConnectWithForge, height } =
2028 useRDTContext ( ) ;
2129 const { enableResize, disableResize, isResizing } = useResize ( ) ;
2230 useTimelineHandler ( ) ;
2331 const { isConnected, isConnecting } = useGetSocket ( ) ;
2432 const Component = tabs . find ( ( tab ) => tab . id === activeTab ) ?. component ;
33+ const leftSideOriented =
34+ position === "top-left" ||
35+ position === "bottom-left" ||
36+ position === "middle-left" ;
2537
2638 return (
2739 < div className = "remix-dev-tools" >
2840 < div
2941 style = { { zIndex : 9999 } }
3042 onClick = { ( ) => setIsOpen ( ! isOpen ) }
31- className = {
32- "rdt-fixed rdt-bottom-0 rdt-right-0 rdt-m-1.5 rdt-h-14 rdt-w-14 rdt-cursor-pointer rdt-rounded-full "
33- }
43+ className = { clsx (
44+ "rdt-fixed rdt-m-1.5 rdt-h-14 rdt-w-14 rdt-cursor-pointer rdt-rounded-full " ,
45+ position === "bottom-right" && "rdt-bottom-0 rdt-right-0" ,
46+ position === "bottom-left" && "rdt-bottom-0 rdt-left-0" ,
47+ position === "top-right" && "rdt-right-0 rdt-top-0" ,
48+ position === "top-left" && "rdt-left-0 rdt-top-0" ,
49+ position === "middle-right" &&
50+ "rdt-right-0 rdt-top-1/2 -rdt-translate-y-1/2" ,
51+ position === "middle-left" &&
52+ "rdt-left-0 rdt-top-1/2 -rdt-translate-y-1/2"
53+ ) }
3454 >
3555 < Logo
3656 className = { clsx (
@@ -93,11 +113,21 @@ const RemixDevTools = ({ defaultOpen }: Props) => {
93113 ) }
94114 </ div >
95115 < div className = "rdt-flex rdt-h-full rdt-w-full rdt-overflow-y-hidden" >
96- < div className = "rdt-z-20 rdt-h-full rdt-w-full rdt-bg-[#212121] rdt-p-2 rdt-pl-8 " >
116+ < div
117+ className = { clsx (
118+ "rdt-z-20 rdt-h-full rdt-w-full rdt-bg-[#212121] rdt-p-2" ,
119+ leftSideOriented ? "rdt-pl-16" : "rdt-pl-8"
120+ ) }
121+ >
97122 { Component }
98123 </ div >
99124 < div className = "rdt-w-1 rdt-bg-gray-500/20" > </ div >
100- < div className = "rdt-z-10 rdt-h-full rdt-w-2/3 rdt-p-2 rdt-pr-16" >
125+ < div
126+ className = { clsx (
127+ "rdt-z-10 rdt-h-full rdt-w-2/3 rdt-p-2" ,
128+ leftSideOriented ? "rdt-pl-16" : "rdt-pr-16"
129+ ) }
130+ >
101131 { tabs . find ( ( t ) => t . id === "timeline" ) ?. component }
102132 </ div >
103133 </ div >
@@ -124,18 +154,27 @@ interface RemixDevToolsProps {
124154 port ?: number ;
125155 // Whether the dev tools should be open by default
126156 defaultOpen ?: boolean ;
157+ // Whether the dev tools require a url flag to be shown
158+ requireUrlFlag ?: boolean ;
159+ // Set the position of the trigger button
160+ position ?: Props [ "position" ] ;
127161}
128162
129163const RDTWithContext = ( {
130164 port = 3003 ,
131165 defaultOpen = false ,
166+ requireUrlFlag,
167+ position = "bottom-right" ,
132168} : RemixDevToolsProps ) => {
133169 const hydrated = useHydrated ( ) ;
134170 const isDevelopment = isDev ( ) ;
171+ const url = useLocation ( ) . search ;
172+
135173 if ( ! hydrated || ! isDevelopment ) return null ;
174+ if ( requireUrlFlag && ! url . includes ( "rdt=true" ) ) return null ;
136175 return (
137176 < RDTContextProvider port = { port } >
138- < RemixDevTools defaultOpen = { defaultOpen } />
177+ < RemixDevTools position = { position } defaultOpen = { defaultOpen } />
139178 </ RDTContextProvider >
140179 ) ;
141180} ;
0 commit comments