Skip to content

Commit cc4f0c6

Browse files
committed
feat: render devtools in a shadow node
1 parent 133428e commit cc4f0c6

File tree

3 files changed

+38
-10
lines changed

3 files changed

+38
-10
lines changed

examples/react/basic/index.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,18 @@
3131
<description
3232
>A basic example of using TanStack Devtools with React.</description
3333
>
34+
35+
<!--
36+
These styles exist only to verify that the Devtools UI
37+
does NOT inherit global styles. Because the devtools are
38+
rendered inside a Shadow Root, the rules below should have
39+
no visible effect.
40+
-->
41+
<style type="text/css">
42+
[data-testid="tanstack_devtools"] * {
43+
color: red !important;
44+
}
45+
</style>
3446
</head>
3547
<body>
3648
<noscript>You need to enable JavaScript to run this app.</noscript>

packages/devtools/src/devtools.tsx

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,30 @@ export default function DevTools() {
188188
})
189189
const { theme } = useTheme()
190190

191+
const [gooberCss, setGooberCss] = createSignal("");
192+
createEffect(() => {
193+
// Setup mutation observer for goober styles with id `_goober
194+
const gooberStyles = document.querySelector('#_goober')
195+
if (gooberStyles) {
196+
setGooberCss(gooberStyles.textContent)
197+
const observer = new MutationObserver(() => {
198+
setGooberCss(gooberStyles.textContent)
199+
})
200+
observer.observe(gooberStyles, {
201+
childList: true, // observe direct children
202+
subtree: true, // and lower descendants too
203+
characterDataOldValue: true, // pass old data to callback
204+
})
205+
onCleanup(() => {
206+
observer.disconnect()
207+
})
208+
}
209+
})
210+
191211
return (
192212
<ThemeContextProvider theme={theme()}>
193-
<Portal mount={(pip().pipWindow ?? window).document.body}>
213+
<Portal mount={(pip().pipWindow ?? window).document.body} useShadow>
214+
<style>{gooberCss()}</style>
194215
<div ref={setRootEl} data-testid={TANSTACK_DEVTOOLS}>
195216
<Show
196217
when={

packages/react-devtools/src/devtools.tsx

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -157,15 +157,10 @@ export const TanStackDevtools = ({
157157
},
158158
render: (e, theme) => {
159159
const id = e.getAttribute('id')!
160-
const target = e.ownerDocument.getElementById(id)
161-
162-
if (target) {
163-
setPluginContainers((prev) => ({
164-
...prev,
165-
[id]: e,
166-
}))
167-
}
168-
160+
setPluginContainers((prev) => ({
161+
...prev,
162+
[id]: e,
163+
}))
169164
convertRender(plugin.render, setPluginComponents, e, theme)
170165
},
171166
}

0 commit comments

Comments
 (0)