123456789101112131415161718192021222324252627282930313233343536373839 |
- import { getFocusableElements } from '@shared/utils/getFocusableElements'
- import { onKeyStroke } from '@vueuse/core'
- import type { Ref } from 'vue'
- export const useTrapTab = (container: Ref<HTMLElement | undefined>) => {
- const trapFocus = (e: KeyboardEvent) => {
- const focusableElements = getFocusableElements(container.value)
- const firstFocusableElement = focusableElements[0]
- const lastFocusableElement = focusableElements[focusableElements.length - 1]
- if (e.shiftKey) {
-
- if (document.activeElement === firstFocusableElement) {
- lastFocusableElement.focus()
- e.preventDefault()
- }
- return
- }
- if (document.activeElement === lastFocusableElement) {
-
- firstFocusableElement.focus()
- e.preventDefault()
- }
- }
- onKeyStroke(
- (e) => {
- const isTab = e.key === 'Tab' || e.keyCode === 9
- if (isTab) {
- trapFocus(e)
- }
- },
- { target: container as Ref<EventTarget> },
- )
- }
|