diff --git a/src/assets/style/navbarStyles.css b/src/assets/style/navbarStyles.css index a85e592..9d5d352 100644 --- a/src/assets/style/navbarStyles.css +++ b/src/assets/style/navbarStyles.css @@ -43,7 +43,7 @@ color: #0C489E; } #navbar div li a:hover::after, -#navbar div li a:focus::after{ +#navbar div li a:focus-visible::after{ content: ""; width: 80%; height: 3px; @@ -73,6 +73,19 @@ opacity: 1; display: block } + +/* Navbar: don't show focus ring on mouse click */ +#navbar a:focus { + outline: none; +} + +/* Navbar: show focus ring for keyboard navigation */ +#navbar a:focus-visible { + outline: 3px solid #0C489E; + outline-offset: 2px; + border-radius: 10px; /* tweak to match your design */ +} + /* #navbar div li:focus-within > ul, #navbar div li ul:hover, #navbar div li ul:focus { diff --git a/src/assets/style/styles.css b/src/assets/style/styles.css index 196ca43..f438c04 100644 --- a/src/assets/style/styles.css +++ b/src/assets/style/styles.css @@ -74,4 +74,60 @@ a:active { text-decoration: none; } -/* iframe#webpack-dev-server-client-overlay{display:none!important} */ \ No newline at end of file +/* iframe#webpack-dev-server-client-overlay{display:none!important} */ + +/* ===== WCAG 2.4.7 Focus Visible (Global) ===== */ +:where( + a, + button, + input, + select, + textarea, + summary, + [role="button"], + [role="link"], + [tabindex]:not([tabindex="-1"]) +):focus-visible { + outline: 3px solid #0C489E; + outline-offset: 2px; + border-radius: 4px; +} + +/* Fallback for browsers that don't support :focus-visible */ +:where( + a, + button, + input, + select, + textarea, + summary, + [role="button"], + [role="link"], + [tabindex]:not([tabindex="-1"]) +):focus { + outline: 3px solid #0C489E; + outline-offset: 2px; + border-radius: 4px; +} + +/* ===== MUI DataGrid focus visible (WCAG 2.4.7) ===== */ + +/* Column headers */ +.MuiDataGrid-columnHeader:focus, +.MuiDataGrid-columnHeader:focus-within { + outline: 3px solid #0C489E; + outline-offset: -2px; +} + +/* Cells */ +.MuiDataGrid-cell:focus, +.MuiDataGrid-cell:focus-within { + outline: 3px solid #0C489E; + outline-offset: -2px; +} + +/* If outline is clipped, add halo */ +.MuiDataGrid-columnHeader:focus-within, +.MuiDataGrid-cell:focus-within { + box-shadow: 0 0 0 3px rgba(12, 72, 158, 0.25); +} \ No newline at end of file diff --git a/src/components/AdminLogo/index.js b/src/components/AdminLogo/index.js index 8a75781..f847e3b 100644 --- a/src/components/AdminLogo/index.js +++ b/src/components/AdminLogo/index.js @@ -23,14 +23,23 @@ const LogoSection = ({ sx, to }) => { return ( dispatch(activeItem({ openItem: [defaultId] }))} - to={!to ? config.defaultPath : to} - sx={sx} - > - - + disableRipple + component={Link} + onClick={() => dispatch(activeItem({ openItem: [defaultId] }))} + to={!to ? config.defaultPath : to} + sx={{ + ...sx, + + /* ✅ WCAG 2.4.7 focus indicator */ + '&:focus-visible': { + outline: '3px solid #0C489E', + outlineOffset: '2px', + borderRadius: '6px' + } + }} + > + + PNSPS diff --git a/src/components/MobileLogo/index.js b/src/components/MobileLogo/index.js index eb2a16d..d5386ff 100644 --- a/src/components/MobileLogo/index.js +++ b/src/components/MobileLogo/index.js @@ -17,14 +17,23 @@ const LogoSection = ({ sx, to }) => { const dispatch = useDispatch(); return ( dispatch(activeItem({ openItem: [defaultId] }))} - to={!to ? config.defaultPath : to} - sx={sx} - > - - + disableRipple + component={Link} + onClick={() => dispatch(activeItem({ openItem: [defaultId] }))} + to={!to ? config.defaultPath : to} + sx={{ + ...sx, + + /* WCAG 2.4.7 – visible keyboard focus */ + '&:focus-visible': { + outline: '3px solid #0C489E', + outlineOffset: '2px', + borderRadius: '6px' + } + }} + > + + ); }; diff --git a/src/layout/MainLayout/Header/HeaderContent/LocaleSelector.js b/src/layout/MainLayout/Header/HeaderContent/LocaleSelector.js index ad676aa..cd0016f 100644 --- a/src/layout/MainLayout/Header/HeaderContent/LocaleSelector.js +++ b/src/layout/MainLayout/Header/HeaderContent/LocaleSelector.js @@ -47,16 +47,26 @@ const LocaleSelector = () => { return ( - + { <> - - + component="span" + disableRipple + sx={{ + bgcolor: open ? 'grey.300' : 'grey.100', + + /* WCAG 2.4.7 – visible keyboard focus */ + '&:focus-visible': { + outline: '3px solid #0C489E', + outlineOffset: '2px', + borderRadius: '6px' + } + }} + ref={anchorRef} + aria-controls={open ? 'menu-list-grow' : undefined} + aria-haspopup="true" + onClick={handleToggle} + color="inherit" + > + + { - - - - + + + +