@atlaskit/navigation-system
Version:
The latest navigation system for Atlassian apps.
53 lines (50 loc) • 1.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.focusElement = focusElement;
var _bindEventListener = require("bind-event-listener");
/**
* Used for moving focus to the corresponding slot or custom target after clicking on a skip link.
*/
function focusElement(element) {
/**
* Elements without an explicit `tabindex` attribute are not guaranteed to be focusable:
* https://html.spec.whatwg.org/multipage/interaction.html#attr-tabindex
*
* Our slots are not interactive, so this is required.
*
* In the future we may want to check if there is an existing `tabindex` attribute,
* as custom skip linked elements might already have one.
*/
element.setAttribute('tabindex', '-1');
/**
* Cleanup the `tabindex` attribute we set when the slot or custom target loses focus.
*
* This is preferable to always having `tabindex="-1"` because always applying the tab index can:
*
* - mess with click events
* - potentially cause a focus ring to be always visible
*/
(0, _bindEventListener.bind)(element, {
type: 'blur',
listener: function listener() {
element.removeAttribute('tabindex');
},
options: {
// Using a one-time listener so it cleans itself up
once: true
}
});
/**
* Move focus to the slot or custom target.
*
* Calling `.focus()` will also scroll the element into view:
* https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus
*/
element.focus({
// Forces the focus ring to appear after moving focus to the slot
// https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#focusvisible
focusVisible: true
});
}