@data-slot/dropdown-menu 0.2.2 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- const e=(e,t)=>e.querySelector(`[data-slot="${t}"]`),t=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)],n=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)];let r=0;const i=(e,t)=>e.id||=`${t}-${++r}`,a=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))};function o(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const s=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n})),c={top:`bottom`,bottom:`top`,left:`right`,right:`left`};function l(n,r={}){let{defaultOpen:l=!1,onOpenChange:d,onSelect:f,closeOnClickOutside:p=!0,closeOnEscape:m=!0,closeOnSelect:h=!0,side:g=`bottom`,align:_=`start`,sideOffset:v=4,alignOffset:y=0,avoidCollisions:b=!0,collisionPadding:x=8}=r,S=e(n,`dropdown-menu-trigger`),C=e(n,`dropdown-menu-content`);if(!S||!C)throw Error(`DropdownMenu requires trigger and content slots`);let w=!1,T=null,E=-1,D=``,O=null,k=!1,A=[],j=[],M=[],N=new Map,P=null,F=[],I=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,L=i(S,`dropdown-menu-trigger`),R=i(C,`dropdown-menu-content`);S.setAttribute(`aria-haspopup`,`menu`),S.setAttribute(`aria-controls`,R),C.setAttribute(`role`,`menu`),C.setAttribute(`aria-labelledby`,L),C.tabIndex=-1;let z=()=>{j=t(C,`dropdown-menu-item`);for(let e of j)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;M=j.filter(e=>!I(e)),N=new Map(M.map((e,t)=>[e,t]))},B=(e,t,n,r)=>{let i=0,a=0;return e===`top`?a=n.top-r.height-v:e===`bottom`?a=n.bottom+v:i=e===`left`?n.left-r.width-v:n.right+v,e===`top`||e===`bottom`?i=t===`start`?n.left+y:t===`center`?n.left+n.width/2-r.width/2+y:n.right-r.width-y:a=t===`start`?n.top+y:t===`center`?n.top+n.height/2-r.height/2+y:n.bottom-r.height-y,{x:i,y:a}},V=()=>{let e=S.getBoundingClientRect(),t=C.getBoundingClientRect(),n=window.innerWidth,r=window.innerHeight,i=g,a=B(i,_,e,t);if(b){let o=(e,i)=>e===`top`?i.y<x:e===`bottom`?i.y+t.height>r-x:e===`left`?i.x<x:i.x+t.width>n-x;if(o(i,a)){let n=c[i],r=B(n,_,e,t);o(n,r)||(i=n,a=r)}a.x<x?a.x=x:a.x+t.width>n-x&&(a.x=n-t.width-x),a.y<x?a.y=x:a.y+t.height>r-x&&(a.y=r-t.height-x)}C.style.position=`fixed`,C.style.top=`${a.y}px`,C.style.left=`${a.x}px`,C.style.margin=`0`,C.setAttribute(`data-side`,i),C.setAttribute(`data-align`,_)},H=()=>{P===null&&(P=requestAnimationFrame(()=>{P=null,w&&V()}))},U=()=>{P!==null&&(cancelAnimationFrame(P),P=null),F.forEach(e=>e()),F.length=0},W=()=>{if(F.length>0)return;let e=()=>H();window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),F.push(()=>window.removeEventListener(`resize`,e),()=>window.removeEventListener(`scroll`,e,!0));let t=new ResizeObserver(e);t.observe(S),t.observe(C),F.push(()=>t.disconnect())},G=(e,t=!0)=>{for(let n=0;n<M.length;n++){let r=M[n];n===e?(r.setAttribute(`data-highlighted`,``),t&&r.focus()):r.removeAttribute(`data-highlighted`)}E=e},K=()=>{for(let e of j)e.removeAttribute(`data-highlighted`);E=-1},q=e=>{n.setAttribute(`data-state`,e),C.setAttribute(`data-state`,e)},J=e=>{w!==e&&(e?(T=document.activeElement,w=!0,a(S,`expanded`,!0),C.hidden=!1,q(`open`),z(),k=!1,K(),W(),V(),C.focus()):(w=!1,a(S,`expanded`,!1),C.hidden=!0,q(`closed`),K(),D=``,k=!1,U(),requestAnimationFrame(()=>{T&&document.contains(T)?T.focus():S&&document.contains(S)&&S.focus(),T=null})),s(n,`dropdown-menu:change`,{open:w}),d?.(w))},Y=e=>{if(I(e))return;let t=e.dataset.value||e.textContent?.trim()||``;s(n,`dropdown-menu:select`,{value:t}),f?.(t),h&&J(!1)},X=e=>{let t=M.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),k=!0,G(E===-1?0:(E+1)%t);break;case`ArrowUp`:e.preventDefault(),k=!0,G(E===-1?t-1:(E-1+t)%t);break;case`Home`:e.preventDefault(),k=!0,G(0);break;case`End`:e.preventDefault(),k=!0,G(t-1);break;case`Enter`:case` `:e.preventDefault(),E>=0&&Y(M[E]);break;case`Tab`:J(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),Z(e.key.toLowerCase()))}},Z=e=>{O&&clearTimeout(O),O=setTimeout(()=>{D=``},500),D+=e;let t=M.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(D));if(t===-1&&D.length===1){let n=E+1;for(let r=0;r<M.length;r++){let i=(n+r)%M.length;if((M[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(k=!0,G(t))};a(S,`expanded`,!1),C.hidden=!0,q(`closed`),A.push(o(S,`click`,()=>J(!w)),o(S,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!w&&(e.preventDefault(),J(!0))})),A.push(o(C,`keydown`,X),o(C,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&Y(t)}),o(C,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(k&&(k=!1,t&&N.get(t)===E))&&t&&!I(t)){let e=N.get(t);e!==void 0&&e!==E&&G(e,!1)}})),p&&A.push(o(document,`pointerdown`,e=>{let t=e.target;w&&!n.contains(t)&&!C.contains(t)&&J(!1)})),m&&A.push(o(document,`keydown`,e=>{w&&e.key===`Escape`&&(e.preventDefault(),J(!1))}));let Q={open:()=>J(!0),close:()=>J(!1),toggle:()=>J(!w),get isOpen(){return w},destroy:()=>{O&&clearTimeout(O),U(),A.forEach(e=>e()),A.length=0,u.delete(n)}};return l&&J(!0),Q}const u=new WeakSet;function d(e=document){let t=[];for(let r of n(e,`dropdown-menu`)){if(u.has(r))continue;u.add(r),t.push(l(r))}return t}exports.create=d,exports.createDropdownMenu=l;
1
+ const e=(e,t)=>e.querySelector(`[data-slot="${t}"]`),t=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)],n=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)];let r=0;const i=(e,t)=>e.id||=`${t}-${++r}`,a=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))};function o(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const s=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n})),c={top:`bottom`,bottom:`top`,left:`right`,right:`left`};function l(n,r={}){let{defaultOpen:l=!1,onOpenChange:d,onSelect:f,closeOnClickOutside:p=!0,closeOnEscape:m=!0,closeOnSelect:h=!0,side:g=`bottom`,align:_=`start`,sideOffset:v=4,alignOffset:y=0,avoidCollisions:b=!0,collisionPadding:x=8}=r,S=e(n,`dropdown-menu-trigger`),C=e(n,`dropdown-menu-content`);if(!S||!C)throw Error(`DropdownMenu requires trigger and content slots`);let w=!1,T=null,E=-1,D=``,O=null,k=!1,A=[],j=[],M=[],N=new Map,P=null,F=[],I=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,L=i(S,`dropdown-menu-trigger`),R=i(C,`dropdown-menu-content`);S.setAttribute(`aria-haspopup`,`menu`),S.setAttribute(`aria-controls`,R),C.setAttribute(`role`,`menu`),C.setAttribute(`aria-labelledby`,L),C.tabIndex=-1;let z=()=>{j=t(C,`dropdown-menu-item`);for(let e of j)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;M=j.filter(e=>!I(e)),N=new Map(M.map((e,t)=>[e,t]))},B=(e,t,n,r)=>{let i=0,a=0;return e===`top`?a=n.top-r.height-v:e===`bottom`?a=n.bottom+v:i=e===`left`?n.left-r.width-v:n.right+v,e===`top`||e===`bottom`?i=t===`start`?n.left+y:t===`center`?n.left+n.width/2-r.width/2+y:n.right-r.width-y:a=t===`start`?n.top+y:t===`center`?n.top+n.height/2-r.height/2+y:n.bottom-r.height-y,{x:i,y:a}},V=()=>{let e=S.getBoundingClientRect(),t=C.getBoundingClientRect(),n=window.innerWidth,r=window.innerHeight,i=g,a=B(i,_,e,t);if(b){let o=(e,i)=>e===`top`?i.y<x:e===`bottom`?i.y+t.height>r-x:e===`left`?i.x<x:i.x+t.width>n-x;if(o(i,a)){let n=c[i],r=B(n,_,e,t);o(n,r)||(i=n,a=r)}a.x<x?a.x=x:a.x+t.width>n-x&&(a.x=n-t.width-x),a.y<x?a.y=x:a.y+t.height>r-x&&(a.y=r-t.height-x)}C.style.position=`fixed`,C.style.top=`${a.y}px`,C.style.left=`${a.x}px`,C.style.margin=`0`,C.setAttribute(`data-side`,i),C.setAttribute(`data-align`,_)},H=()=>{P===null&&(P=requestAnimationFrame(()=>{P=null,w&&V()}))},U=()=>{P!==null&&(cancelAnimationFrame(P),P=null),F.forEach(e=>e()),F.length=0},W=()=>{if(F.length>0)return;let e=()=>H();window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),F.push(()=>window.removeEventListener(`resize`,e),()=>window.removeEventListener(`scroll`,e,!0));let t=new ResizeObserver(e);t.observe(S),t.observe(C),F.push(()=>t.disconnect())},G=(e,t=!0)=>{for(let n=0;n<M.length;n++){let r=M[n];n===e?(r.setAttribute(`data-highlighted`,``),t&&r.focus()):r.removeAttribute(`data-highlighted`)}E=e},K=()=>{for(let e of j)e.removeAttribute(`data-highlighted`);E=-1},q=e=>{n.setAttribute(`data-state`,e),C.setAttribute(`data-state`,e)},J=e=>{w!==e&&(e?(T=document.activeElement,w=!0,a(S,`expanded`,!0),C.hidden=!1,q(`open`),z(),k=!1,K(),W(),V(),C.focus()):(w=!1,a(S,`expanded`,!1),C.hidden=!0,q(`closed`),K(),D=``,k=!1,U(),requestAnimationFrame(()=>{T&&document.contains(T)?T.focus():S&&document.contains(S)&&S.focus(),T=null})),s(n,`dropdown-menu:change`,{open:w}),d?.(w))},Y=e=>{if(I(e))return;let t=e.dataset.value||e.textContent?.trim()||``;s(n,`dropdown-menu:select`,{value:t}),f?.(t),h&&J(!1)},X=e=>{let t=M.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),k=!0,G(E===-1?0:(E+1)%t);break;case`ArrowUp`:e.preventDefault(),k=!0,G(E===-1?t-1:(E-1+t)%t);break;case`Home`:e.preventDefault(),k=!0,G(0);break;case`End`:e.preventDefault(),k=!0,G(t-1);break;case`Enter`:case` `:e.preventDefault(),E>=0&&Y(M[E]);break;case`Tab`:J(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),Z(e.key.toLowerCase()))}},Z=e=>{O&&clearTimeout(O),O=setTimeout(()=>{D=``},500),D+=e;let t=M.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(D));if(t===-1&&D.length===1){let n=E+1;for(let r=0;r<M.length;r++){let i=(n+r)%M.length;if((M[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(k=!0,G(t))};a(S,`expanded`,!1),C.hidden=!0,q(`closed`),A.push(o(S,`click`,()=>J(!w)),o(S,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!w&&(e.preventDefault(),J(!0))})),A.push(o(C,`keydown`,X),o(C,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&Y(t)}),o(C,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(k&&(k=!1,t&&N.get(t)===E))&&t&&!I(t)){let e=N.get(t);e!==void 0&&e!==E&&G(e,!1)}}),o(C,`pointerleave`,()=>{k||K()})),p&&A.push(o(document,`pointerdown`,e=>{let t=e.target;w&&!n.contains(t)&&!C.contains(t)&&J(!1)})),m&&A.push(o(document,`keydown`,e=>{w&&e.key===`Escape`&&(e.preventDefault(),J(!1))}));let Q={open:()=>J(!0),close:()=>J(!1),toggle:()=>J(!w),get isOpen(){return w},destroy:()=>{O&&clearTimeout(O),U(),A.forEach(e=>e()),A.length=0,u.delete(n)}};return l&&J(!0),Q}const u=new WeakSet;function d(e=document){let t=[];for(let r of n(e,`dropdown-menu`)){if(u.has(r))continue;u.add(r),t.push(l(r))}return t}exports.create=d,exports.createDropdownMenu=l;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- const e=(e,t)=>e.querySelector(`[data-slot="${t}"]`),t=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)],n=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)];let r=0;const i=(e,t)=>e.id||=`${t}-${++r}`,a=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))};function o(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const s=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n})),c={top:`bottom`,bottom:`top`,left:`right`,right:`left`};function l(n,r={}){let{defaultOpen:l=!1,onOpenChange:d,onSelect:f,closeOnClickOutside:p=!0,closeOnEscape:m=!0,closeOnSelect:h=!0,side:g=`bottom`,align:_=`start`,sideOffset:v=4,alignOffset:y=0,avoidCollisions:b=!0,collisionPadding:x=8}=r,S=e(n,`dropdown-menu-trigger`),C=e(n,`dropdown-menu-content`);if(!S||!C)throw Error(`DropdownMenu requires trigger and content slots`);let w=!1,T=null,E=-1,D=``,O=null,k=!1,A=[],j=[],M=[],N=new Map,P=null,F=[],I=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,L=i(S,`dropdown-menu-trigger`),R=i(C,`dropdown-menu-content`);S.setAttribute(`aria-haspopup`,`menu`),S.setAttribute(`aria-controls`,R),C.setAttribute(`role`,`menu`),C.setAttribute(`aria-labelledby`,L),C.tabIndex=-1;let z=()=>{j=t(C,`dropdown-menu-item`);for(let e of j)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;M=j.filter(e=>!I(e)),N=new Map(M.map((e,t)=>[e,t]))},B=(e,t,n,r)=>{let i=0,a=0;return e===`top`?a=n.top-r.height-v:e===`bottom`?a=n.bottom+v:i=e===`left`?n.left-r.width-v:n.right+v,e===`top`||e===`bottom`?i=t===`start`?n.left+y:t===`center`?n.left+n.width/2-r.width/2+y:n.right-r.width-y:a=t===`start`?n.top+y:t===`center`?n.top+n.height/2-r.height/2+y:n.bottom-r.height-y,{x:i,y:a}},V=()=>{let e=S.getBoundingClientRect(),t=C.getBoundingClientRect(),n=window.innerWidth,r=window.innerHeight,i=g,a=B(i,_,e,t);if(b){let o=(e,i)=>e===`top`?i.y<x:e===`bottom`?i.y+t.height>r-x:e===`left`?i.x<x:i.x+t.width>n-x;if(o(i,a)){let n=c[i],r=B(n,_,e,t);o(n,r)||(i=n,a=r)}a.x<x?a.x=x:a.x+t.width>n-x&&(a.x=n-t.width-x),a.y<x?a.y=x:a.y+t.height>r-x&&(a.y=r-t.height-x)}C.style.position=`fixed`,C.style.top=`${a.y}px`,C.style.left=`${a.x}px`,C.style.margin=`0`,C.setAttribute(`data-side`,i),C.setAttribute(`data-align`,_)},H=()=>{P===null&&(P=requestAnimationFrame(()=>{P=null,w&&V()}))},U=()=>{P!==null&&(cancelAnimationFrame(P),P=null),F.forEach(e=>e()),F.length=0},W=()=>{if(F.length>0)return;let e=()=>H();window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),F.push(()=>window.removeEventListener(`resize`,e),()=>window.removeEventListener(`scroll`,e,!0));let t=new ResizeObserver(e);t.observe(S),t.observe(C),F.push(()=>t.disconnect())},G=(e,t=!0)=>{for(let n=0;n<M.length;n++){let r=M[n];n===e?(r.setAttribute(`data-highlighted`,``),t&&r.focus()):r.removeAttribute(`data-highlighted`)}E=e},K=()=>{for(let e of j)e.removeAttribute(`data-highlighted`);E=-1},q=e=>{n.setAttribute(`data-state`,e),C.setAttribute(`data-state`,e)},J=e=>{w!==e&&(e?(T=document.activeElement,w=!0,a(S,`expanded`,!0),C.hidden=!1,q(`open`),z(),k=!1,K(),W(),V(),C.focus()):(w=!1,a(S,`expanded`,!1),C.hidden=!0,q(`closed`),K(),D=``,k=!1,U(),requestAnimationFrame(()=>{T&&document.contains(T)?T.focus():S&&document.contains(S)&&S.focus(),T=null})),s(n,`dropdown-menu:change`,{open:w}),d?.(w))},Y=e=>{if(I(e))return;let t=e.dataset.value||e.textContent?.trim()||``;s(n,`dropdown-menu:select`,{value:t}),f?.(t),h&&J(!1)},X=e=>{let t=M.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),k=!0,G(E===-1?0:(E+1)%t);break;case`ArrowUp`:e.preventDefault(),k=!0,G(E===-1?t-1:(E-1+t)%t);break;case`Home`:e.preventDefault(),k=!0,G(0);break;case`End`:e.preventDefault(),k=!0,G(t-1);break;case`Enter`:case` `:e.preventDefault(),E>=0&&Y(M[E]);break;case`Tab`:J(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),Z(e.key.toLowerCase()))}},Z=e=>{O&&clearTimeout(O),O=setTimeout(()=>{D=``},500),D+=e;let t=M.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(D));if(t===-1&&D.length===1){let n=E+1;for(let r=0;r<M.length;r++){let i=(n+r)%M.length;if((M[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(k=!0,G(t))};a(S,`expanded`,!1),C.hidden=!0,q(`closed`),A.push(o(S,`click`,()=>J(!w)),o(S,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!w&&(e.preventDefault(),J(!0))})),A.push(o(C,`keydown`,X),o(C,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&Y(t)}),o(C,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(k&&(k=!1,t&&N.get(t)===E))&&t&&!I(t)){let e=N.get(t);e!==void 0&&e!==E&&G(e,!1)}})),p&&A.push(o(document,`pointerdown`,e=>{let t=e.target;w&&!n.contains(t)&&!C.contains(t)&&J(!1)})),m&&A.push(o(document,`keydown`,e=>{w&&e.key===`Escape`&&(e.preventDefault(),J(!1))}));let Q={open:()=>J(!0),close:()=>J(!1),toggle:()=>J(!w),get isOpen(){return w},destroy:()=>{O&&clearTimeout(O),U(),A.forEach(e=>e()),A.length=0,u.delete(n)}};return l&&J(!0),Q}const u=new WeakSet;function d(e=document){let t=[];for(let r of n(e,`dropdown-menu`)){if(u.has(r))continue;u.add(r),t.push(l(r))}return t}export{d as create,l as createDropdownMenu};
1
+ const e=(e,t)=>e.querySelector(`[data-slot="${t}"]`),t=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)],n=(e,t)=>[...e.querySelectorAll(`[data-slot="${t}"]`)];let r=0;const i=(e,t)=>e.id||=`${t}-${++r}`,a=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))};function o(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const s=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n})),c={top:`bottom`,bottom:`top`,left:`right`,right:`left`};function l(n,r={}){let{defaultOpen:l=!1,onOpenChange:d,onSelect:f,closeOnClickOutside:p=!0,closeOnEscape:m=!0,closeOnSelect:h=!0,side:g=`bottom`,align:_=`start`,sideOffset:v=4,alignOffset:y=0,avoidCollisions:b=!0,collisionPadding:x=8}=r,S=e(n,`dropdown-menu-trigger`),C=e(n,`dropdown-menu-content`);if(!S||!C)throw Error(`DropdownMenu requires trigger and content slots`);let w=!1,T=null,E=-1,D=``,O=null,k=!1,A=[],j=[],M=[],N=new Map,P=null,F=[],I=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,L=i(S,`dropdown-menu-trigger`),R=i(C,`dropdown-menu-content`);S.setAttribute(`aria-haspopup`,`menu`),S.setAttribute(`aria-controls`,R),C.setAttribute(`role`,`menu`),C.setAttribute(`aria-labelledby`,L),C.tabIndex=-1;let z=()=>{j=t(C,`dropdown-menu-item`);for(let e of j)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;M=j.filter(e=>!I(e)),N=new Map(M.map((e,t)=>[e,t]))},B=(e,t,n,r)=>{let i=0,a=0;return e===`top`?a=n.top-r.height-v:e===`bottom`?a=n.bottom+v:i=e===`left`?n.left-r.width-v:n.right+v,e===`top`||e===`bottom`?i=t===`start`?n.left+y:t===`center`?n.left+n.width/2-r.width/2+y:n.right-r.width-y:a=t===`start`?n.top+y:t===`center`?n.top+n.height/2-r.height/2+y:n.bottom-r.height-y,{x:i,y:a}},V=()=>{let e=S.getBoundingClientRect(),t=C.getBoundingClientRect(),n=window.innerWidth,r=window.innerHeight,i=g,a=B(i,_,e,t);if(b){let o=(e,i)=>e===`top`?i.y<x:e===`bottom`?i.y+t.height>r-x:e===`left`?i.x<x:i.x+t.width>n-x;if(o(i,a)){let n=c[i],r=B(n,_,e,t);o(n,r)||(i=n,a=r)}a.x<x?a.x=x:a.x+t.width>n-x&&(a.x=n-t.width-x),a.y<x?a.y=x:a.y+t.height>r-x&&(a.y=r-t.height-x)}C.style.position=`fixed`,C.style.top=`${a.y}px`,C.style.left=`${a.x}px`,C.style.margin=`0`,C.setAttribute(`data-side`,i),C.setAttribute(`data-align`,_)},H=()=>{P===null&&(P=requestAnimationFrame(()=>{P=null,w&&V()}))},U=()=>{P!==null&&(cancelAnimationFrame(P),P=null),F.forEach(e=>e()),F.length=0},W=()=>{if(F.length>0)return;let e=()=>H();window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),F.push(()=>window.removeEventListener(`resize`,e),()=>window.removeEventListener(`scroll`,e,!0));let t=new ResizeObserver(e);t.observe(S),t.observe(C),F.push(()=>t.disconnect())},G=(e,t=!0)=>{for(let n=0;n<M.length;n++){let r=M[n];n===e?(r.setAttribute(`data-highlighted`,``),t&&r.focus()):r.removeAttribute(`data-highlighted`)}E=e},K=()=>{for(let e of j)e.removeAttribute(`data-highlighted`);E=-1},q=e=>{n.setAttribute(`data-state`,e),C.setAttribute(`data-state`,e)},J=e=>{w!==e&&(e?(T=document.activeElement,w=!0,a(S,`expanded`,!0),C.hidden=!1,q(`open`),z(),k=!1,K(),W(),V(),C.focus()):(w=!1,a(S,`expanded`,!1),C.hidden=!0,q(`closed`),K(),D=``,k=!1,U(),requestAnimationFrame(()=>{T&&document.contains(T)?T.focus():S&&document.contains(S)&&S.focus(),T=null})),s(n,`dropdown-menu:change`,{open:w}),d?.(w))},Y=e=>{if(I(e))return;let t=e.dataset.value||e.textContent?.trim()||``;s(n,`dropdown-menu:select`,{value:t}),f?.(t),h&&J(!1)},X=e=>{let t=M.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),k=!0,G(E===-1?0:(E+1)%t);break;case`ArrowUp`:e.preventDefault(),k=!0,G(E===-1?t-1:(E-1+t)%t);break;case`Home`:e.preventDefault(),k=!0,G(0);break;case`End`:e.preventDefault(),k=!0,G(t-1);break;case`Enter`:case` `:e.preventDefault(),E>=0&&Y(M[E]);break;case`Tab`:J(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),Z(e.key.toLowerCase()))}},Z=e=>{O&&clearTimeout(O),O=setTimeout(()=>{D=``},500),D+=e;let t=M.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(D));if(t===-1&&D.length===1){let n=E+1;for(let r=0;r<M.length;r++){let i=(n+r)%M.length;if((M[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(k=!0,G(t))};a(S,`expanded`,!1),C.hidden=!0,q(`closed`),A.push(o(S,`click`,()=>J(!w)),o(S,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!w&&(e.preventDefault(),J(!0))})),A.push(o(C,`keydown`,X),o(C,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&Y(t)}),o(C,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(k&&(k=!1,t&&N.get(t)===E))&&t&&!I(t)){let e=N.get(t);e!==void 0&&e!==E&&G(e,!1)}}),o(C,`pointerleave`,()=>{k||K()})),p&&A.push(o(document,`pointerdown`,e=>{let t=e.target;w&&!n.contains(t)&&!C.contains(t)&&J(!1)})),m&&A.push(o(document,`keydown`,e=>{w&&e.key===`Escape`&&(e.preventDefault(),J(!1))}));let Q={open:()=>J(!0),close:()=>J(!1),toggle:()=>J(!w),get isOpen(){return w},destroy:()=>{O&&clearTimeout(O),U(),A.forEach(e=>e()),A.length=0,u.delete(n)}};return l&&J(!0),Q}const u=new WeakSet;function d(e=document){let t=[];for(let r of n(e,`dropdown-menu`)){if(u.has(r))continue;u.add(r),t.push(l(r))}return t}export{d as create,l as createDropdownMenu};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-slot/dropdown-menu",
3
- "version": "0.2.2",
3
+ "version": "0.2.4",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.cjs",