@data-slot/dropdown-menu 0.2.16 → 0.2.18

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}"]`)],r=new WeakMap;function i(e,t,n){if(typeof process<`u`&&process.env?.NODE_ENV===`production`)return;let i=r.get(e);i||(i=new Set,r.set(e,i)),!i.has(t)&&(i.add(t),console.warn(`[@data-slot] ${n}`))}function a(e){let t=`data-${e.replace(/([A-Z])/g,`-$1`).toLowerCase()}`,n=`data-${e}`;return t===n?[t]:[t,n]}function o(e,t){for(let n of a(t))if(e.hasAttribute(n))return e.getAttribute(n);return null}function s(e,t){return a(t).some(t=>e.hasAttribute(t))}const c=new Set([``,`true`,`1`,`yes`]),l=new Set([`false`,`0`,`no`]);function u(e,t){if(!s(e,t))return;let n=o(e,t);if(n===null)return;let r=n.toLowerCase();if(c.has(r))return!0;if(l.has(r))return!1;i(e,t,`Invalid boolean value "${n}" for data-${t}. Expected: true/false/1/0/yes/no or empty.`)}function d(e,t){let n=o(e,t);if(n===null||n===``)return;let r=Number(n);if(Number.isNaN(r)||!Number.isFinite(r)){i(e,t,`Invalid number value "${n}" for data-${t}.`);return}return r}function f(e,t,n){let r=o(e,t);if(r!==null){if(n.includes(r))return r;i(e,t,`Invalid value "${r}" for data-${t}. Expected one of: ${n.join(`, `)}.`)}}let p=0;const m=(e,t)=>e.id||=`${t}-${++p}`,h=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))};function g(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const _=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n})),v=[`top`,`right`,`bottom`,`left`],y=[`start`,`center`,`end`],b={top:`bottom`,bottom:`top`,left:`right`,right:`left`};function x(n,r={}){let i=e(n,`dropdown-menu-trigger`),a=e(n,`dropdown-menu-content`);if(!i||!a)throw Error(`DropdownMenu requires trigger and content slots`);let o=r.defaultOpen??u(n,`defaultOpen`)??!1,s=r.onOpenChange,c=r.onSelect,l=r.closeOnClickOutside??u(n,`closeOnClickOutside`)??!0,p=r.closeOnEscape??u(n,`closeOnEscape`)??!0,x=r.closeOnSelect??u(n,`closeOnSelect`)??!0,C=r.side??f(a,`side`,v)??f(n,`side`,v)??`bottom`,w=r.align??f(a,`align`,y)??f(n,`align`,y)??`start`,T=r.sideOffset??d(a,`sideOffset`)??d(n,`sideOffset`)??4,E=r.alignOffset??d(a,`alignOffset`)??d(n,`alignOffset`)??0,D=r.avoidCollisions??u(a,`avoidCollisions`)??u(n,`avoidCollisions`)??!0,O=r.collisionPadding??d(a,`collisionPadding`)??d(n,`collisionPadding`)??8,k=!1,A=null,j=-1,M=``,N=null,P=!1,F=[],I=[],L=[],R=new Map,z=null,B=[],V=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,H=m(i,`dropdown-menu-trigger`),U=m(a,`dropdown-menu-content`);i.setAttribute(`aria-haspopup`,`menu`),i.setAttribute(`aria-controls`,U),a.setAttribute(`role`,`menu`),a.setAttribute(`aria-labelledby`,H),a.tabIndex=-1;let W=()=>{I=t(a,`dropdown-menu-item`);for(let e of I)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;L=I.filter(e=>!V(e)),R=new Map(L.map((e,t)=>[e,t]))},G=(e,t,n,r)=>{let i=0,a=0;return e===`top`?a=n.top-r.height-T:e===`bottom`?a=n.bottom+T:i=e===`left`?n.left-r.width-T:n.right+T,e===`top`||e===`bottom`?i=t===`start`?n.left+E:t===`center`?n.left+n.width/2-r.width/2+E:n.right-r.width-E:a=t===`start`?n.top+E:t===`center`?n.top+n.height/2-r.height/2+E:n.bottom-r.height-E,{x:i,y:a}},K=()=>{let e=i.getBoundingClientRect(),t=a.getBoundingClientRect(),n=window.innerWidth,r=window.innerHeight,o=C,s=G(o,w,e,t);if(D){let i=(e,i)=>e===`top`?i.y<O:e===`bottom`?i.y+t.height>r-O:e===`left`?i.x<O:i.x+t.width>n-O;if(i(o,s)){let n=b[o],r=G(n,w,e,t);i(n,r)||(o=n,s=r)}s.x<O?s.x=O:s.x+t.width>n-O&&(s.x=n-t.width-O),s.y<O?s.y=O:s.y+t.height>r-O&&(s.y=r-t.height-O)}a.style.position=`fixed`,a.style.top=`${s.y}px`,a.style.left=`${s.x}px`,a.style.margin=`0`,a.setAttribute(`data-side`,o),a.setAttribute(`data-align`,w)},q=()=>{z===null&&(z=requestAnimationFrame(()=>{z=null,k&&K()}))},J=()=>{z!==null&&(cancelAnimationFrame(z),z=null),B.forEach(e=>e()),B.length=0},ee=()=>{if(B.length>0)return;let e=()=>q();window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),B.push(()=>window.removeEventListener(`resize`,e),()=>window.removeEventListener(`scroll`,e,!0));let t=new ResizeObserver(e);t.observe(i),t.observe(a),B.push(()=>t.disconnect())},Y=(e,t=!0)=>{for(let n=0;n<L.length;n++){let r=L[n];n===e?(r.setAttribute(`data-highlighted`,``),t&&r.focus()):r.removeAttribute(`data-highlighted`)}j=e},X=()=>{for(let e of I)e.removeAttribute(`data-highlighted`);j=-1},Z=e=>{n.setAttribute(`data-state`,e),a.setAttribute(`data-state`,e)},Q=e=>{k!==e&&(e?(A=document.activeElement,k=!0,h(i,`expanded`,!0),a.hidden=!1,Z(`open`),W(),P=!1,X(),ee(),K(),a.focus()):(k=!1,h(i,`expanded`,!1),a.hidden=!0,Z(`closed`),X(),M=``,P=!1,J(),requestAnimationFrame(()=>{A&&document.contains(A)?A.focus():i&&document.contains(i)&&i.focus(),A=null})),_(n,`dropdown-menu:change`,{open:k}),s?.(k))},$=e=>{if(V(e))return;let t=e.dataset.value||e.textContent?.trim()||``;_(n,`dropdown-menu:select`,{value:t}),c?.(t),x&&Q(!1)},te=e=>{let t=L.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),P=!0,Y(j===-1?0:(j+1)%t);break;case`ArrowUp`:e.preventDefault(),P=!0,Y(j===-1?t-1:(j-1+t)%t);break;case`Home`:e.preventDefault(),P=!0,Y(0);break;case`End`:e.preventDefault(),P=!0,Y(t-1);break;case`Enter`:case` `:e.preventDefault(),j>=0&&$(L[j]);break;case`Tab`:Q(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),ne(e.key.toLowerCase()))}},ne=e=>{N&&clearTimeout(N),N=setTimeout(()=>{M=``},500),M+=e;let t=L.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(M));if(t===-1&&M.length===1){let n=j+1;for(let r=0;r<L.length;r++){let i=(n+r)%L.length;if((L[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(P=!0,Y(t))};h(i,`expanded`,!1),a.hidden=!0,Z(`closed`),F.push(g(i,`click`,()=>Q(!k)),g(i,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!k&&(e.preventDefault(),Q(!0))})),F.push(g(a,`keydown`,te),g(a,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),g(a,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(P&&(P=!1,t&&R.get(t)===j))&&t&&!V(t)){let e=R.get(t);e!==void 0&&e!==j&&Y(e,!1)}}),g(a,`pointerleave`,()=>{P||X()})),l&&F.push(g(document,`pointerdown`,e=>{let t=e.target;k&&!n.contains(t)&&!a.contains(t)&&Q(!1)})),p&&F.push(g(document,`keydown`,e=>{k&&e.key===`Escape`&&(e.preventDefault(),Q(!1))})),F.push(g(n,`dropdown-menu:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&Q(n)}));let re={open:()=>Q(!0),close:()=>Q(!1),toggle:()=>Q(!k),get isOpen(){return k},destroy:()=>{N&&clearTimeout(N),J(),F.forEach(e=>e()),F.length=0,S.delete(n)}};return o&&Q(!0),re}const S=new WeakSet;function C(e=document){let t=[];for(let r of n(e,`dropdown-menu`)){if(S.has(r))continue;S.add(r),t.push(x(r))}return t}exports.create=C,exports.createDropdownMenu=x;
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}"]`)],r=new WeakMap;function i(e,t,n){if(typeof process<`u`&&process.env?.NODE_ENV===`production`)return;let i=r.get(e);i||(i=new Set,r.set(e,i)),!i.has(t)&&(i.add(t),console.warn(`[@data-slot] ${n}`))}function a(e){let t=`data-${e.replace(/([A-Z])/g,`-$1`).toLowerCase()}`,n=`data-${e}`;return t===n?[t]:[t,n]}function o(e,t){for(let n of a(t))if(e.hasAttribute(n))return e.getAttribute(n);return null}function s(e,t){return a(t).some(t=>e.hasAttribute(t))}const c=new Set([``,`true`,`1`,`yes`]),l=new Set([`false`,`0`,`no`]);function u(e,t){if(!s(e,t))return;let n=o(e,t);if(n===null)return;let r=n.toLowerCase();if(c.has(r))return!0;if(l.has(r))return!1;i(e,t,`Invalid boolean value "${n}" for data-${t}. Expected: true/false/1/0/yes/no or empty.`)}function d(e,t){let n=o(e,t);if(n===null||n===``)return;let r=Number(n);if(Number.isNaN(r)||!Number.isFinite(r)){i(e,t,`Invalid number value "${n}" for data-${t}.`);return}return r}function f(e,t,n){let r=o(e,t);if(r!==null){if(n.includes(r))return r;i(e,t,`Invalid value "${r}" for data-${t}. Expected one of: ${n.join(`, `)}.`)}}let p=0;const m=(e,t)=>e.id||=`${t}-${++p}`,h=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))};function g(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const _=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n}));let v=0,y=``,b=``;function x(){if(v===0){let e=window.innerWidth-document.documentElement.clientWidth;y=document.body.style.overflow,b=document.body.style.paddingRight;let t=parseFloat(getComputedStyle(document.body).paddingRight)||0;document.body.style.paddingRight=`${t+e}px`,document.body.style.overflow=`hidden`}v++}function S(){v=Math.max(0,v-1),v===0&&(document.body.style.overflow=y,document.body.style.paddingRight=b)}const C=[`top`,`right`,`bottom`,`left`],w=[`start`,`center`,`end`],T={top:`bottom`,bottom:`top`,left:`right`,right:`left`};function E(n,r={}){let i=e(n,`dropdown-menu-trigger`),a=e(n,`dropdown-menu-content`);if(!i||!a)throw Error(`DropdownMenu requires trigger and content slots`);let o=r.defaultOpen??u(n,`defaultOpen`)??!1,s=r.onOpenChange,c=r.onSelect,l=r.closeOnClickOutside??u(n,`closeOnClickOutside`)??!0,p=r.closeOnEscape??u(n,`closeOnEscape`)??!0,v=r.closeOnSelect??u(n,`closeOnSelect`)??!0,y=r.side??f(a,`side`,C)??f(n,`side`,C)??`bottom`,b=r.align??f(a,`align`,w)??f(n,`align`,w)??`start`,E=r.sideOffset??d(a,`sideOffset`)??d(n,`sideOffset`)??4,O=r.alignOffset??d(a,`alignOffset`)??d(n,`alignOffset`)??0,ee=r.avoidCollisions??u(a,`avoidCollisions`)??u(n,`avoidCollisions`)??!0,k=r.collisionPadding??d(a,`collisionPadding`)??d(n,`collisionPadding`)??8,A=r.lockScroll??u(n,`lockScroll`)??!0,j=!1,M=null,N=-1,P=``,F=null,I=!1,L=[],R=!1,z=[],B=[],V=new Map,H=null,U=[],W=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,G=m(i,`dropdown-menu-trigger`),te=m(a,`dropdown-menu-content`);i.setAttribute(`aria-haspopup`,`menu`),i.setAttribute(`aria-controls`,te),a.setAttribute(`role`,`menu`),a.setAttribute(`aria-labelledby`,G),a.tabIndex=-1;let ne=()=>{z=t(a,`dropdown-menu-item`);for(let e of z)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;B=z.filter(e=>!W(e)),V=new Map(B.map((e,t)=>[e,t]))},K=(e,t,n,r)=>{let i=0,a=0;return e===`top`?a=n.top-r.height-E:e===`bottom`?a=n.bottom+E:i=e===`left`?n.left-r.width-E:n.right+E,e===`top`||e===`bottom`?i=t===`start`?n.left+O:t===`center`?n.left+n.width/2-r.width/2+O:n.right-r.width-O:a=t===`start`?n.top+O:t===`center`?n.top+n.height/2-r.height/2+O:n.bottom-r.height-O,{x:i,y:a}},q=()=>{let e=i.getBoundingClientRect(),t=a.getBoundingClientRect(),n=window.innerWidth,r=window.innerHeight,o=y,s=K(o,b,e,t);if(ee){let i=(e,i)=>e===`top`?i.y<k:e===`bottom`?i.y+t.height>r-k:e===`left`?i.x<k:i.x+t.width>n-k;if(i(o,s)){let n=T[o],r=K(n,b,e,t);i(n,r)||(o=n,s=r)}s.x<k?s.x=k:s.x+t.width>n-k&&(s.x=n-t.width-k),s.y<k?s.y=k:s.y+t.height>r-k&&(s.y=r-t.height-k)}a.style.position=`fixed`,a.style.top=`${s.y}px`,a.style.left=`${s.x}px`,a.style.margin=`0`,a.setAttribute(`data-side`,o),a.setAttribute(`data-align`,b)},re=()=>{H===null&&(H=requestAnimationFrame(()=>{H=null,j&&q()}))},J=()=>{H!==null&&(cancelAnimationFrame(H),H=null),U.forEach(e=>e()),U.length=0},ie=()=>{if(U.length>0)return;let e=()=>re();window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),U.push(()=>window.removeEventListener(`resize`,e),()=>window.removeEventListener(`scroll`,e,!0));let t=new ResizeObserver(e);t.observe(i),t.observe(a),U.push(()=>t.disconnect())},Y=(e,t=!0)=>{for(let n=0;n<B.length;n++){let r=B[n];n===e?(r.setAttribute(`data-highlighted`,``),t&&r.focus()):r.removeAttribute(`data-highlighted`)}N=e},X=()=>{for(let e of z)e.removeAttribute(`data-highlighted`);N=-1},Z=e=>{n.setAttribute(`data-state`,e),a.setAttribute(`data-state`,e)},Q=e=>{j!==e&&(e?(M=document.activeElement,j=!0,h(i,`expanded`,!0),a.hidden=!1,Z(`open`),A&&!R&&(x(),R=!0),ne(),I=!1,X(),ie(),q(),a.focus()):(j=!1,h(i,`expanded`,!1),a.hidden=!0,Z(`closed`),X(),P=``,I=!1,R&&(S(),R=!1),J(),requestAnimationFrame(()=>{M&&document.contains(M)?M.focus():i&&document.contains(i)&&i.focus(),M=null})),_(n,`dropdown-menu:change`,{open:j}),s?.(j))},$=e=>{if(W(e))return;let t=e.dataset.value||e.textContent?.trim()||``;_(n,`dropdown-menu:select`,{value:t}),c?.(t),v&&Q(!1)},ae=e=>{let t=B.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),I=!0,Y(N===-1?0:(N+1)%t);break;case`ArrowUp`:e.preventDefault(),I=!0,Y(N===-1?t-1:(N-1+t)%t);break;case`Home`:e.preventDefault(),I=!0,Y(0);break;case`End`:e.preventDefault(),I=!0,Y(t-1);break;case`Enter`:case` `:e.preventDefault(),N>=0&&$(B[N]);break;case`Tab`:Q(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),oe(e.key.toLowerCase()))}},oe=e=>{F&&clearTimeout(F),F=setTimeout(()=>{P=``},500),P+=e;let t=B.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(P));if(t===-1&&P.length===1){let n=N+1;for(let r=0;r<B.length;r++){let i=(n+r)%B.length;if((B[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(I=!0,Y(t))};h(i,`expanded`,!1),a.hidden=!0,Z(`closed`),L.push(g(i,`click`,()=>Q(!j)),g(i,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!j&&(e.preventDefault(),Q(!0))})),L.push(g(a,`keydown`,ae),g(a,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),g(a,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(I&&(I=!1,t&&V.get(t)===N))&&t&&!W(t)){let e=V.get(t);e!==void 0&&e!==N&&Y(e,!1)}}),g(a,`pointerleave`,()=>{I||X()})),l&&L.push(g(document,`pointerdown`,e=>{let t=e.target;j&&!n.contains(t)&&!a.contains(t)&&Q(!1)})),p&&L.push(g(document,`keydown`,e=>{j&&e.key===`Escape`&&(e.preventDefault(),Q(!1))})),L.push(g(n,`dropdown-menu:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&Q(n)}));let se={open:()=>Q(!0),close:()=>Q(!1),toggle:()=>Q(!j),get isOpen(){return j},destroy:()=>{F&&clearTimeout(F),J(),R&&(S(),R=!1),L.forEach(e=>e()),L.length=0,D.delete(n)}};return o&&Q(!0),se}const D=new WeakSet;function O(e=document){let t=[];for(let r of n(e,`dropdown-menu`)){if(D.has(r))continue;D.add(r),t.push(E(r))}return t}exports.create=O,exports.createDropdownMenu=E;
package/dist/index.d.cts CHANGED
@@ -48,6 +48,11 @@ interface DropdownMenuOptions {
48
48
  * @default 8
49
49
  */
50
50
  collisionPadding?: number;
51
+ /**
52
+ * Lock body scroll when open.
53
+ * @default true
54
+ */
55
+ lockScroll?: boolean;
51
56
  }
