@data-slot/dropdown-menu 0.2.29 → 0.2.31

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(`, `)}.`)}}const p=new WeakMap,m=Symbol.for(`data-slot.portal-owner`),h=(e,t)=>{p.set(e,t),e[m]=t},g=e=>{p.delete(e),delete e[m]};function ee(e,t,n){if(n.portaled)return;let r=(t.ownerDocument??document)?.body;r&&(n.originalParent=e.parentNode,n.originalNextSibling=e.nextSibling,h(e,t),r.appendChild(e),n.portaled=!0)}function _(e,t){if(!t.portaled)return;g(e);let n=t.originalParent,r=t.originalNextSibling;n&&n.isConnected?r&&r.parentNode===n?n.insertBefore(e,r):n.appendChild(e):e.remove(),t.portaled=!1,t.originalParent=null,t.originalNextSibling=null}let v=0;const y=(e,t)=>e.id||=`${t}-${++v}`,b=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))};function x(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}));let C=0,w=``,T=``;function te(){if(C===0){let e=document.documentElement;w=e.style.overflow,T=e.style.scrollbarGutter,e.style.overflow=`hidden`,e.style.scrollbarGutter=`stable`}C++}function E(){if(C=Math.max(0,C-1),C===0){let e=document.documentElement;e.style.overflow=w,e.style.scrollbarGutter=T}}const D=[`top`,`right`,`bottom`,`left`],O=[`start`,`center`,`end`],ne={top:`bottom`,bottom:`top`,left:`right`,right:`left`};function k(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,m=r.closeOnSelect??u(n,`closeOnSelect`)??!0,h=r.side??f(a,`side`,D)??f(n,`side`,D)??`bottom`,g=r.align??f(a,`align`,O)??f(n,`align`,O)??`start`,v=r.sideOffset??d(a,`sideOffset`)??d(n,`sideOffset`)??4,C=r.alignOffset??d(a,`alignOffset`)??d(n,`alignOffset`)??0,w=r.avoidCollisions??u(a,`avoidCollisions`)??u(n,`avoidCollisions`)??!0,T=r.collisionPadding??d(a,`collisionPadding`)??d(n,`collisionPadding`)??8,k=r.lockScroll??u(n,`lockScroll`)??!0,j=!1,M=null,N=-1,P=``,F=null,I=!1,L=[],R=!1,z={originalParent:null,originalNextSibling:null,portaled:!1},B=[],V=[],H=new Map,U=null,W=[],G=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,re=y(i,`dropdown-menu-trigger`),ie=y(a,`dropdown-menu-content`);i.setAttribute(`aria-haspopup`,`menu`),i.setAttribute(`aria-controls`,ie),a.setAttribute(`role`,`menu`),a.setAttribute(`aria-labelledby`,re),a.tabIndex=-1;let ae=()=>{B=t(a,`dropdown-menu-item`);for(let e of B)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;V=B.filter(e=>!G(e)),H=new Map(V.map((e,t)=>[e,t]))},K=(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+C:t===`center`?n.left+n.width/2-r.width/2+C:n.right-r.width-C:a=t===`start`?n.top+C:t===`center`?n.top+n.height/2-r.height/2+C:n.bottom-r.height-C,{x:i,y:a}},q=()=>{let e=i.getBoundingClientRect(),t=a.getBoundingClientRect(),n=window.innerWidth,r=window.innerHeight,o=h,s=K(o,g,e,t);if(w){let i=(e,i)=>e===`top`?i.y<T:e===`bottom`?i.y+t.height>r-T:e===`left`?i.x<T:i.x+t.width>n-T;if(i(o,s)){let n=ne[o],r=K(n,g,e,t);i(n,r)||(o=n,s=r)}s.x<T?s.x=T:s.x+t.width>n-T&&(s.x=n-t.width-T),s.y<T?s.y=T:s.y+t.height>r-T&&(s.y=r-t.height-T)}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`,g)},oe=()=>{U===null&&(U=requestAnimationFrame(()=>{U=null,j&&q()}))},J=()=>{U!==null&&(cancelAnimationFrame(U),U=null),W.forEach(e=>e()),W.length=0},se=()=>{if(W.length>0)return;let e=()=>oe();window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),W.push(()=>window.removeEventListener(`resize`,e),()=>window.removeEventListener(`scroll`,e,!0));let t=new ResizeObserver(e);t.observe(i),t.observe(a),W.push(()=>t.disconnect())},Y=(e,t=!0)=>{for(let n=0;n<V.length;n++){let r=V[n];n===e?(r.setAttribute(`data-highlighted`,``),t&&r.focus()):r.removeAttribute(`data-highlighted`)}N=e},X=()=>{for(let e of B)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,b(i,`expanded`,!0),ee(a,n,z),a.hidden=!1,Z(`open`),k&&!R&&(te(),R=!0),ae(),I=!1,X(),se(),q(),a.focus()):(j=!1,b(i,`expanded`,!1),a.hidden=!0,Z(`closed`),X(),P=``,I=!1,R&&(E(),R=!1),J(),_(a,z),requestAnimationFrame(()=>{M&&document.contains(M)?M.focus():i&&document.contains(i)&&i.focus(),M=null})),S(n,`dropdown-menu:change`,{open:j}),s?.(j))},$=e=>{if(G(e))return;let t=e.dataset.value||e.textContent?.trim()||``;S(n,`dropdown-menu:select`,{value:t}),c?.(t),m&&Q(!1)},ce=e=>{let t=V.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&&$(V[N]);break;case`Tab`:Q(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),le(e.key.toLowerCase()))}},le=e=>{F&&clearTimeout(F),F=setTimeout(()=>{P=``},500),P+=e;let t=V.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(P));if(t===-1&&P.length===1){let n=N+1;for(let r=0;r<V.length;r++){let i=(n+r)%V.length;if((V[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(I=!0,Y(t))};b(i,`expanded`,!1),a.hidden=!0,Z(`closed`),L.push(x(i,`click`,()=>Q(!j)),x(i,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!j&&(e.preventDefault(),Q(!0))})),L.push(x(a,`keydown`,ce),x(a,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),x(a,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(I&&(I=!1,t&&H.get(t)===N)))if(t&&!G(t)){let e=H.get(t);e!==void 0&&e!==N&&Y(e,!1)}else X()}),x(a,`pointerleave`,()=>{I||X()})),l&&L.push(x(document,`pointerdown`,e=>{let t=e.target;j&&!n.contains(t)&&!a.contains(t)&&Q(!1)})),p&&L.push(x(document,`keydown`,e=>{j&&e.key===`Escape`&&(e.preventDefault(),Q(!1))})),L.push(x(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 ue={open:()=>Q(!0),close:()=>Q(!1),toggle:()=>Q(!j),get isOpen(){return j},destroy:()=>{F&&clearTimeout(F),J(),_(a,z),R&&(E(),R=!1),L.forEach(e=>e()),L.length=0,A.delete(n)}};return o&&Q(!0),ue}const A=new WeakSet;function j(e=document){let t=[];for(let r of n(e,`dropdown-menu`)){if(A.has(r))continue;A.add(r),t.push(k(r))}return t}exports.create=j,exports.createDropdownMenu=k;
1
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));const c=s(require(`@data-slot/core`)),l=[`top`,`right`,`bottom`,`left`],u=[`start`,`center`,`end`];function d(e,t={}){let n=(0,c.getPart)(e,`dropdown-menu-trigger`),r=(0,c.getPart)(e,`dropdown-menu-content`);if(!n||!r)throw Error(`DropdownMenu requires trigger and content slots`);let i=t.defaultOpen??(0,c.getDataBool)(e,`defaultOpen`)??!1,a=t.onOpenChange,o=t.onSelect,s=t.closeOnClickOutside??(0,c.getDataBool)(e,`closeOnClickOutside`)??!0,d=t.closeOnEscape??(0,c.getDataBool)(e,`closeOnEscape`)??!0,p=t.closeOnSelect??(0,c.getDataBool)(e,`closeOnSelect`)??!0,m=t.side??(0,c.getDataEnum)(r,`side`,l)??(0,c.getDataEnum)(e,`side`,l)??`bottom`,h=t.align??(0,c.getDataEnum)(r,`align`,u)??(0,c.getDataEnum)(e,`align`,u)??`start`,g=t.sideOffset??(0,c.getDataNumber)(r,`sideOffset`)??(0,c.getDataNumber)(e,`sideOffset`)??4,_=t.alignOffset??(0,c.getDataNumber)(r,`alignOffset`)??(0,c.getDataNumber)(e,`alignOffset`)??0,v=t.avoidCollisions??(0,c.getDataBool)(r,`avoidCollisions`)??(0,c.getDataBool)(e,`avoidCollisions`)??!0,y=t.collisionPadding??(0,c.getDataNumber)(r,`collisionPadding`)??(0,c.getDataNumber)(e,`collisionPadding`)??8,b=t.lockScroll??(0,c.getDataBool)(e,`lockScroll`)??!0,x=!1,S=null,C=-1,w=``,T=null,E=!1,D=[],O=!1,k=(0,c.createPortalLifecycle)({content:r,root:e}),A=[],j=[],M=new Map,N=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,P=(0,c.ensureId)(n,`dropdown-menu-trigger`),F=(0,c.ensureId)(r,`dropdown-menu-content`);n.setAttribute(`aria-haspopup`,`menu`),n.setAttribute(`aria-controls`,F),r.setAttribute(`role`,`menu`),r.setAttribute(`aria-labelledby`,P),r.tabIndex=-1;let I=()=>{A=(0,c.getParts)(r,`dropdown-menu-item`);for(let e of A)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;j=A.filter(e=>!N(e)),M=new Map(j.map((e,t)=>[e,t]))},L=()=>{let t=e.ownerDocument.defaultView??window,i=n.getBoundingClientRect(),a=r.getBoundingClientRect(),o=(0,c.computeFloatingPosition)({anchorRect:i,contentRect:a,side:m,align:h,sideOffset:g,alignOffset:_,avoidCollisions:v,collisionPadding:y});b?(r.style.position=`fixed`,r.style.top=`${o.y}px`,r.style.left=`${o.x}px`):(r.style.position=`absolute`,r.style.top=`${o.y+t.scrollY}px`,r.style.left=`${o.x+t.scrollX}px`),r.style.margin=`0`,r.setAttribute(`data-side`,o.side),r.setAttribute(`data-align`,o.align)},R=(0,c.createPositionSync)({observedElements:[n,r],isActive:()=>x,ancestorScroll:b,onUpdate:L}),z=(e,t=!0)=>{for(let n=0;n<j.length;n++){let i=j[n];n===e?(i.setAttribute(`data-highlighted`,``),(0,c.ensureItemVisibleInContainer)(i,r),t&&i.focus()):i.removeAttribute(`data-highlighted`)}C=e},B=()=>{for(let e of A)e.removeAttribute(`data-highlighted`);C=-1},V=t=>{e.setAttribute(`data-state`,t),r.setAttribute(`data-state`,t)},H=t=>{x!==t&&(t?(S=document.activeElement,x=!0,(0,c.setAria)(n,`expanded`,!0),k.mount(),r.hidden=!1,V(`open`),b&&!O&&((0,c.lockScroll)(),O=!0),I(),E=!1,B(),R.start(),L(),R.update(),r.focus()):(x=!1,(0,c.setAria)(n,`expanded`,!1),k.restore(),r.hidden=!0,V(`closed`),B(),w=``,E=!1,O&&((0,c.unlockScroll)(),O=!1),R.stop(),requestAnimationFrame(()=>{S&&document.contains(S)?S.focus():n&&document.contains(n)&&n.focus(),S=null})),(0,c.emit)(e,`dropdown-menu:change`,{open:x}),a?.(x))},U=t=>{if(N(t))return;let n=t.dataset.value||t.textContent?.trim()||``;(0,c.emit)(e,`dropdown-menu:select`,{value:n}),o?.(n),p&&H(!1)},W=e=>{let t=j.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),E=!0,z(C===-1?0:(C+1)%t);break;case`ArrowUp`:e.preventDefault(),E=!0,z(C===-1?t-1:(C-1+t)%t);break;case`Home`:e.preventDefault(),E=!0,z(0);break;case`End`:e.preventDefault(),E=!0,z(t-1);break;case`Enter`:case` `:e.preventDefault(),C>=0&&U(j[C]);break;case`Tab`:H(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),G(e.key.toLowerCase()))}},G=e=>{T&&clearTimeout(T),T=setTimeout(()=>{w=``},500),w+=e;let t=j.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(w));if(t===-1&&w.length===1){let n=C+1;for(let r=0;r<j.length;r++){let i=(n+r)%j.length;if((j[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(E=!0,z(t))};(0,c.setAria)(n,`expanded`,!1),r.hidden=!0,V(`closed`),D.push((0,c.on)(n,`click`,()=>H(!x)),(0,c.on)(n,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!x&&(e.preventDefault(),H(!0))})),D.push((0,c.on)(r,`keydown`,W),(0,c.on)(r,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&U(t)}),(0,c.on)(r,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(E&&(E=!1,t&&M.get(t)===C)))if(t&&!N(t)){let e=M.get(t);e!==void 0&&e!==C&&z(e,!1)}else B()}),(0,c.on)(r,`pointerleave`,()=>{E||B()})),D.push((0,c.createDismissLayer)({root:e,isOpen:()=>x,onDismiss:()=>H(!1),closeOnClickOutside:s,closeOnEscape:d})),D.push((0,c.on)(e,`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`&&H(n)}));let K={open:()=>H(!0),close:()=>H(!1),toggle:()=>H(!x),get isOpen(){return x},destroy:()=>{T&&clearTimeout(T),R.stop(),k.cleanup(),O&&((0,c.unlockScroll)(),O=!1),D.forEach(e=>e()),D.length=0,f.delete(e)}};return i&&H(!0),K}const f=new WeakSet;function p(e=document){let t=[];for(let n of(0,c.getRoots)(e,`dropdown-menu`)){if(f.has(n))continue;f.add(n),t.push(d(n))}return t}exports.create=p,exports.createDropdownMenu=d;
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(`, `)}.`)}}const p=new WeakMap,m=Symbol.for(`data-slot.portal-owner`),h=(e,t)=>{p.set(e,t),e[m]=t},g=e=>{p.delete(e),delete e[m]};function ee(e,t,n){if(n.portaled)return;let r=(t.ownerDocument??document)?.body;r&&(n.originalParent=e.parentNode,n.originalNextSibling=e.nextSibling,h(e,t),r.appendChild(e),n.portaled=!0)}function _(e,t){if(!t.portaled)return;g(e);let n=t.originalParent,r=t.originalNextSibling;n&&n.isConnected?r&&r.parentNode===n?n.insertBefore(e,r):n.appendChild(e):e.remove(),t.portaled=!1,t.originalParent=null,t.originalNextSibling=null}let v=0;const y=(e,t)=>e.id||=`${t}-${++v}`,b=(e,t,n)=>{n===null?e.removeAttribute(`aria-${t}`):e.setAttribute(`aria-${t}`,String(n))};function x(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}));let C=0,w=``,T=``;function te(){if(C===0){let e=document.documentElement;w=e.style.overflow,T=e.style.scrollbarGutter,e.style.overflow=`hidden`,e.style.scrollbarGutter=`stable`}C++}function E(){if(C=Math.max(0,C-1),C===0){let e=document.documentElement;e.style.overflow=w,e.style.scrollbarGutter=T}}const D=[`top`,`right`,`bottom`,`left`],O=[`start`,`center`,`end`],ne={top:`bottom`,bottom:`top`,left:`right`,right:`left`};function k(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,m=r.closeOnSelect??u(n,`closeOnSelect`)??!0,h=r.side??f(a,`side`,D)??f(n,`side`,D)??`bottom`,g=r.align??f(a,`align`,O)??f(n,`align`,O)??`start`,v=r.sideOffset??d(a,`sideOffset`)??d(n,`sideOffset`)??4,C=r.alignOffset??d(a,`alignOffset`)??d(n,`alignOffset`)??0,w=r.avoidCollisions??u(a,`avoidCollisions`)??u(n,`avoidCollisions`)??!0,T=r.collisionPadding??d(a,`collisionPadding`)??d(n,`collisionPadding`)??8,k=r.lockScroll??u(n,`lockScroll`)??!0,j=!1,M=null,N=-1,P=``,F=null,I=!1,L=[],R=!1,z={originalParent:null,originalNextSibling:null,portaled:!1},B=[],V=[],H=new Map,U=null,W=[],G=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,re=y(i,`dropdown-menu-trigger`),ie=y(a,`dropdown-menu-content`);i.setAttribute(`aria-haspopup`,`menu`),i.setAttribute(`aria-controls`,ie),a.setAttribute(`role`,`menu`),a.setAttribute(`aria-labelledby`,re),a.tabIndex=-1;let ae=()=>{B=t(a,`dropdown-menu-item`);for(let e of B)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;V=B.filter(e=>!G(e)),H=new Map(V.map((e,t)=>[e,t]))},K=(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+C:t===`center`?n.left+n.width/2-r.width/2+C:n.right-r.width-C:a=t===`start`?n.top+C:t===`center`?n.top+n.height/2-r.height/2+C:n.bottom-r.height-C,{x:i,y:a}},q=()=>{let e=i.getBoundingClientRect(),t=a.getBoundingClientRect(),n=window.innerWidth,r=window.innerHeight,o=h,s=K(o,g,e,t);if(w){let i=(e,i)=>e===`top`?i.y<T:e===`bottom`?i.y+t.height>r-T:e===`left`?i.x<T:i.x+t.width>n-T;if(i(o,s)){let n=ne[o],r=K(n,g,e,t);i(n,r)||(o=n,s=r)}s.x<T?s.x=T:s.x+t.width>n-T&&(s.x=n-t.width-T),s.y<T?s.y=T:s.y+t.height>r-T&&(s.y=r-t.height-T)}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`,g)},oe=()=>{U===null&&(U=requestAnimationFrame(()=>{U=null,j&&q()}))},J=()=>{U!==null&&(cancelAnimationFrame(U),U=null),W.forEach(e=>e()),W.length=0},se=()=>{if(W.length>0)return;let e=()=>oe();window.addEventListener(`resize`,e),window.addEventListener(`scroll`,e,!0),W.push(()=>window.removeEventListener(`resize`,e),()=>window.removeEventListener(`scroll`,e,!0));let t=new ResizeObserver(e);t.observe(i),t.observe(a),W.push(()=>t.disconnect())},Y=(e,t=!0)=>{for(let n=0;n<V.length;n++){let r=V[n];n===e?(r.setAttribute(`data-highlighted`,``),t&&r.focus()):r.removeAttribute(`data-highlighted`)}N=e},X=()=>{for(let e of B)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,b(i,`expanded`,!0),ee(a,n,z),a.hidden=!1,Z(`open`),k&&!R&&(te(),R=!0),ae(),I=!1,X(),se(),q(),a.focus()):(j=!1,b(i,`expanded`,!1),a.hidden=!0,Z(`closed`),X(),P=``,I=!1,R&&(E(),R=!1),J(),_(a,z),requestAnimationFrame(()=>{M&&document.contains(M)?M.focus():i&&document.contains(i)&&i.focus(),M=null})),S(n,`dropdown-menu:change`,{open:j}),s?.(j))},$=e=>{if(G(e))return;let t=e.dataset.value||e.textContent?.trim()||``;S(n,`dropdown-menu:select`,{value:t}),c?.(t),m&&Q(!1)},ce=e=>{let t=V.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&&$(V[N]);break;case`Tab`:Q(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),le(e.key.toLowerCase()))}},le=e=>{F&&clearTimeout(F),F=setTimeout(()=>{P=``},500),P+=e;let t=V.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(P));if(t===-1&&P.length===1){let n=N+1;for(let r=0;r<V.length;r++){let i=(n+r)%V.length;if((V[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(I=!0,Y(t))};b(i,`expanded`,!1),a.hidden=!0,Z(`closed`),L.push(x(i,`click`,()=>Q(!j)),x(i,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!j&&(e.preventDefault(),Q(!0))})),L.push(x(a,`keydown`,ce),x(a,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),x(a,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(I&&(I=!1,t&&H.get(t)===N)))if(t&&!G(t)){let e=H.get(t);e!==void 0&&e!==N&&Y(e,!1)}else X()}),x(a,`pointerleave`,()=>{I||X()})),l&&L.push(x(document,`pointerdown`,e=>{let t=e.target;j&&!n.contains(t)&&!a.contains(t)&&Q(!1)})),p&&L.push(x(document,`keydown`,e=>{j&&e.key===`Escape`&&(e.preventDefault(),Q(!1))})),L.push(x(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 ue={open:()=>Q(!0),close:()=>Q(!1),toggle:()=>Q(!j),get isOpen(){return j},destroy:()=>{F&&clearTimeout(F),J(),_(a,z),R&&(E(),R=!1),L.forEach(e=>e()),L.length=0,A.delete(n)}};return o&&Q(!0),ue}const A=new WeakSet;function j(e=document){let t=[];for(let r of n(e,`dropdown-menu`)){if(A.has(r))continue;A.add(r),t.push(k(r))}return t}export{j as create,k as createDropdownMenu};
1
+ import{computeFloatingPosition as e,createDismissLayer as t,createPortalLifecycle as n,createPositionSync as r,emit as i,ensureId as a,ensureItemVisibleInContainer as o,getDataBool as s,getDataEnum as c,getDataNumber as l,getPart as u,getParts as d,getRoots as f,lockScroll as ee,on as p,setAria as m,unlockScroll as h}from"@data-slot/core";const g=[`top`,`right`,`bottom`,`left`],_=[`start`,`center`,`end`];function v(f,v={}){let b=u(f,`dropdown-menu-trigger`),x=u(f,`dropdown-menu-content`);if(!b||!x)throw Error(`DropdownMenu requires trigger and content slots`);let te=v.defaultOpen??s(f,`defaultOpen`)??!1,ne=v.onOpenChange,re=v.onSelect,ie=v.closeOnClickOutside??s(f,`closeOnClickOutside`)??!0,S=v.closeOnEscape??s(f,`closeOnEscape`)??!0,C=v.closeOnSelect??s(f,`closeOnSelect`)??!0,w=v.side??c(x,`side`,g)??c(f,`side`,g)??`bottom`,T=v.align??c(x,`align`,_)??c(f,`align`,_)??`start`,E=v.sideOffset??l(x,`sideOffset`)??l(f,`sideOffset`)??4,D=v.alignOffset??l(x,`alignOffset`)??l(f,`alignOffset`)??0,O=v.avoidCollisions??s(x,`avoidCollisions`)??s(f,`avoidCollisions`)??!0,k=v.collisionPadding??l(x,`collisionPadding`)??l(f,`collisionPadding`)??8,A=v.lockScroll??s(f,`lockScroll`)??!0,j=!1,M=null,N=-1,P=``,F=null,I=!1,L=[],R=!1,z=n({content:x,root:f}),B=[],V=[],H=new Map,U=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,W=a(b,`dropdown-menu-trigger`),G=a(x,`dropdown-menu-content`);b.setAttribute(`aria-haspopup`,`menu`),b.setAttribute(`aria-controls`,G),x.setAttribute(`role`,`menu`),x.setAttribute(`aria-labelledby`,W),x.tabIndex=-1;let K=()=>{B=d(x,`dropdown-menu-item`);for(let e of B)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;V=B.filter(e=>!U(e)),H=new Map(V.map((e,t)=>[e,t]))},q=()=>{let t=f.ownerDocument.defaultView??window,n=b.getBoundingClientRect(),r=x.getBoundingClientRect(),i=e({anchorRect:n,contentRect:r,side:w,align:T,sideOffset:E,alignOffset:D,avoidCollisions:O,collisionPadding:k});A?(x.style.position=`fixed`,x.style.top=`${i.y}px`,x.style.left=`${i.x}px`):(x.style.position=`absolute`,x.style.top=`${i.y+t.scrollY}px`,x.style.left=`${i.x+t.scrollX}px`),x.style.margin=`0`,x.setAttribute(`data-side`,i.side),x.setAttribute(`data-align`,i.align)},J=r({observedElements:[b,x],isActive:()=>j,ancestorScroll:A,onUpdate:q}),Y=(e,t=!0)=>{for(let n=0;n<V.length;n++){let r=V[n];n===e?(r.setAttribute(`data-highlighted`,``),o(r,x),t&&r.focus()):r.removeAttribute(`data-highlighted`)}N=e},X=()=>{for(let e of B)e.removeAttribute(`data-highlighted`);N=-1},Z=e=>{f.setAttribute(`data-state`,e),x.setAttribute(`data-state`,e)},Q=e=>{j!==e&&(e?(M=document.activeElement,j=!0,m(b,`expanded`,!0),z.mount(),x.hidden=!1,Z(`open`),A&&!R&&(ee(),R=!0),K(),I=!1,X(),J.start(),q(),J.update(),x.focus()):(j=!1,m(b,`expanded`,!1),z.restore(),x.hidden=!0,Z(`closed`),X(),P=``,I=!1,R&&(h(),R=!1),J.stop(),requestAnimationFrame(()=>{M&&document.contains(M)?M.focus():b&&document.contains(b)&&b.focus(),M=null})),i(f,`dropdown-menu:change`,{open:j}),ne?.(j))},$=e=>{if(U(e))return;let t=e.dataset.value||e.textContent?.trim()||``;i(f,`dropdown-menu:select`,{value:t}),re?.(t),C&&Q(!1)},ae=e=>{let t=V.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&&$(V[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=V.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(P));if(t===-1&&P.length===1){let n=N+1;for(let r=0;r<V.length;r++){let i=(n+r)%V.length;if((V[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(I=!0,Y(t))};m(b,`expanded`,!1),x.hidden=!0,Z(`closed`),L.push(p(b,`click`,()=>Q(!j)),p(b,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!j&&(e.preventDefault(),Q(!0))})),L.push(p(x,`keydown`,ae),p(x,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),p(x,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(I&&(I=!1,t&&H.get(t)===N)))if(t&&!U(t)){let e=H.get(t);e!==void 0&&e!==N&&Y(e,!1)}else X()}),p(x,`pointerleave`,()=>{I||X()})),L.push(t({root:f,isOpen:()=>j,onDismiss:()=>Q(!1),closeOnClickOutside:ie,closeOnEscape:S})),L.push(p(f,`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.stop(),z.cleanup(),R&&(h(),R=!1),L.forEach(e=>e()),L.length=0,y.delete(f)}};return te&&Q(!0),se}const y=new WeakSet;function b(e=document){let t=[];for(let n of f(e,`dropdown-menu`)){if(y.has(n))continue;y.add(n),t.push(v(n))}return t}export{b as create,v as createDropdownMenu};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-slot/dropdown-menu",
3
- "version": "0.2.29",
3
+ "version": "0.2.31",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.cjs",
@@ -24,9 +24,6 @@
24
24
  "scripts": {
25
25
  "build": "tsdown"
26
26
  },
27
- "devDependencies": {
28
- "@data-slot/core": "workspace:*"
29
- },
30
27
  "repository": {
31
28
  "type": "git",
32
29
  "url": "https://github.com/bejamas/data-slot",
@@ -40,5 +37,8 @@
40
37
  "vanilla",
41
38
  "data-slot"
42
39
  ],
43
- "license": "MIT"
40
+ "license": "MIT",
41
+ "dependencies": {
42
+ "@data-slot/core": "workspace:*"
43
+ }
44
44
  }