diff --git a/src/devtools/views/Components/Element.css b/src/devtools/views/Components/Element.css index 72f6d68a2f..081a54d6ce 100644 --- a/src/devtools/views/Components/Element.css +++ b/src/devtools/views/Components/Element.css @@ -1,5 +1,6 @@ .Element, -.SelectedElement { +.SelectedElement, +.InactiveElement { border-radius: 0.25em; white-space: nowrap; line-height: var(--line-height-data); @@ -13,6 +14,9 @@ .Element:hover { background-color: var(--color-hover-background); } +.InactiveElement { + background-color: var(--color-inactive-background); +} .SelectedElement { background-color: var(--color-selected-background); diff --git a/src/devtools/views/Components/Element.js b/src/devtools/views/Components/Element.js index f696a1e3cd..a38fc842bd 100644 --- a/src/devtools/views/Components/Element.js +++ b/src/devtools/views/Components/Element.js @@ -43,6 +43,7 @@ export default function ElementView({ data, index, style }: Props) { const id = element === null ? null : element.id; const isSelected = selectedElementID === id; const lastScrolledIDRef = data.lastScrolledIDRef; + const treeFocused = data.treeFocused; const handleDoubleClick = useCallback(() => { if (id !== null) { @@ -117,7 +118,13 @@ export default function ElementView({ data, index, style }: Props) { return (
Element | null, lastScrolledIDRef: { current: number | null }, + treeFocused: boolean, |}; type Props = {||}; @@ -48,6 +50,9 @@ export default function Tree(props: Props) { // $FlowFixMe https://github.com/facebook/flow/issues/7341 const listRef = useRef | null>(null); const treeRef = useRef(null); + const elementsRef = useRef(null); + + const [treeFocused, setTreeFocused] = useState(false); const { lineHeight } = useContext(SettingsContext); @@ -142,6 +147,30 @@ export default function Tree(props: Props) { store, ]); + useEffect(() => { + if (elementsRef.current === null) { + return () => {}; + } + + const handleFocusIn = () => { + setTreeFocused(true); + }; + + const handleFocusOut = () => { + setTreeFocused(false); + }; + + const elementsElement = elementsRef.current; + + elementsElement.addEventListener('focusin', handleFocusIn); + elementsElement.addEventListener('focusout', handleFocusOut); + + return () => { + elementsElement.removeEventListener('focusin', handleFocusIn); + elementsElement.removeEventListener('focusout', handleFocusOut); + }; + }, []); + // Let react-window know to re-render any time the underlying tree data changes. // This includes the owner context, since it controls a filtered view of the tree. const itemData = useMemo( @@ -150,8 +179,9 @@ export default function Tree(props: Props) { numElements, getElementAtIndex, lastScrolledIDRef, + treeFocused, }), - [baseDepth, numElements, getElementAtIndex, lastScrolledIDRef] + [baseDepth, numElements, getElementAtIndex, lastScrolledIDRef, treeFocused] ); const handleMouseLeave = useCallback(() => { @@ -164,7 +194,11 @@ export default function Tree(props: Props) { {ownerStack.length > 0 ? : }
-
+
{({ height, width }) => ( // $FlowFixMe https://github.com/facebook/flow/issues/7341 diff --git a/src/devtools/views/Settings/SettingsContext.js b/src/devtools/views/Settings/SettingsContext.js index d6f3ba4a9a..44244f38df 100644 --- a/src/devtools/views/Settings/SettingsContext.js +++ b/src/devtools/views/Settings/SettingsContext.js @@ -223,6 +223,7 @@ function updateThemeVariables( updateStyleHelper(theme, 'color-dimmer', documentElements); updateStyleHelper(theme, 'color-dimmest', documentElements); updateStyleHelper(theme, 'color-hover-background', documentElements); + updateStyleHelper(theme, 'color-inactive-background', documentElements); updateStyleHelper(theme, 'color-jsx-arrow-brackets', documentElements); updateStyleHelper( theme, diff --git a/src/devtools/views/root.css b/src/devtools/views/root.css index c2b2432145..884ff3e0d4 100644 --- a/src/devtools/views/root.css +++ b/src/devtools/views/root.css @@ -34,6 +34,7 @@ --light-color-dimmer: #cfd1d5; --light-color-dimmest: #eff0f1; --light-color-hover-background: #ebf1fb; + --light-color-inactive-background: #ccc; --light-color-jsx-arrow-brackets: #333333; --light-color-jsx-arrow-brackets-inverted: rgba(255, 255, 255, 0.7); --light-color-modal-background: rgba(255, 255, 255, 0.75); @@ -78,6 +79,7 @@ --dark-color-dimmer: #777d88; --dark-color-dimmest: #4f5766; --dark-color-hover-background: #3d424a; + --dark-color-inactive-background: #44474c; --dark-color-jsx-arrow-brackets: #777d88; --dark-color-jsx-arrow-brackets-inverted: rgba(255, 255, 255, 0.7); --dark-color-modal-background: rgba(0, 0, 0, 0.75);