52
57
  interface DropdownMenuController {
53
58
  /** Open the dropdown menu */
package/dist/index.d.ts CHANGED
@@ -48,6 +48,11 @@ interface DropdownMenuOptions {
48
48
  * @default 8
49
49
  */
50
50
  collisionPadding?: number;
51
+ /**
52
+ * Lock body scroll when open.
53
+ * @default true
54
+ */
55
+ lockScroll?: boolean;
51
56
  }
52
57
  interface DropdownMenuController {
53
58
  /** Open the dropdown menu */
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}"]`)],r=new WeakMap;function i(e,t,n){if(typeof process<`u`&&process.env?.NODE_ENV===`production`)return;let i=r.get(e);i||(i=new Set,r.set(e,i)),!i.has(t)&&(i.add(t),console.warn(`[@data-slot] ${n}`))}function a(e){let t=`data-${e.replace(/([A-Z])/g,`-$1`).toLowerCase()}`,n=`data-${e}`;return t===n?[t]:[t,n]}function o(e,t){for(let n of a(t))if(e.hasAttribute(n))return e.getAttribute(n);return null}function s(e,t){return a(t).some(t=>e.hasAttribute(t))}const c=new Set([``,`true`,`1`,`yes`]),l=new Set([`false`,`0`,`no`]);function u(e,t){if(!s(e,t))return;let n=o(e,t);if(n===null)return;let r=n.toLowerCase();if(c.has(r))return!0;if(l.has(r))return!1;i(e,t,`Invalid boolean value "${n}" for data-${t}. Expected: true/false/1/0/yes/no or empty.`)}function d(e,t){let n=o(e,t);if(n===null||n===``)return;let r=Number(n);if(Number.isNaN(r)||!Number.isFinite(r)){i(e,t,`Invalid number value "${n}" for data-${t}.`);return}return r}function f(e,t,n){let r=o(e,t);if(r!==null){if(n.includes(r))return r;i(e,t,`Invalid value "${r}" for data-${t}. Expected one of: ${n.join(`, `)}.`)}}let p=0;const m=(e,t)=>e.id||=`${t}-${++p}`,h=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))};function g(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const _=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n})),v=[`top`,`right`,`bottom`,`left`],y=[`start`,`center`,`end`],b={top:`bottom`,bottom:`top`,left:`right`,right:`left`};function x(n,r={}){let i=e(n,`dropdown-menu-trigger`),a=e(n,`dropdown-menu-content`);if(!i||!a)throw Error(`DropdownMenu requires trigger and content slots`);let o=r.defaultOpen??u(n,`defaultOpen`)??!1,s=r.onOpenChange,c=r.onSelect,l=r.closeOnClickOutside??u(n,`closeOnClickOutside`)??!0,p=r.closeOnEscape??u(n,`closeOnEscape`)??!0,x=r.closeOnSelect??u(n,`closeOnSelect`)??!0,C=r.side??f(a,`side`,v)??f(n,`side`,v)??`bottom`,w=r.align??f(a,`align`,y)??f(n,`align`,y)??`start`,T=r.sideOffset??d(a,`sideOffset`)??d(n,`sideOffset`)??4,E=r.alignOffset??d(a,`alignOffset`)??d(n,`alignOffset`)??0,D=r.avoidCollisions??u(a,`avoidCollisions`)??u(n,`avoidCollisions`)??!0,O=r.collisionPadding??d(a,`collisionPadding`)??d(n,`collisionPadding`)??8,k=!1,A=null,j=-1,M=``,N=null,P=!1,F=[],I=[],L=[],R=new Map,z=null,B=[],V=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,H=m(i,`dropdown-menu-trigger`),U=m(a,`dropdown-menu-content`);i.setAttribute(`aria-haspopup`,`menu`),i.setAttribute(`aria-controls`,U),a.setAttribute(`role`,`menu`),a.setAttribute(`aria-labelledby`,H),a.tabIndex=-1;let W=()=>{I=t(a,`dropdown-menu-item`);for(let e of I)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;L=I.filter(e=>!V(e)),R=new Map(L.map((e,t)=>[e,t]))},G=(e,t,n,r)=>{let i=0,a=0;return e===`top`?a=n.top-r.height-T:e===`bottom`?a=n.bottom+T:i=e===`left`?n.left-r.width-T:n.right+T,e===`top`||e===`bottom`?i=t===`start`?n.left+E:t===`center`?n.left+n.width/2-r.width/2+E:n.right-r.width-E:a=t===`start`?n.top+E:t===`center`?n.top+n.height/2-r.height/2+E:n.bottom-r.height-E,{x:i,y:a}},K=()=>{let e=i.getBoundingClientRect(),t=a.getBoundingClientRect(),n=window.innerWidth,r=window.innerHeight,o=C,s=G(o,w,e,t);if(D){let i=(e,i)=>e===`top`?i.y<O:e===`bottom`?i.y+t.height>r-O:e===`left`?i.x<O:i.x+t.width>n-O;if(i(o,s)){let n=b[o],r=G(n,w,e,t);i(n,r)||(o=n,s=r)}s.x<O?s.x=O:s.x+t.width>n-O&&(s.x=n-t.width-O),s.y<O?s.y=O:s.y+t.height>r-O&&(s.y=r-t.height-O)}a.style.position=`fixed`,a.style.top=`${s.y}px`,a.style.left=`${s.x}px`,a.style.margin=`0`,a.setAttribute(`data-side`,o),a.setAttribute(`data-align`,w)},q=()=>{z===null&&(z=requestAnimationFrame(()=>{z=null,k&&K()}))},J=()=>{z!==null&&(cancelAnimationFrame(z),z=null),B.forEach(e=>e()),B.length=0},ee=()=>{if(B.length>0)return;let e=()=>q();window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),B.push(()=>window.removeEventListener(`resize`,e),()=>window.removeEventListener(`scroll`,e,!0));let t=new ResizeObserver(e);t.observe(i),t.observe(a),B.push(()=>t.disconnect())},Y=(e,t=!0)=>{for(let n=0;n<L.length;n++){let r=L[n];n===e?(r.setAttribute(`data-highlighted`,``),t&&r.focus()):r.removeAttribute(`data-highlighted`)}j=e},X=()=>{for(let e of I)e.removeAttribute(`data-highlighted`);j=-1},Z=e=>{n.setAttribute(`data-state`,e),a.setAttribute(`data-state`,e)},Q=e=>{k!==e&&(e?(A=document.activeElement,k=!0,h(i,`expanded`,!0),a.hidden=!1,Z(`open`),W(),P=!1,X(),ee(),K(),a.focus()):(k=!1,h(i,`expanded`,!1),a.hidden=!0,Z(`closed`),X(),M=``,P=!1,J(),requestAnimationFrame(()=>{A&&document.contains(A)?A.focus():i&&document.contains(i)&&i.focus(),A=null})),_(n,`dropdown-menu:change`,{open:k}),s?.(k))},$=e=>{if(V(e))return;let t=e.dataset.value||e.textContent?.trim()||``;_(n,`dropdown-menu:select`,{value:t}),c?.(t),x&&Q(!1)},te=e=>{let t=L.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),P=!0,Y(j===-1?0:(j+1)%t);break;case`ArrowUp`:e.preventDefault(),P=!0,Y(j===-1?t-1:(j-1+t)%t);break;case`Home`:e.preventDefault(),P=!0,Y(0);break;case`End`:e.preventDefault(),P=!0,Y(t-1);break;case`Enter`:case` `:e.preventDefault(),j>=0&&$(L[j]);break;case`Tab`:Q(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),ne(e.key.toLowerCase()))}},ne=e=>{N&&clearTimeout(N),N=setTimeout(()=>{M=``},500),M+=e;let t=L.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(M));if(t===-1&&M.length===1){let n=j+1;for(let r=0;r<L.length;r++){let i=(n+r)%L.length;if((L[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(P=!0,Y(t))};h(i,`expanded`,!1),a.hidden=!0,Z(`closed`),F.push(g(i,`click`,()=>Q(!k)),g(i,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!k&&(e.preventDefault(),Q(!0))})),F.push(g(a,`keydown`,te),g(a,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),g(a,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(P&&(P=!1,t&&R.get(t)===j))&&t&&!V(t)){let e=R.get(t);e!==void 0&&e!==j&&Y(e,!1)}}),g(a,`pointerleave`,()=>{P||X()})),l&&F.push(g(document,`pointerdown`,e=>{let t=e.target;k&&!n.contains(t)&&!a.contains(t)&&Q(!1)})),p&&F.push(g(document,`keydown`,e=>{k&&e.key===`Escape`&&(e.preventDefault(),Q(!1))})),F.push(g(n,`dropdown-menu:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&Q(n)}));let re={open:()=>Q(!0),close:()=>Q(!1),toggle:()=>Q(!k),get isOpen(){return k},destroy:()=>{N&&clearTimeout(N),J(),F.forEach(e=>e()),F.length=0,S.delete(n)}};return o&&Q(!0),re}const S=new WeakSet;function C(e=document){let t=[];for(let r of n(e,`dropdown-menu`)){if(S.has(r))continue;S.add(r),t.push(x(r))}return t}export{C as create,x 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}"]`)],r=new WeakMap;function i(e,t,n){if(typeof process<`u`&&process.env?.NODE_ENV===`production`)return;let i=r.get(e);i||(i=new Set,r.set(e,i)),!i.has(t)&&(i.add(t),console.warn(`[@data-slot] ${n}`))}function a(e){let t=`data-${e.replace(/([A-Z])/g,`-$1`).toLowerCase()}`,n=`data-${e}`;return t===n?[t]:[t,n]}function o(e,t){for(let n of a(t))if(e.hasAttribute(n))return e.getAttribute(n);return null}function s(e,t){return a(t).some(t=>e.hasAttribute(t))}const c=new Set([``,`true`,`1`,`yes`]),l=new Set([`false`,`0`,`no`]);function u(e,t){if(!s(e,t))return;let n=o(e,t);if(n===null)return;let r=n.toLowerCase();if(c.has(r))return!0;if(l.has(r))return!1;i(e,t,`Invalid boolean value "${n}" for data-${t}. Expected: true/false/1/0/yes/no or empty.`)}function d(e,t){let n=o(e,t);if(n===null||n===``)return;let r=Number(n);if(Number.isNaN(r)||!Number.isFinite(r)){i(e,t,`Invalid number value "${n}" for data-${t}.`);return}return r}function f(e,t,n){let r=o(e,t);if(r!==null){if(n.includes(r))return r;i(e,t,`Invalid value "${r}" for data-${t}. Expected one of: ${n.join(`, `)}.`)}}let p=0;const m=(e,t)=>e.id||=`${t}-${++p}`,h=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))};function g(e,t,n,r){return e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)}const _=(e,t,n)=>e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:n}));let v=0,y=``,b=``;function x(){if(v===0){let e=window.innerWidth-document.documentElement.clientWidth;y=document.body.style.overflow,b=document.body.style.paddingRight;let t=parseFloat(getComputedStyle(document.body).paddingRight)||0;document.body.style.paddingRight=`${t+e}px`,document.body.style.overflow=`hidden`}v++}function S(){v=Math.max(0,v-1),v===0&&(document.body.style.overflow=y,document.body.style.paddingRight=b)}const C=[`top`,`right`,`bottom`,`left`],w=[`start`,`center`,`end`],T={top:`bottom`,bottom:`top`,left:`right`,right:`left`};function E(n,r={}){let i=e(n,`dropdown-menu-trigger`),a=e(n,`dropdown-menu-content`);if(!i||!a)throw Error(`DropdownMenu requires trigger and content slots`);let o=r.defaultOpen??u(n,`defaultOpen`)??!1,s=r.onOpenChange,c=r.onSelect,l=r.closeOnClickOutside??u(n,`closeOnClickOutside`)??!0,p=r.closeOnEscape??u(n,`closeOnEscape`)??!0,v=r.closeOnSelect??u(n,`closeOnSelect`)??!0,y=r.side??f(a,`side`,C)??f(n,`side`,C)??`bottom`,b=r.align??f(a,`align`,w)??f(n,`align`,w)??`start`,E=r.sideOffset??d(a,`sideOffset`)??d(n,`sideOffset`)??4,O=r.alignOffset??d(a,`alignOffset`)??d(n,`alignOffset`)??0,ee=r.avoidCollisions??u(a,`avoidCollisions`)??u(n,`avoidCollisions`)??!0,k=r.collisionPadding??d(a,`collisionPadding`)??d(n,`collisionPadding`)??8,A=r.lockScroll??u(n,`lockScroll`)??!0,j=!1,M=null,N=-1,P=``,F=null,I=!1,L=[],R=!1,z=[],B=[],V=new Map,H=null,U=[],W=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,G=m(i,`dropdown-menu-trigger`),te=m(a,`dropdown-menu-content`);i.setAttribute(`aria-haspopup`,`menu`),i.setAttribute(`aria-controls`,te),a.setAttribute(`role`,`menu`),a.setAttribute(`aria-labelledby`,G),a.tabIndex=-1;let ne=()=>{z=t(a,`dropdown-menu-item`);for(let e of z)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;B=z.filter(e=>!W(e)),V=new Map(B.map((e,t)=>[e,t]))},K=(e,t,n,r)=>{let i=0,a=0;return e===`top`?a=n.top-r.height-E:e===`bottom`?a=n.bottom+E:i=e===`left`?n.left-r.width-E:n.right+E,e===`top`||e===`bottom`?i=t===`start`?n.left+O:t===`center`?n.left+n.width/2-r.width/2+O:n.right-r.width-O:a=t===`start`?n.top+O:t===`center`?n.top+n.height/2-r.height/2+O:n.bottom-r.height-O,{x:i,y:a}},q=()=>{let e=i.getBoundingClientRect(),t=a.getBoundingClientRect(),n=window.innerWidth,r=window.innerHeight,o=y,s=K(o,b,e,t);if(ee){let i=(e,i)=>e===`top`?i.y<k:e===`bottom`?i.y+t.height>r-k:e===`left`?i.x<k:i.x+t.width>n-k;if(i(o,s)){let n=T[o],r=K(n,b,e,t);i(n,r)||(o=n,s=r)}s.x<k?s.x=k:s.x+t.width>n-k&&(s.x=n-t.width-k),s.y<k?s.y=k:s.y+t.height>r-k&&(s.y=r-t.height-k)}a.style.position=`fixed`,a.style.top=`${s.y}px`,a.style.left=`${s.x}px`,a.style.margin=`0`,a.setAttribute(`data-side`,o),a.setAttribute(`data-align`,b)},re=()=>{H===null&&(H=requestAnimationFrame(()=>{H=null,j&&q()}))},J=()=>{H!==null&&(cancelAnimationFrame(H),H=null),U.forEach(e=>e()),U.length=0},ie=()=>{if(U.length>0)return;let e=()=>re();window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),U.push(()=>window.removeEventListener(`resize`,e),()=>window.removeEventListener(`scroll`,e,!0));let t=new ResizeObserver(e);t.observe(i),t.observe(a),U.push(()=>t.disconnect())},Y=(e,t=!0)=>{for(let n=0;n<B.length;n++){let r=B[n];n===e?(r.setAttribute(`data-highlighted`,``),t&&r.focus()):r.removeAttribute(`data-highlighted`)}N=e},X=()=>{for(let e of z)e.removeAttribute(`data-highlighted`);N=-1},Z=e=>{n.setAttribute(`data-state`,e),a.setAttribute(`data-state`,e)},Q=e=>{j!==e&&(e?(M=document.activeElement,j=!0,h(i,`expanded`,!0),a.hidden=!1,Z(`open`),A&&!R&&(x(),R=!0),ne(),I=!1,X(),ie(),q(),a.focus()):(j=!1,h(i,`expanded`,!1),a.hidden=!0,Z(`closed`),X(),P=``,I=!1,R&&(S(),R=!1),J(),requestAnimationFrame(()=>{M&&document.contains(M)?M.focus():i&&document.contains(i)&&i.focus(),M=null})),_(n,`dropdown-menu:change`,{open:j}),s?.(j))},$=e=>{if(W(e))return;let t=e.dataset.value||e.textContent?.trim()||``;_(n,`dropdown-menu:select`,{value:t}),c?.(t),v&&Q(!1)},ae=e=>{let t=B.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),I=!0,Y(N===-1?0:(N+1)%t);break;case`ArrowUp`:e.preventDefault(),I=!0,Y(N===-1?t-1:(N-1+t)%t);break;case`Home`:e.preventDefault(),I=!0,Y(0);break;case`End`:e.preventDefault(),I=!0,Y(t-1);break;case`Enter`:case` `:e.preventDefault(),N>=0&&$(B[N]);break;case`Tab`:Q(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),oe(e.key.toLowerCase()))}},oe=e=>{F&&clearTimeout(F),F=setTimeout(()=>{P=``},500),P+=e;let t=B.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(P));if(t===-1&&P.length===1){let n=N+1;for(let r=0;r<B.length;r++){let i=(n+r)%B.length;if((B[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(I=!0,Y(t))};h(i,`expanded`,!1),a.hidden=!0,Z(`closed`),L.push(g(i,`click`,()=>Q(!j)),g(i,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!j&&(e.preventDefault(),Q(!0))})),L.push(g(a,`keydown`,ae),g(a,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),g(a,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(I&&(I=!1,t&&V.get(t)===N))&&t&&!W(t)){let e=V.get(t);e!==void 0&&e!==N&&Y(e,!1)}}),g(a,`pointerleave`,()=>{I||X()})),l&&L.push(g(document,`pointerdown`,e=>{let t=e.target;j&&!n.contains(t)&&!a.contains(t)&&Q(!1)})),p&&L.push(g(document,`keydown`,e=>{j&&e.key===`Escape`&&(e.preventDefault(),Q(!1))})),L.push(g(n,`dropdown-menu:set`,e=>{let t=e.detail,n;t?.open===void 0?t?.value!==void 0&&(n=t.value):n=t.open,typeof n==`boolean`&&Q(n)}));let se={open:()=>Q(!0),close:()=>Q(!1),toggle:()=>Q(!j),get isOpen(){return j},destroy:()=>{F&&clearTimeout(F),J(),R&&(S(),R=!1),L.forEach(e=>e()),L.length=0,D.delete(n)}};return o&&Q(!0),se}const D=new WeakSet;function O(e=document){let t=[];for(let r of n(e,`dropdown-menu`)){if(D.has(r))continue;D.add(r),t.push(E(r))}return t}export{O as create,E as createDropdownMenu};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-slot/dropdown-menu",
3
- "version": "0.2.16",
3
+ "version": "0.2.18",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.cjs",