diff --git a/.changeset/slick-clubs-lay.md b/.changeset/slick-clubs-lay.md new file mode 100644 index 0000000000..aaf5fda7c4 --- /dev/null +++ b/.changeset/slick-clubs-lay.md @@ -0,0 +1,5 @@ +--- +'@tanstack/query-devtools': patch +--- + +improves accessibility of devtools diff --git a/packages/query-devtools/src/Devtools.tsx b/packages/query-devtools/src/Devtools.tsx index 0959e1e459..5202e97781 100644 --- a/packages/query-devtools/src/Devtools.tsx +++ b/packages/query-devtools/src/Devtools.tsx @@ -1000,7 +1000,7 @@ export const ContentView: Component = (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" > @@ -1013,6 +1013,8 @@ export const ContentView: Component = (props) => { 'tsqd-actions-btn', 'tsqd-action-settings', )} + aria-label="Open settings menu" + title="Open settings menu" > @@ -1061,62 +1063,58 @@ export const ContentView: Component = (props) => { 'tsqd-settings-submenu', )} > - { - setDevtoolsPosition('top') - }} - as="button" - class={cx( - styles().settingsSubButton, - 'tsqd-settings-menu-position-btn', - 'tsqd-settings-menu-position-btn-top', - )} - > - Top - - - { - setDevtoolsPosition('bottom') - }} - as="button" - class={cx( - styles().settingsSubButton, - 'tsqd-settings-menu-position-btn', - 'tsqd-settings-menu-position-btn-bottom', - )} - > - Bottom - - - { - setDevtoolsPosition('left') - }} - as="button" - class={cx( - styles().settingsSubButton, - 'tsqd-settings-menu-position-btn', - 'tsqd-settings-menu-position-btn-left', - )} - > - Left - - - { - setDevtoolsPosition('right') - }} - as="button" - class={cx( - styles().settingsSubButton, - 'tsqd-settings-menu-position-btn', - 'tsqd-settings-menu-position-btn-right', - )} + + setDevtoolsPosition(value as DevtoolsPosition) + } > - Right - - + + Top + + + + Bottom + + + + Left + + + + Right + + + @@ -1146,54 +1144,47 @@ export const ContentView: Component = (props) => { 'tsqd-settings-submenu', )} > - { - 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', - )} - > - Light - - - { - props.setLocalStore('theme_preference', 'dark') + { + 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" > - Dark - - - { - 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', - )} - > - System - - + + Light + + + + Dark + + + + System + + + @@ -1221,51 +1212,49 @@ export const ContentView: Component = (props) => { styles().settingsMenu, 'tsqd-settings-submenu', )} + aria-label="Hide disabled queries setting" > - { - 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', - )} + + props.setLocalStore('hideDisabledQueries', value) + } > - Show - - - - - { - 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', - )} - > - Hide - Show + + + + + - - - + Hide + + + + + @@ -1961,6 +1950,9 @@ const QueryDetails = () => { styles().detailsBody, 'tsqd-query-details-summary-container', )} + role="status" + aria-live="polite" + aria-atomic="true" >
@@ -2372,6 +2364,9 @@ const MutationDetails = () => {
             styles().detailsBody,
             'tsqd-query-details-summary-container',
           )}
+          role="status"
+          aria-live="polite"
+          aria-atomic="true"
         >
           
@@ -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`
diff --git a/packages/query-devtools/src/Explorer.tsx b/packages/query-devtools/src/Explorer.tsx
index 8bf42fe4e4..3f3debcada 100644
--- a/packages/query-devtools/src/Explorer.tsx
+++ b/packages/query-devtools/src/Explorer.tsx
@@ -1,6 +1,14 @@
 import { serialize, stringify } from 'superjson'
 import { clsx as cx } from 'clsx'
-import { Index, Match, Show, Switch, createMemo, createSignal } from 'solid-js'
+import {
+  Index,
+  Match,
+  Show,
+  Switch,
+  createMemo,
+  createSignal,
+  createUniqueId,
+} from 'solid-js'
 import { Key } from '@solid-primitives/keyed'
 import * as goober from 'goober'
 import { tokens } from './theme'
@@ -325,6 +333,8 @@ export default function Explorer(props: ExplorerProps) {
 
   const currentDataPath = props.dataPath ?? []
 
+  const inputId = createUniqueId()
+
   return (
     
@@ -332,6 +342,7 @@ export default function Explorer(props: ExplorerProps) {