2 lines
2.3 KiB
JavaScript
2 lines
2.3 KiB
JavaScript
|
|
import{a as o,j as c}from"./vendor-react-BHG7lGYR.js";import{d}from"./index-BWcMVITa.js";function w({trigger:m,children:p,align:b="left",className:k,onOpenChange:i}){const[r,h]=o.useState(!1),l=o.useRef(null),a=o.useRef(null),f=o.useRef(null),t=o.useRef(-1),u=o.useCallback(e=>{h(e),i?.(e),e||(t.current=-1)},[i]);o.useEffect(()=>{if(!r)return;const e=s=>{l.current&&!l.current.contains(s.target)&&u(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[r,u]),o.useEffect(()=>{if(!r)return;const e=s=>{if(!a.current)return;const v=a.current.querySelectorAll('button, [href], input, select, textarea, [role="menuitem"], [tabindex]:not([tabindex="-1"])'),n=Array.from(v);switch(s.key){case"Escape":s.preventDefault(),u(!1),f.current?.focus();break;case"ArrowDown":s.preventDefault(),t.current=t.current<n.length-1?t.current+1:0,n[t.current]?.focus();break;case"ArrowUp":s.preventDefault(),t.current=t.current>0?t.current-1:n.length-1,n[t.current]?.focus();break;case"Enter":case" ":s.preventDefault(),t.current>=0&&n[t.current]&&n[t.current].click();break;case"Home":s.preventDefault(),t.current=0,n[0]?.focus();break;case"End":s.preventDefault(),t.current=n.length-1,n[n.length-1]?.focus();break}};return document.addEventListener("keydown",e),()=>{document.removeEventListener("keydown",e)}},[r,u]),o.useEffect(()=>{if(r&&a.current){const e=a.current.querySelectorAll('button, [href], input, select, textarea, [role="menuitem"], [tabindex]:not([tabindex="-1"])');e.length>0&&(t.current=0,setTimeout(()=>{e[0]?.focus()},0))}},[r]);const x={left:"left-0",right:"right-0",center:"left-1/2 -translate-x-1/2"};return c.jsxs("div",{ref:l,className:d("relative",k),children:[c.jsx("div",{ref:f,onClick:()=>u(!r),role:"button","aria-haspopup":"true","aria-expanded":r,tabIndex:0,onKeyDown:e=>{e.key==="Enter"||e.key===" "?(e.preventDefault(),u(!r)):e.key==="ArrowDown"&&(e.preventDefault(),u(!0))},style:{display:"inline-block"},children:m}),r&&c.jsxs(c.Fragment,{children:[c.jsx("div",{className:"fixed inset-0 z-40",onClick:()=>u(!1),"aria-hidden":"true"}),c.jsx("div",{ref:a,className:d("absolute z-50 mt-2 min-w-[8rem] bg-kodo-ink border border-kodo-steel rounded-md shadow-lg","overflow-hidden",x[b]),role:"menu","aria-orientation":"vertical",children:p})]})]})}export{w as D};
|