diff --git a/.changeset/rare-moles-rest.md b/.changeset/rare-moles-rest.md new file mode 100644 index 00000000..9c23c530 --- /dev/null +++ b/.changeset/rare-moles-rest.md @@ -0,0 +1,8 @@ +--- +'@tanstack/react-devtools': minor +'@tanstack/devtools': minor +--- + +added optional trigger component in config + +removed trigger image setting completely diff --git a/examples/solid/basic/src/index.tsx b/examples/solid/basic/src/index.tsx index acd824cb..c9ac6b6e 100644 --- a/examples/solid/basic/src/index.tsx +++ b/examples/solid/basic/src/index.tsx @@ -19,6 +19,9 @@ function App() {

hello world

, + }} plugins={[ { name: 'TanStack Query', diff --git a/packages/devtools/src/components/trigger.tsx b/packages/devtools/src/components/trigger.tsx index a2944e79..07dc6eba 100644 --- a/packages/devtools/src/components/trigger.tsx +++ b/packages/devtools/src/components/trigger.tsx @@ -1,37 +1,49 @@ -import { Show, createMemo } from 'solid-js' +import { Show, createEffect, createMemo, createSignal } from 'solid-js' import clsx from 'clsx' import { useDevtoolsSettings } from '../context/use-devtools-context' import { useStyles } from '../styles/use-styles' import TanStackLogo from './tanstack-logo.png' import type { Accessor } from 'solid-js' -export const Trigger = ({ - isOpen, - setIsOpen, - image = TanStackLogo, -}: { +export const Trigger = (props: { isOpen: Accessor setIsOpen: (isOpen: boolean) => void - image: string }) => { const { settings } = useDevtoolsSettings() + const [containerRef, setContainerRef] = createSignal() const styles = useStyles() const buttonStyle = createMemo(() => { return clsx( styles().mainCloseBtn, styles().mainCloseBtnPosition(settings().position), - styles().mainCloseBtnAnimation(isOpen(), settings().hideUntilHover), + styles().mainCloseBtnAnimation(props.isOpen(), settings().hideUntilHover), ) }) + + createEffect(() => { + const triggerComponent = settings().customTrigger + const el = containerRef() + if (triggerComponent && el) { + triggerComponent(el, { + theme: settings().theme, + }) + } + }) + return ( ) diff --git a/packages/devtools/src/context/devtools-store.ts b/packages/devtools/src/context/devtools-store.ts index 8ff46b39..da30780a 100644 --- a/packages/devtools/src/context/devtools-store.ts +++ b/packages/devtools/src/context/devtools-store.ts @@ -18,6 +18,10 @@ type TriggerPosition = | 'middle-left' | 'middle-right' +type TriggerProps = { + theme: 'light' | 'dark' +} + export type DevtoolsStore = { settings: { /** @@ -61,15 +65,17 @@ export type DevtoolsStore = { * @default "dark" */ theme: 'light' | 'dark' - /** - * The image used for the dev tools trigger - * @default TanStackLogo - */ - triggerImage: string + /** * Whether the trigger should be completely hidden or not (you can still open with the hotkey) */ triggerHidden?: boolean + /** + * An optional custom function to render the dev tools trigger component. + * If provided, it replaces the default trigger button. + * @default undefined + */ + customTrigger?: (el: HTMLElement, props: TriggerProps) => void } state: { activeTab: TabName @@ -95,8 +101,8 @@ export const initialState: DevtoolsStore = { window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light', - triggerImage: '', triggerHidden: false, + customTrigger: undefined, }, state: { activeTab: 'plugins', diff --git a/packages/devtools/src/devtools.tsx b/packages/devtools/src/devtools.tsx index 9ca75eaf..4ee929fd 100644 --- a/packages/devtools/src/devtools.tsx +++ b/packages/devtools/src/devtools.tsx @@ -175,11 +175,7 @@ export default function DevTools() { : true } > - + (panelRef = ref)} diff --git a/packages/devtools/src/tabs/settings-tab.tsx b/packages/devtools/src/tabs/settings-tab.tsx index b4ac5fd3..147e8f7d 100644 --- a/packages/devtools/src/tabs/settings-tab.tsx +++ b/packages/devtools/src/tabs/settings-tab.tsx @@ -79,13 +79,7 @@ export const SettingsTab = () => { } checked={settings().triggerHidden} /> - setSettings({ triggerImage: value })} - /> +