1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Backport pull request #6413 from jellyfin-web/release-10.10.z

Prevent Focus Loss When Skip Button is Pressed

Original-merge: 4f17cebc02

Merged-by: thornbill <thornbill@users.noreply.github.com>

Backported-by: thornbill <thornbill@users.noreply.github.com>
This commit is contained in:
rlauuzo 2025-01-22 03:12:46 -05:00 committed by thornbill
parent 05cce43ffd
commit 34ace6bc11
3 changed files with 41 additions and 16 deletions

View file

@ -93,6 +93,7 @@ function isCurrentlyFocusableInternal(elem) {
// Determines if a focusable element can be focused at a given point in time
function isCurrentlyFocusable(elem) {
if (!elem.classList?.contains('focusable')) {
if (elem.disabled) {
return false;
}
@ -110,6 +111,7 @@ function isCurrentlyFocusable(elem) {
return false;
}
}
}
return isCurrentlyFocusableInternal(elem);
}

View file

@ -20,6 +20,15 @@ interface ShowOptions {
function onHideComplete(this: HTMLButtonElement) {
if (this) {
// Handle focus after the hide transition completes
if (document.activeElement === this) {
this.blur();
const pauseButton = document.querySelector('.btnPause');
if (pauseButton && focusManager.isCurrentlyFocusable(pauseButton)) {
focusManager.focus(pauseButton);
}
}
this.classList.add('hide');
}
}

View file

@ -304,11 +304,15 @@ export default function (view) {
}
function slideDownToShow(elem) {
clearHideAnimationEventListeners(elem);
elem.classList.remove('hide');
elem.classList.remove('osdHeader-hidden');
}
function slideUpToHide(elem) {
clearHideAnimationEventListeners(elem);
elem.classList.add('osdHeader-hidden');
elem.addEventListener(transitionEndEventName, onHideAnimationComplete);
}
function clearHideAnimationEventListeners(elem) {
@ -317,7 +321,7 @@ export default function (view) {
function onHideAnimationComplete(e) {
const elem = e.target;
if (elem != osdBottomElement) return;
if (elem !== osdBottomElement && elem !== headerElement) return;
elem.classList.add('hide');
elem.removeEventListener(transitionEndEventName, onHideAnimationComplete);
}
@ -338,8 +342,17 @@ export default function (view) {
_focus(focusElement);
}
toggleSubtitleSync();
} else if (currentVisibleMenu === 'osd' && focusElement && !layoutManager.mobile) {
_focus(focusElement);
} else if (currentVisibleMenu === 'osd' && !layoutManager.mobile) {
// If no focus element is provided, try to keep current focus if it's valid,
// otherwise default to pause button
if (!focusElement) {
const currentFocus = document.activeElement;
if (!currentFocus || !focusManager.isCurrentlyFocusable(currentFocus)) {
focusElement = osdBottomElement.querySelector('.btnPause');
}
}
if (focusElement) _focus(focusElement);
}
}
@ -354,7 +367,8 @@ export default function (view) {
toggleSubtitleSync('hide');
// Firefox does not blur by itself
if (document.activeElement) {
if (osdBottomElement.contains(document.activeElement)
|| headerElement.contains(document.activeElement)) {
document.activeElement.blur();
}
}