UNPKG

@payfit/unity-components

Version:

84 lines (83 loc) 2.46 kB
import { useCallback as e, useEffect as t, useRef as n } from "react"; import { useId as r } from "react-aria/useId"; import "embla-carousel-accessibility"; //#region src/components/carousel/hooks/useCarouselAccessibility.ts function i({ api: i, visibleSlideIndexes: a, focusedSlideIndex: o, loop: s = !1, goToSlide: c }) { let l = n(null), u = n(!1), d = r(), f = { root: `carousel-${d}__root`, title: `carousel-${d}__title`, track: `carousel-${d}__track`, previousButton: `carousel-${d}__previous-button`, nextButton: `carousel-${d}__next-button` }; return t(() => { if (!i) return; let e = i.plugins().accessibility; !e || !l.current || e.setupLiveRegion(l.current); }, [i]), t(() => { if (!i) return; let e = i.slideNodes(); e.forEach((e, t) => { t === o ? (e.setAttribute("tabindex", "0"), e.removeAttribute("inert")) : (e.setAttribute("tabindex", "-1"), a.has(t) ? e.removeAttribute("inert") : e.setAttribute("inert", "")); }), u.current && o !== null && (u.current = !1, e[o]?.focus({ preventScroll: !0 })); }, [ i, a, o ]), { liveRegionRef: l, a11yIds: f, onKeyDown: e((e) => { if (!i) return; let t = i.slideNodes().length, n = o ?? 0; switch (e.key) { case "ArrowLeft": { e.preventDefault(); let r = n > 0 ? n - 1 : s ? t - 1 : n; r !== n && (u.current = !0, c(r)); break; } case "ArrowRight": { e.preventDefault(); let r = n < t - 1 ? n + 1 : s ? 0 : n; r !== n && (u.current = !0, c(r)); break; } case "Home": e.preventDefault(), s || (u.current = !0, c(0)); break; case "End": if (e.preventDefault(), !s) { let e = t - 1; u.current = !0, c(e); } break; case "PageUp": { e.preventDefault(); let t = i.selectedSnap(), n = i.snapList().length, r = t > 0 ? t - 1 : s ? n - 1 : t; if (r !== t) { let e = i.internalEngine(), t = e.slidesToScroll.groupSlides(e.slideIndexes)[r]?.[0]; t !== void 0 && (u.current = !0, c(t)); } break; } case "PageDown": { e.preventDefault(); let t = i.selectedSnap(), n = t < i.snapList().length - 1 ? t + 1 : s ? 0 : t; if (n !== t) { let e = i.internalEngine(), t = e.slidesToScroll.groupSlides(e.slideIndexes)[n]?.[0]; t !== void 0 && (u.current = !0, c(t)); } break; } } }, [ i, s, o, c ]) }; } //#endregion export { i as useCarouselAccessibility };