Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/slick-clubs-lay.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@tanstack/query-devtools': patch
---

improves accessibility of devtools
297 changes: 146 additions & 151 deletions packages/query-devtools/src/Devtools.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1000,7 +1000,7 @@ export const ContentView: Component<ContentViewProps> = (props) => {
'tsqd-action-open-pip',
)}
aria-label="Open in picture-in-picture mode"
title={`Open in picture-in-picture mode`}
title="Open in picture-in-picture mode"
>
<PiPIcon />
</button>
Expand All @@ -1013,6 +1013,8 @@ export const ContentView: Component<ContentViewProps> = (props) => {
'tsqd-actions-btn',
'tsqd-action-settings',
)}
aria-label="Open settings menu"
title="Open settings menu"
Comment on lines +1016 to +1017
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This menu item has no visible text, so adding label and title to account for this for screen readers

>
<Settings />
</DropdownMenu.Trigger>
Expand Down Expand Up @@ -1061,62 +1063,58 @@ export const ContentView: Component<ContentViewProps> = (props) => {
'tsqd-settings-submenu',
)}
>
<DropdownMenu.Item
onSelect={() => {
setDevtoolsPosition('top')
}}
as="button"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-top',
)}
>
<span>Top</span>
<ArrowUp />
</DropdownMenu.Item>
<DropdownMenu.Item
onSelect={() => {
setDevtoolsPosition('bottom')
}}
as="button"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-bottom',
)}
>
<span>Bottom</span>
<ArrowDown />
</DropdownMenu.Item>
<DropdownMenu.Item
onSelect={() => {
setDevtoolsPosition('left')
}}
as="button"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-left',
)}
>
<span>Left</span>
<ArrowLeft />
</DropdownMenu.Item>
<DropdownMenu.Item
onSelect={() => {
setDevtoolsPosition('right')
}}
as="button"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-right',
)}
<DropdownMenu.RadioGroup
aria-label="Position settings"
value={props.localStore.position}
onChange={(value) =>
setDevtoolsPosition(value as DevtoolsPosition)
}
>
<span>Right</span>
<ArrowRight />
</DropdownMenu.Item>
<DropdownMenu.RadioItem
value="top"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-top',
)}
>
<span>Top</span>
<ArrowUp />
</DropdownMenu.RadioItem>
<DropdownMenu.RadioItem
value="bottom"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-bottom',
)}
>
<span>Bottom</span>
<ArrowDown />
</DropdownMenu.RadioItem>
<DropdownMenu.RadioItem
value="left"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-left',
)}
>
<span>Left</span>
<ArrowLeft />
</DropdownMenu.RadioItem>
<DropdownMenu.RadioItem
value="right"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-right',
)}
>
<span>Right</span>
<ArrowRight />
</DropdownMenu.RadioItem>
</DropdownMenu.RadioGroup>
</DropdownMenu.SubContent>
</DropdownMenu.Portal>
</DropdownMenu.Sub>
Expand Down Expand Up @@ -1146,54 +1144,47 @@ export const ContentView: Component<ContentViewProps> = (props) => {
'tsqd-settings-submenu',
)}
>
<DropdownMenu.Item
onSelect={() => {
props.setLocalStore('theme_preference', 'light')
}}
as="button"
class={cx(
styles().settingsSubButton,
props.localStore.theme_preference === 'light' &&
styles().themeSelectedButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-top',
)}
>
<span>Light</span>
<Sun />
</DropdownMenu.Item>
<DropdownMenu.Item
onSelect={() => {
props.setLocalStore('theme_preference', 'dark')
<DropdownMenu.RadioGroup
value={props.localStore.theme_preference}
onChange={(value) => {
props.setLocalStore('theme_preference', value)
}}
as="button"
class={cx(
styles().settingsSubButton,
props.localStore.theme_preference === 'dark' &&
styles().themeSelectedButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-bottom',
)}
aria-label="Theme preference"
>
<span>Dark</span>
<Moon />
</DropdownMenu.Item>
<DropdownMenu.Item
onSelect={() => {
props.setLocalStore('theme_preference', 'system')
}}
as="button"
class={cx(
styles().settingsSubButton,
props.localStore.theme_preference === 'system' &&
styles().themeSelectedButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-left',
)}
>
<span>System</span>
<Monitor />
</DropdownMenu.Item>
<DropdownMenu.RadioItem
value="light"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-top',
)}
>
<span>Light</span>
<Sun />
</DropdownMenu.RadioItem>
<DropdownMenu.RadioItem
value="dark"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-bottom',
)}
>
<span>Dark</span>
<Moon />
</DropdownMenu.RadioItem>
<DropdownMenu.RadioItem
value="system"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-left',
)}
>
<span>System</span>
<Monitor />
</DropdownMenu.RadioItem>
</DropdownMenu.RadioGroup>
</DropdownMenu.SubContent>
</DropdownMenu.Portal>
</DropdownMenu.Sub>
Expand Down Expand Up @@ -1221,51 +1212,49 @@ export const ContentView: Component<ContentViewProps> = (props) => {
styles().settingsMenu,
'tsqd-settings-submenu',
)}
aria-label="Hide disabled queries setting"
>
<DropdownMenu.Item
onSelect={() => {
props.setLocalStore('hideDisabledQueries', 'false')
}}
as="button"
class={cx(
styles().settingsSubButton,
props.localStore.hideDisabledQueries !== 'true' &&
styles().themeSelectedButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-show',
)}
<DropdownMenu.RadioGroup
value={props.localStore.hideDisabledQueries}
onChange={(value) =>
props.setLocalStore('hideDisabledQueries', value)
}
>
<span>Show</span>
<Show
when={
props.localStore.hideDisabledQueries !== 'true'
}
<DropdownMenu.RadioItem
value="false"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-show',
)}
>
<CheckCircle />
</Show>
</DropdownMenu.Item>
<DropdownMenu.Item
onSelect={() => {
props.setLocalStore('hideDisabledQueries', 'true')
}}
as="button"
class={cx(
styles().settingsSubButton,
props.localStore.hideDisabledQueries === 'true' &&
styles().themeSelectedButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-hide',
)}
>
<span>Hide</span>
<Show
when={
props.localStore.hideDisabledQueries === 'true'
}
<span>Show</span>
<Show
when={
props.localStore.hideDisabledQueries !== 'true'
}
>
<CheckCircle />
</Show>
</DropdownMenu.RadioItem>
<DropdownMenu.RadioItem
value="true"
class={cx(
styles().settingsSubButton,
'tsqd-settings-menu-position-btn',
'tsqd-settings-menu-position-btn-hide',
)}
>
<CheckCircle />
</Show>
</DropdownMenu.Item>
<span>Hide</span>
<Show
when={
props.localStore.hideDisabledQueries === 'true'
}
>
<CheckCircle />
</Show>
</DropdownMenu.RadioItem>
</DropdownMenu.RadioGroup>
</DropdownMenu.SubContent>
</DropdownMenu.Portal>
</DropdownMenu.Sub>
Expand Down Expand Up @@ -1961,6 +1950,9 @@ const QueryDetails = () => {
styles().detailsBody,
'tsqd-query-details-summary-container',
)}
role="status"
aria-live="polite"
aria-atomic="true"
>
<div class="tsqd-query-details-summary">
<pre>
Expand Down Expand Up @@ -2372,6 +2364,9 @@ const MutationDetails = () => {
styles().detailsBody,
'tsqd-query-details-summary-container',
)}
role="status"
aria-live="polite"
aria-atomic="true"
>
<div class="tsqd-query-details-summary">
<pre>
Expand Down Expand Up @@ -3521,15 +3516,15 @@ const stylesFactory = (
outline-offset: 2px;
outline: 2px solid ${colors.blue[800]};
}
`,
themeSelectedButton: css`
background-color: ${t(colors.purple[100], colors.purple[900])};
color: ${t(colors.purple[700], colors.purple[300])};
& svg {
color: ${t(colors.purple[700], colors.purple[300])};
}
&:hover {
&[data-checked] {
background-color: ${t(colors.purple[100], colors.purple[900])};
color: ${t(colors.purple[700], colors.purple[300])};
& svg {
color: ${t(colors.purple[700], colors.purple[300])};
}
&:hover {
background-color: ${t(colors.purple[100], colors.purple[900])};
}
}
`,
viewToggle: css`
Expand Down
Loading
Loading