1- import { RefObject , useRef , useCallback } from 'react' ;
1+ import { RefObject , useRef , useCallback , useEffect } from 'react' ;
22import useRefs from './useRefs' ;
33import useMeasures , { Measure } from './useMeasures' ;
44
@@ -19,10 +19,32 @@ function getMeanX(
1919 return Math . round ( ( previous . x + previous . width + target . x ) / 2 ) ;
2020}
2121
22+ function setAriaAttributes (
23+ measures : Measure [ ] ,
24+ itemRefs : RefObject < HTMLElement > [ ] ,
25+ targetIndex : number ,
26+ width : number ,
27+ ) {
28+ if ( width !== 0 ) {
29+ itemRefs . forEach ( item => {
30+ const offsetLeftItem = item . current ?. offsetLeft || 0 ;
31+
32+ if ( offsetLeftItem < measures [ targetIndex ] . x || ( offsetLeftItem + ( item . current ?. offsetWidth || 0 ) > measures [ targetIndex ] . x + width ) ) {
33+ item . current ?. setAttribute ( 'aria-hidden' , 'true' ) ;
34+ item . current ?. setAttribute ( 'tabIndex' , '-1' ) ;
35+ } else {
36+ item . current ?. removeAttribute ( 'aria-hidden' ) ;
37+ item . current ?. removeAttribute ( 'tabIndex' ) ;
38+ }
39+ } ) ;
40+ }
41+ }
42+
2243function scrollStep (
2344 direction : 'NEXT' | 'PREVIOUS' ,
2445 container : HTMLElement | null ,
2546 measures : Measure [ ] ,
47+ itemRefs : RefObject < HTMLElement > [ ] ,
2648) {
2749 if ( ! container ) return ;
2850 const x = container . scrollLeft ;
@@ -36,6 +58,7 @@ function scrollStep(
3658 measures [ targetIndex ] ,
3759 measures [ targetIndex - 1 ] ,
3860 ) ;
61+ setAriaAttributes ( measures , itemRefs , targetIndex , width ) ;
3962 } else {
4063 const firstLeftHidden = measures
4164 . slice ( )
@@ -51,6 +74,7 @@ function scrollStep(
5174 measures [ targetIndex - 1 ] ,
5275 measures [ targetIndex ] ,
5376 ) ;
77+ setAriaAttributes ( measures , itemRefs , targetIndex , width ) ;
5478 }
5579}
5680
@@ -60,15 +84,21 @@ export default function useCarousel<T>(itemCount = 0): CarouselReturn<T> {
6084 const measures = useMeasures ( itemRefs ) ;
6185
6286 const previous = useCallback (
63- ( ) => scrollStep ( 'PREVIOUS' , containerRef . current , measures ) ,
87+ ( ) => scrollStep ( 'PREVIOUS' , containerRef . current , measures , itemRefs ) ,
6488 [ containerRef , measures ] ,
6589 ) ;
6690
6791 const next = useCallback (
68- ( ) => scrollStep ( 'NEXT' , containerRef . current , measures ) ,
92+ ( ) => scrollStep ( 'NEXT' , containerRef . current , measures , itemRefs ) ,
6993 [ containerRef , measures ] ,
7094 ) ;
7195
96+ useEffect ( ( ) => {
97+ if ( measures !== undefined && measures . length !== 0 ) {
98+ setAriaAttributes ( measures , itemRefs , 0 , ( containerRef . current as HTMLElement | null ) ?. clientWidth || 0 ) ;
99+ }
100+ } , [ measures ] ) ;
101+
72102 return [
73103 {
74104 container : containerRef ,
0 commit comments