diff --git a/.changeset/bright-routers-smile.md b/.changeset/bright-routers-smile.md
new file mode 100644
index 0000000000..30b4553e54
--- /dev/null
+++ b/.changeset/bright-routers-smile.md
@@ -0,0 +1,5 @@
+---
+'@tanstack/router-devtools-core': patch
+---
+
+Apply and update React toggle button props in the router devtools.
diff --git a/e2e/react-router/basic/src/main.tsx b/e2e/react-router/basic/src/main.tsx
index 36e5106654..ddb20fffc2 100644
--- a/e2e/react-router/basic/src/main.tsx
+++ b/e2e/react-router/basic/src/main.tsx
@@ -1,4 +1,5 @@
import ReactDOM from 'react-dom/client'
+import { useState } from 'react'
import {
ErrorComponent,
Link,
@@ -9,7 +10,7 @@ import {
createRouter,
redirect,
} from '@tanstack/react-router'
-import { TanStackRouterDevtools } from '@tanstack/react-router-devtools'
+import { TanStackRouterDevtoolsInProd as TanStackRouterDevtools } from '@tanstack/react-router-devtools'
import { NotFoundError, fetchPost, fetchPosts } from './posts'
import './styles.css'
import type { ErrorComponentProps } from '@tanstack/react-router'
@@ -27,6 +28,9 @@ const rootRoute = createRootRoute({
})
function RootComponent() {
+ const [usesUpdatedDevtoolsProps, setUsesUpdatedDevtoolsProps] =
+ useState(false)
+
return (
<>
@@ -88,7 +92,20 @@ function RootComponent() {
-
+
+
>
)
}
diff --git a/e2e/react-router/basic/tests/app.spec.ts b/e2e/react-router/basic/tests/app.spec.ts
index ec0e24d8a4..c5328836f7 100644
--- a/e2e/react-router/basic/tests/app.spec.ts
+++ b/e2e/react-router/basic/tests/app.spec.ts
@@ -62,3 +62,20 @@ test('Link in SVG does not trigger a full page reload', async ({ page }) => {
expect(fullPageLoad).toBeFalsy()
})
+
+test('Applies and updates React props on the devtools toggle button', async ({
+ page,
+}) => {
+ const initialToggleButton = page.getByRole('button', {
+ name: 'Custom Router Devtools',
+ })
+
+ await expect(initialToggleButton).toHaveClass(/initial-devtools-toggle/)
+
+ await page.getByRole('button', { name: 'Update devtools props' }).click()
+
+ const updatedToggleButton = page.getByRole('button', {
+ name: 'Updated Router Devtools',
+ })
+ await expect(updatedToggleButton).toHaveClass(/updated-devtools-toggle/)
+})
diff --git a/packages/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx b/packages/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx
index 2af93a98b9..7415d8e483 100644
--- a/packages/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx
+++ b/packages/router-devtools-core/src/FloatingTanStackRouterDevtools.tsx
@@ -1,6 +1,6 @@
import { clsx as cx } from 'clsx'
-import { createEffect, createMemo, createSignal } from 'solid-js'
+import { Show, createEffect, createMemo, createSignal } from 'solid-js'
import { Dynamic } from 'solid-js/web'
import { DevtoolsOnCloseContext } from './context'
@@ -32,9 +32,7 @@ export interface FloatingDevtoolsOptions {
/**
* Use this to add props to the toggle button. For example, you can add class, style (merge and override default style), onClick (extend default handler), etc.
*/
- toggleButtonProps?: any & {
- ref?: any
- }
+ toggleButtonProps?: Accessor
/**
* The position of the TanStack Router logo to open and close the devtools panel.
* Defaults to 'bottom-left'.
@@ -61,7 +59,7 @@ export function FloatingTanStackRouterDevtools({
initialIsOpen,
panelProps = {},
closeButtonProps = {},
- toggleButtonProps = {},
+ toggleButtonProps = () => undefined,
position = 'bottom-left',
containerElement: Container = 'footer',
router,
@@ -193,12 +191,6 @@ export function FloatingTanStackRouterDevtools({
...otherCloseButtonProps
} = closeButtonProps
- const {
- onClick: onToggleClick,
- class: toggleButtonClassName,
- ...otherToggleButtonProps
- } = toggleButtonProps
-
// Do not render on the server
if (!isMounted()) return null
@@ -224,15 +216,6 @@ export function FloatingTanStackRouterDevtools({
}
})
- const buttonStyle = createMemo(() => {
- return cx(
- styles().mainCloseBtn,
- styles().mainCloseBtnPosition(position),
- styles().mainCloseBtnAnimation(!!isOpen()),
- toggleButtonClassName,
- )
- })
-
return (
-
+
)
}
diff --git a/packages/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx b/packages/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx
index 883d8c6d52..0040195507 100644
--- a/packages/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx
+++ b/packages/router-devtools-core/src/TanStackRouterDevtoolsCore.tsx
@@ -58,7 +58,7 @@ export class TanStackRouterDevtoolsCore {
#panelProps: any
#closeButtonProps: any
- #toggleButtonProps: any
+ #toggleButtonProps: Signal
#containerElement?: string | any
#isMounted = false
@@ -74,7 +74,7 @@ export class TanStackRouterDevtoolsCore {
this.#panelProps = config.panelProps
this.#closeButtonProps = config.closeButtonProps
- this.#toggleButtonProps = config.toggleButtonProps
+ this.#toggleButtonProps = createSignal(config.toggleButtonProps)
this.#containerElement = config.containerElement
}
@@ -92,7 +92,7 @@ export class TanStackRouterDevtoolsCore {
const panelProps = this.#panelProps
const closeButtonProps = this.#closeButtonProps
- const toggleButtonProps = this.#toggleButtonProps
+ const [toggleButtonProps] = this.#toggleButtonProps
const containerElement = this.#containerElement
let Devtools
@@ -157,5 +157,9 @@ export class TanStackRouterDevtoolsCore {
if (options.containerElement !== undefined) {
this.#containerElement = options.containerElement
}
+
+ if ('toggleButtonProps' in options) {
+ this.#toggleButtonProps[1](options.toggleButtonProps)
+ }
}
}