index.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
  2. const require_runtime = require('../../_virtual/_rolldown/runtime.js');
  3. const require_aria = require('../../utils/dom/aria.js');
  4. const require_aria$1 = require('../../constants/aria.js');
  5. const require_event = require('../../utils/dom/event.js');
  6. let vue = require("vue");
  7. //#region ../../packages/directives/trap-focus/index.ts
  8. const FOCUSABLE_CHILDREN = "_trap-focus-children";
  9. const TRAP_FOCUS_HANDLER = "_trap-focus-handler";
  10. const FOCUS_STACK = [];
  11. const FOCUS_HANDLER = (e) => {
  12. if (FOCUS_STACK.length === 0) return;
  13. const code = require_event.getEventCode(e);
  14. const focusableElement = FOCUS_STACK[FOCUS_STACK.length - 1][FOCUSABLE_CHILDREN];
  15. if (focusableElement.length > 0 && code === require_aria$1.EVENT_CODE.tab) {
  16. if (focusableElement.length === 1) {
  17. e.preventDefault();
  18. if (document.activeElement !== focusableElement[0]) focusableElement[0].focus();
  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. if (process.env.NODE_ENV === "test") {
  33. const index = focusableElement.indexOf(e.target);
  34. if (index !== -1) focusableElement[goingBackward ? index - 1 : index + 1]?.focus();
  35. }
  36. }
  37. };
  38. const TrapFocus = {
  39. beforeMount(el) {
  40. el[FOCUSABLE_CHILDREN] = require_aria.obtainAllFocusableElements(el);
  41. FOCUS_STACK.push(el);
  42. if (FOCUS_STACK.length <= 1) document.addEventListener("keydown", FOCUS_HANDLER);
  43. },
  44. updated(el) {
  45. (0, vue.nextTick)(() => {
  46. el[FOCUSABLE_CHILDREN] = require_aria.obtainAllFocusableElements(el);
  47. });
  48. },
  49. unmounted() {
  50. FOCUS_STACK.shift();
  51. if (FOCUS_STACK.length === 0) document.removeEventListener("keydown", FOCUS_HANDLER);
  52. }
  53. };
  54. //#endregion
  55. exports.FOCUSABLE_CHILDREN = FOCUSABLE_CHILDREN;
  56. exports.TRAP_FOCUS_HANDLER = TRAP_FOCUS_HANDLER;
  57. exports.default = TrapFocus;
  58. //# sourceMappingURL=index.js.map