[bugfix] Fix a couple accessibility issues with :focus elements (#3979)

* [bugfix/frontend] Fix accessibility/focus issues in settings + web ui

* fix little error

* tweaks
This commit is contained in:
tobi
2025-04-09 14:14:20 +02:00
committed by GitHub
parent 365b575341
commit 19cfa8d126
24 changed files with 405 additions and 152 deletions

View File

@@ -80,6 +80,7 @@ $profile-bg: $gray4;
$button-bg: $blue2;
$button-fg: $gray1;
$button-hover-bg: $blue3;
$button-focus-border: $blue3;
$button-danger-bg: $error3;
$button-danger-fg: $white1;

View File

@@ -74,6 +74,14 @@
div.blurhash-container > canvas {
display: none;
}
/*
Hide focus outline on click
to avoid ugly artifacts.
*/
&:focus {
outline: none;
}
}
summary {
@@ -109,6 +117,16 @@
.hide {
display: none;
}
&:focus-visible {
/*
Can't rely on media having background with
decent contrast so inset and use button-fg
instead so focus is definitely visible.
*/
outline: 0.25rem dashed $button-fg;
outline-offset: -0.25rem;
}
}
.show.sensitive {
@@ -126,6 +144,21 @@
}
}
a.photoswipe-slide {
display: inline-block;
height: 100%;
width: 100%;
/*
Inset outline to avoid outline
being hidden by overflow: hidden.
*/
&:focus-visible {
outline: $button-focus-outline;
outline-offset: -0.25rem;
}
}
video.plyr-video, .plyr {
position: absolute;
height: 100%;

View File

@@ -81,6 +81,25 @@
height: $avatar-size;
width: $avatar-size;
/*
Link to open media in slide
should fill entire media wrapper.
*/
a.photoswipe-slide {
display: inline-block;
height: 100%;
width: 100%;
/*
Offset to avoid clashing with
thick border around avatars.
*/
&:focus-visible {
outline: $button-focus-outline;
outline-offset: 0.25rem;
}
}
.avatar {
/*
Fit 100% of the wrapper.

View File

@@ -68,6 +68,40 @@ $br-inner: 0.2rem;
*/
$fa-fw: 1.28571429em;
/*
Outline to give links when they're
focused (ie., by clicking or tabbing to them).
*/
$link-focus-outline: 0.25rem dotted $link-fg;
/*
Outline to give buttons when they're
focused (ie., by clicking or tabbing to them).
*/
$button-focus-outline: 0.25rem dashed $button-focus-border;
/*
Outline to give input elements like radio buttons
and checkboxes when they're focused (ie., by clicking
or tabbing to them).
*/
$input-clickable-focus-outline: 0.25rem dashed $input-focus-border;
/*
Outline to give summary elements when they're
focused (ie., by clicking or tabbing to them).
*/
$summary-focus-outline: 0.25rem dotted $link-fg;
/*
Outline to give <pre> elements when they're
focused (ie., by clicking or tabbing to them).
This is used when we've got a preformatted
code block with a scroll bar inside of it.
*/
$pre-focus-outline: 0.25rem dashed $link-fg;
/******************************************
***** SECTION 2: BASIC GLOBAL STYLING *****
*******************************************/
@@ -88,6 +122,9 @@ body {
a {
color: $link-fg;
&:focus-visible {
outline: $link-focus-outline;
}
}
/*
@@ -144,6 +181,14 @@ main {
&:hover {
background: $button-hover-bg;
}
&:focus-visible {
outline: $button-focus-outline;
}
}
summary:focus-visible {
outline: $summary-focus-outline;
}
/*
@@ -164,6 +209,11 @@ input, select, textarea, .input {
border-color: $input-focus-border;
}
&[type=checkbox]:focus-visible,
&[type=radio]:focus-visible {
outline: $input-clickable-focus-outline;
}
&:invalid, .invalid & {
border-color: $input-error-border;
}
@@ -342,6 +392,10 @@ pre, pre[class*="language-"] {
white-space: pre;
overflow-x: auto;
&:focus {
outline: $pre-focus-outline;
}
/*
Code inside a pre block, ie.,

View File

@@ -299,6 +299,14 @@
position: absolute;
z-index: 0;
&:focus-visible {
/*
Inset focus to compensate for themes where
statuses have a really thick border.
*/
outline-offset: -0.25rem;
}
}
&:first-child {