UNPKG

@visa/nova-react

Version:

Visa Product Design System Nova React library. Compatible with React ^19.

2 lines (1 loc) 898 B
import{useRef as e,useState as r,useCallback as n,useEffect as t}from"react";const a={defaultExpanded:""},d=(d=a)=>{const{defaultExpanded:i,...l}={...a,...d},o=e([]),[s,f]=r(i),[u,c]=r(-1),[p,x]=r([]),y=-1===u?0:p.indexOf(u),m=p.length,A=m-1,E=Array.isArray(s),b=l?.ref||o,g=n(e=>E?s.includes(e):s===e,[s,E]),h=n(e=>{f(E?r=>g(e)?r.filter(r=>r!==e):[...r,e]:g(e)?"":e),c(e)},[g,E]);return t(()=>{x(b.current?.map((e,r)=>e&&!(e.disabled||e.ariaDisabled)&&r).filter(e=>!1!==e))},[b]),{isIndexExpanded:g,onKeyNavigation:e=>{const r=e.key;let n=null;if("Tab"===r&&e.shiftKey&&y-1>=0?n=y-1:"Tab"===r&&!e.shiftKey&&y+1<=A?n=y+1:"ArrowUp"===r?n=y-1<0?A:y-1:"ArrowDown"===r?n=(y+1)%m:"End"===r?n=A:"Home"===r&&(n=0),b.current&&null!==n&&m){u!==n&&e.preventDefault();const r=p[n];c(r),b.current[r]?.focus()}},ref:b,toggleIndexExpanded:h}};d.displayName="useAccordion";export{d as default,d as useAccordion};