ed6801d8bee522186eadbbc8b2b9c2a68d35b7b2a6712bcf2eb736591e856f96345c4f4df87b56a049473f5a180bbc12ce6b840bc80bbb84fc54e6c3f3443b 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. 'use strict';
  2. Object.defineProperty(exports, '__esModule', { value: true });
  3. var vue = require('vue');
  4. var aria = require('../../utils/dom/aria.js');
  5. var aria$1 = require('../../constants/aria.js');
  6. const FOCUSABLE_CHILDREN = "_trap-focus-children";
  7. const TRAP_FOCUS_HANDLER = "_trap-focus-handler";
  8. const FOCUS_STACK = [];
  9. const FOCUS_HANDLER = (e) => {
  10. if (FOCUS_STACK.length === 0)
  11. return;
  12. const focusableElement = FOCUS_STACK[FOCUS_STACK.length - 1][FOCUSABLE_CHILDREN];
  13. if (focusableElement.length > 0 && e.code === aria$1.EVENT_CODE.tab) {
  14. if (focusableElement.length === 1) {
  15. e.preventDefault();
  16. if (document.activeElement !== focusableElement[0]) {
  17. focusableElement[0].focus();
  18. }
  19. return;
  20. }
  21. const goingBackward = e.shiftKey;
  22. const isFirst = e.target === focusableElement[0];
  23. const isLast = e.target === focusableElement[focusableElement.length - 1];
  24. if (isFirst && goingBackward) {
  25. e.preventDefault();
  26. focusableElement[focusableElement.length - 1].focus();
  27. }
  28. if (isLast && !goingBackward) {
  29. e.preventDefault();
  30. focusableElement[0].focus();
  31. }
  32. }
  33. };
  34. const TrapFocus = {
  35. beforeMount(el) {
  36. el[FOCUSABLE_CHILDREN] = aria.obtainAllFocusableElements(el);
  37. FOCUS_STACK.push(el);
  38. if (FOCUS_STACK.length <= 1) {
  39. document.addEventListener("keydown", FOCUS_HANDLER);
  40. }
  41. },
  42. updated(el) {
  43. vue.nextTick(() => {
  44. el[FOCUSABLE_CHILDREN] = aria.obtainAllFocusableElements(el);
  45. });
  46. },
  47. unmounted() {
  48. FOCUS_STACK.shift();
  49. if (FOCUS_STACK.length === 0) {
  50. document.removeEventListener("keydown", FOCUS_HANDLER);
  51. }
  52. }
  53. };
  54. exports.FOCUSABLE_CHILDREN = FOCUSABLE_CHILDREN;
  55. exports.TRAP_FOCUS_HANDLER = TRAP_FOCUS_HANDLER;
  56. exports["default"] = TrapFocus;
  57. //# sourceMappingURL=index.js.map