mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-05 19:04:02 +00:00
fix: preserve keyboard focus and separate Space activation from voice
Keep focus visible across controls and stable during Contacts, Cockpit and mission roster updates. Preserve native short Space activation, and claim push-to-talk only after a 500 ms hold. Add panel Escape handling and keyboard-accessible attribution controls. Retains the Map Source foundation contributed in https://github.com/bilawalsidhu/gods-eye-view/pull/171.
This commit is contained in:
1 parent
c82fdd7478
commit
5228ab9e40
22 files changed
+3500
-157
No files matched your search
@@ -0,0 +1,70 @@
|
||||
/**
|
||||
* Adds the keyboard semantics omitted by Cesium's href-less attribution links.
|
||||
* Cesium retains ownership of showing and hiding its required credit lightbox.
|
||||
*/
|
||||
export function configureCreditKeyboardAccess(root = document) {
|
||||
const expand = root?.querySelector?.('#cesium-credits .cesium-credit-expand-link');
|
||||
const lightbox = root?.querySelector?.('.cesium-credit-lightbox');
|
||||
const close = lightbox?.querySelector?.('.cesium-credit-lightbox-close');
|
||||
if (!expand || !lightbox || !close) return false;
|
||||
const overlay = lightbox.parentElement;
|
||||
|
||||
if (!lightbox.id) lightbox.id = 'cesium-credit-lightbox';
|
||||
expand.setAttribute('role', 'button');
|
||||
expand.setAttribute('tabindex', '0');
|
||||
expand.setAttribute('aria-haspopup', 'dialog');
|
||||
expand.setAttribute('aria-controls', lightbox.id);
|
||||
expand.setAttribute('aria-expanded', 'false');
|
||||
close.setAttribute('role', 'button');
|
||||
close.setAttribute('tabindex', '0');
|
||||
close.setAttribute('aria-label', 'Close data attribution');
|
||||
|
||||
if (expand.dataset.gevKeyboardReady === 'true') return true;
|
||||
expand.dataset.gevKeyboardReady = 'true';
|
||||
|
||||
const installKeyboardActivation = (control) => {
|
||||
let spacePressed = false;
|
||||
control.addEventListener('keydown', (event) => {
|
||||
if (event.key === 'Enter') {
|
||||
event.preventDefault();
|
||||
if (!event.repeat) control.click();
|
||||
return;
|
||||
}
|
||||
if (event.key !== ' ') return;
|
||||
event.preventDefault();
|
||||
if (!event.repeat) spacePressed = true;
|
||||
});
|
||||
control.addEventListener('keyup', (event) => {
|
||||
if (event.key !== ' ') return;
|
||||
event.preventDefault();
|
||||
if (!spacePressed) return;
|
||||
spacePressed = false;
|
||||
control.click();
|
||||
});
|
||||
// A long Space hold may hand control to push-to-talk and move focus away.
|
||||
// Cancelling the armed release prevents that eventual keyup from also
|
||||
// activating the attribution control.
|
||||
control.addEventListener('blur', () => { spacePressed = false; });
|
||||
};
|
||||
const closeAndRestoreFocus = () => {
|
||||
expand.setAttribute('aria-expanded', 'false');
|
||||
expand.focus();
|
||||
};
|
||||
installKeyboardActivation(expand);
|
||||
installKeyboardActivation(close);
|
||||
lightbox.addEventListener('keydown', (event) => {
|
||||
if (event.key !== 'Escape' || event.defaultPrevented) return;
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
close.click();
|
||||
});
|
||||
expand.addEventListener('click', () => {
|
||||
expand.setAttribute('aria-expanded', 'true');
|
||||
close.focus();
|
||||
});
|
||||
close.addEventListener('click', closeAndRestoreFocus);
|
||||
overlay?.addEventListener?.('click', (event) => {
|
||||
if (!lightbox.contains(event.target)) closeAndRestoreFocus();
|
||||
});
|
||||
return true;
|
||||
}
|
||||
Reference in new issue
Block a user