| Server IP : 38.190.208.107 / Your IP : 216.73.217.2 Web Server : nginx/1.28.1 System : Linux ht2026040333114 6.1.0-10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.37-1 (2023-07-03) x86_64 User : root ( 0) PHP Version : 8.2.28 Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv,eval,assert,passthru,system,exec,shell_exec,popen,proc_open MySQL : OFF | cURL : ON | WGET : OFF | Perl : OFF | Python : OFF | Sudo : OFF | Pkexec : OFF Directory : /www/wwwroot/wp.3/wp-content/themes/blocksy/static/js/frontend/helpers/ |
Upload File : |
import { getCurrentScreen } from '../helpers/current-screen'
import { isTouchDevice } from '../helpers/is-touch-device'
// Maybe try to check focus with :has(:focus) instead of document.activeElement.
const tabbables = [
'button:enabled:not([readonly])',
'select:enabled:not([readonly])',
'textarea:enabled:not([readonly])',
// Exclude hidden inputs as they are not part of the tab order
// and can cause focus to escape the modal when they are the last element
'input:enabled:not([readonly]):not([type="hidden"])',
'a[href]',
'area[href]',
'iframe',
'object',
'embed',
'[tabindex]',
'[contenteditable]',
'[autofocus]',
]
let lockedElement = null
const handleKeydown = (e) => {
if (!lockedElement) {
return
}
let focusableEls = [...lockedElement.querySelectorAll(tabbables.join(','))]
if (
lockedElement.querySelector('[data-device="mobile"]') &&
getCurrentScreen() !== 'mobile'
) {
focusableEls = focusableEls.filter(
(el) => !el.closest('[data-device="mobile"]')
)
}
const firstFocusableEl = focusableEls[0]
const lastFocusableEl = focusableEls[focusableEls.length - 1]
if (e.key !== 'Tab' && e.keyCode !== 9) {
return
}
let isElFocusable = focusableEls.includes(document.activeElement)
// Firefox will make scrollable elements focusable, even if those are not
// tabbable usually.
if (
lockedElement.contains(document.activeElement) &&
document.activeElement.scrollHeight >
document.activeElement.clientHeight
) {
isElFocusable = true
}
if (!isElFocusable) {
firstFocusableEl.focus()
e.preventDefault()
}
if (e.shiftKey) {
if (document.activeElement === firstFocusableEl) {
lastFocusableEl.focus()
e.preventDefault()
}
} else {
if (document.activeElement === lastFocusableEl) {
firstFocusableEl.focus()
e.preventDefault()
}
}
}
const focusLockOn = (element, settings = {}) => {
settings = {
focusOnMount: true,
...settings,
}
if (lockedElement && lockedElement !== element) {
return
}
const focusableEls = element.querySelectorAll(tabbables.join(','))
if (focusableEls.length === 0) {
return
}
lockedElement = element
document.addEventListener('keydown', handleKeydown)
if (settings.focusOnMount && !isTouchDevice()) {
setTimeout(() => {
focusableEls[0].focus()
}, 200)
}
}
const focusLockOff = (element) => {
element.removeEventListener('keydown', handleKeydown)
lockedElement = null
}
export const focusLockManager = () => {
if (window.ctFrontend && window.ctFrontend.focusLockManager) {
return window.ctFrontend.focusLockManager
}
window.ctFrontend = window.ctFrontend || {}
window.ctFrontend.focusLockManager = {
focusLockOn,
focusLockOff,
}
return window.ctFrontend.focusLockManager
}