@data-slot/dropdown-menu 0.2.120 → 0.2.121

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/README.md CHANGED
@@ -90,7 +90,7 @@ controller.destroy();
90
90
  | `data-variant` | `default`, `destructive` | Item variant for styling |
91
91
  | `data-inset` | - | Adds left padding for alignment |
92
92
  | `data-disabled` | - | Disables the item |
93
- | `data-highlighted` | - | Currently focused item |
93
+ | `data-highlighted` | - | Focused/highlighted item |
94
94
  | `data-value` | string | Optional value for item selection |
95
95
 
96
96
  ## Keyboard Navigation
@@ -161,6 +161,8 @@ interface DropdownMenuOptions {
161
161
  closeOnEscape?: boolean;
162
162
  /** Close when an item is selected (default: true) */
163
163
  closeOnSelect?: boolean;
164
+ /** Highlight and focus items on pointer hover (default: true) */
165
+ highlightItemOnHover?: boolean;
164
166
 
165
167
  // Positioning options (Radix-compatible)
166
168
  /** Preferred side of trigger: "top" | "right" | "bottom" | "left" (default: "bottom") */
@@ -195,6 +197,7 @@ Placement attributes (`data-side`, `data-align`, `data-side-offset`, `data-align
195
197
  | `data-close-on-click-outside` | boolean | `true` | Close when clicking outside |
196
198
  | `data-close-on-escape` | boolean | `true` | Close when pressing Escape |
197
199
  | `data-close-on-select` | boolean | `true` | Close when an item is selected |
200
+ | `data-highlight-item-on-hover` | boolean | `true` | Highlight and focus items on pointer hover |
198
201
  | `data-side` | string | `"bottom"` | Preferred side: top, right, bottom, left |
199
202
  | `data-align` | string | `"start"` | Alignment: start, center, end |
200
203
  | `data-side-offset` | number | `4` | Distance from trigger in px |
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@data-slot/core`);const t=[`top`,`right`,`bottom`,`left`],n=[`start`,`center`,`end`];function r(r,a={}){let o=(0,e.getPart)(r,`dropdown-menu-trigger`),s=(0,e.getPart)(r,`dropdown-menu-content`),c=(0,e.getPart)(r,`dropdown-menu-positioner`),l=c&&s&&c.contains(s)?c:null,u=(0,e.getPart)(r,`dropdown-menu-portal`),d=u&&l&&u.contains(l)?u:null;if(!o||!s)throw Error(`DropdownMenu requires trigger and content slots`);let f=a.defaultOpen??(0,e.getDataBool)(r,`defaultOpen`)??!1,p=a.onOpenChange,m=a.onSelect,h=a.closeOnClickOutside??(0,e.getDataBool)(r,`closeOnClickOutside`)??!0,g=a.closeOnEscape??(0,e.getDataBool)(r,`closeOnEscape`)??!0,_=a.closeOnSelect??(0,e.getDataBool)(r,`closeOnSelect`)??!0,v=(t,n)=>(0,e.getDataEnum)(s,t,n)??(l?(0,e.getDataEnum)(l,t,n):void 0)??(0,e.getDataEnum)(r,t,n),y=t=>(0,e.getDataNumber)(s,t)??(l?(0,e.getDataNumber)(l,t):void 0)??(0,e.getDataNumber)(r,t),b=t=>(0,e.getDataBool)(s,t)??(l?(0,e.getDataBool)(l,t):void 0)??(0,e.getDataBool)(r,t),x=a.side??v(`side`,t)??`bottom`,S=a.align??v(`align`,n)??`start`,C=a.sideOffset??y(`sideOffset`)??4,w=a.alignOffset??y(`alignOffset`)??0,T=a.avoidCollisions??b(`avoidCollisions`)??!0,E=a.collisionPadding??y(`collisionPadding`)??8,D=a.lockScroll??(0,e.getDataBool)(r,`lockScroll`)??!0,O=!1,k=null,A=-1,j=``,M=null,N=!1,P=[],F=!1,I=(0,e.createPortalLifecycle)({content:s,root:r,wrapperSlot:l?void 0:`dropdown-menu-positioner`,container:l??void 0,mountTarget:l?d??l:void 0}),L=!1,R=[],z=[],B=new Map,V=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,H=(0,e.ensureId)(o,`dropdown-menu-trigger`),U=(0,e.ensureId)(s,`dropdown-menu-content`);o.setAttribute(`aria-haspopup`,`menu`),o.setAttribute(`aria-controls`,U),s.setAttribute(`role`,`menu`),s.setAttribute(`aria-labelledby`,H),s.tabIndex=-1;let W=()=>{R=(0,e.getParts)(s,`dropdown-menu-item`);for(let e of R)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;z=R.filter(e=>!V(e)),B=new Map(z.map((e,t)=>[e,t]))},G=()=>{let t=I.container,n=r.ownerDocument.defaultView??window,i=o.getBoundingClientRect(),a=(0,e.computeFloatingPosition)({anchorRect:i,contentRect:(0,e.measurePopupContentRect)(s),side:x,align:S,sideOffset:C,alignOffset:w,avoidCollisions:T,collisionPadding:E}),c=(0,e.computeFloatingTransformOrigin)({side:a.side,align:a.align,anchorRect:i,popupX:a.x,popupY:a.y});D?(t.style.position=`fixed`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${a.x}px, ${a.y}px, 0)`):(t.style.position=`absolute`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${a.x+n.scrollX}px, ${a.y+n.scrollY}px, 0)`),t.style.setProperty(`--transform-origin`,c),t.style.willChange=`transform`,t.style.margin=`0`,s.setAttribute(`data-side`,a.side),s.setAttribute(`data-align`,a.align),t!==s&&(t.setAttribute(`data-side`,a.side),t.setAttribute(`data-align`,a.align))},K=(0,e.createPositionSync)({observedElements:[o,s],isActive:()=>O,ancestorScroll:D,onUpdate:G}),q=(t,n=!0)=>{for(let r=0;r<z.length;r++){let i=z[r];r===t?(i.setAttribute(`data-highlighted`,``),(0,e.ensureItemVisibleInContainer)(i,s),n&&i.focus()):i.removeAttribute(`data-highlighted`)}A=t},J=()=>{for(let e of R)e.removeAttribute(`data-highlighted`);A=-1},Y=e=>{r.setAttribute(`data-state`,e),s.setAttribute(`data-state`,e),e===`open`?(r.setAttribute(`data-open`,``),s.setAttribute(`data-open`,``),r.removeAttribute(`data-closed`),s.removeAttribute(`data-closed`)):(r.setAttribute(`data-closed`,``),s.setAttribute(`data-closed`,``),r.removeAttribute(`data-open`),s.removeAttribute(`data-open`))},X=()=>{requestAnimationFrame(()=>{k&&document.contains(k)?(0,e.focusElement)(k):o&&document.contains(o)&&(0,e.focusElement)(o),k=null})},Z=(0,e.createPresenceLifecycle)({element:s,onExitComplete:()=>{L||(I.restore(),s.hidden=!0,X())}}),Q=t=>{O!==t&&(t?(k=document.activeElement,O=!0,(0,e.setAria)(o,`expanded`,!0),I.mount(),s.hidden=!1,Y(`open`),Z.enter(),D&&!F&&((0,e.lockScroll)(),F=!0),W(),N=!1,J(),K.start(),G(),K.update(),s.focus()):(O=!1,(0,e.setAria)(o,`expanded`,!1),Y(`closed`),J(),j=``,N=!1,F&&=((0,e.unlockScroll)(),!1),K.stop(),Z.exit()),(0,e.emit)(r,`dropdown-menu:change`,{open:O}),p?.(O))},$=t=>{if(V(t))return;let n=t.dataset.value||t.textContent?.trim()||``;(0,e.emit)(r,`dropdown-menu:select`,{value:n}),m?.(n),_&&Q(!1)},ee=e=>{let t=z.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),N=!0,q(A===-1?0:(A+1)%t);break;case`ArrowUp`:e.preventDefault(),N=!0,q(A===-1?t-1:(A-1+t)%t);break;case`Home`:e.preventDefault(),N=!0,q(0);break;case`End`:e.preventDefault(),N=!0,q(t-1);break;case`Enter`:case` `:e.preventDefault(),A>=0&&$(z[A]);break;case`Tab`:Q(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),te(e.key.toLowerCase()))}},te=e=>{M&&clearTimeout(M),M=setTimeout(()=>{j=``},500),j+=e;let t=z.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(j));if(t===-1&&j.length===1){let n=A+1;for(let r=0;r<z.length;r++){let i=(n+r)%z.length;if((z[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(N=!0,q(t))};return(0,e.setAria)(o,`expanded`,!1),s.hidden=!0,Y(`closed`),P.push((0,e.on)(o,`click`,()=>Q(!O)),(0,e.on)(o,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!O&&(e.preventDefault(),Q(!0))})),P.push((0,e.on)(s,`keydown`,ee),(0,e.on)(s,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),(0,e.on)(s,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(N&&(N=!1,t&&B.get(t)===A)))if(t&&!V(t)){let e=B.get(t);e!==void 0&&e!==A&&q(e,!1)}else J()}),(0,e.on)(s,`pointerleave`,()=>{N||J()})),P.push((0,e.createDismissLayer)({root:r,isOpen:()=>O,onDismiss:()=>Q(!1),closeOnClickOutside:h,closeOnEscape:g})),P.push((0,e.on)(r,`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)})),f&&Q(!0),{open:()=>Q(!0),close:()=>Q(!1),toggle:()=>Q(!O),get isOpen(){return O},destroy:()=>{L=!0,M&&clearTimeout(M),K.stop(),Z.cleanup(),I.cleanup(),F&&=((0,e.unlockScroll)(),!1),P.forEach(e=>e()),P.length=0,i.delete(r)}}}const i=new WeakSet;function a(t=document){let n=[];for(let a of(0,e.getRoots)(t,`dropdown-menu`))i.has(a)||(i.add(a),n.push(r(a)));return n}exports.create=a,exports.createDropdownMenu=r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@data-slot/core`);const t=[`top`,`right`,`bottom`,`left`],n=[`start`,`center`,`end`];function r(r,a={}){let o=(0,e.getPart)(r,`dropdown-menu-trigger`),s=(0,e.getPart)(r,`dropdown-menu-content`),c=(0,e.getPart)(r,`dropdown-menu-positioner`),l=c&&s&&c.contains(s)?c:null,u=(0,e.getPart)(r,`dropdown-menu-portal`),d=u&&l&&u.contains(l)?u:null;if(!o||!s)throw Error(`DropdownMenu requires trigger and content slots`);let ee=a.defaultOpen??(0,e.getDataBool)(r,`defaultOpen`)??!1,f=a.onOpenChange,te=a.onSelect,p=a.closeOnClickOutside??(0,e.getDataBool)(r,`closeOnClickOutside`)??!0,m=a.closeOnEscape??(0,e.getDataBool)(r,`closeOnEscape`)??!0,h=a.closeOnSelect??(0,e.getDataBool)(r,`closeOnSelect`)??!0,g=(t,n)=>(0,e.getDataEnum)(s,t,n)??(l?(0,e.getDataEnum)(l,t,n):void 0)??(0,e.getDataEnum)(r,t,n),_=t=>(0,e.getDataNumber)(s,t)??(l?(0,e.getDataNumber)(l,t):void 0)??(0,e.getDataNumber)(r,t),v=t=>(0,e.getDataBool)(s,t)??(l?(0,e.getDataBool)(l,t):void 0)??(0,e.getDataBool)(r,t),y=a.side??g(`side`,t)??`bottom`,b=a.align??g(`align`,n)??`start`,x=a.sideOffset??_(`sideOffset`)??4,ne=a.alignOffset??_(`alignOffset`)??0,S=a.avoidCollisions??v(`avoidCollisions`)??!0,C=a.collisionPadding??_(`collisionPadding`)??8,w=a.lockScroll??(0,e.getDataBool)(r,`lockScroll`)??!0,T=a.highlightItemOnHover??(0,e.getDataBool)(r,`highlightItemOnHover`)??!0,E=!1,D=null,O=-1,k=``,A=null,j=!1,M=[],N=!1,P=(0,e.createPortalLifecycle)({content:s,root:r,wrapperSlot:l?void 0:`dropdown-menu-positioner`,container:l??void 0,mountTarget:l?d??l:void 0}),F=!1,I=[],L=[],R=new Map,z=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,B=e=>e.pointerType!==`touch`,V=(0,e.ensureId)(o,`dropdown-menu-trigger`),H=(0,e.ensureId)(s,`dropdown-menu-content`);o.setAttribute(`aria-haspopup`,`menu`),o.setAttribute(`aria-controls`,H),s.setAttribute(`role`,`menu`),s.setAttribute(`aria-labelledby`,V),s.tabIndex=-1;let U=()=>{I=(0,e.getParts)(s,`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=>!z(e)),R=new Map(L.map((e,t)=>[e,t]))},W=()=>{let t=P.container,n=r.ownerDocument.defaultView??window,i=o.getBoundingClientRect(),a=(0,e.computeFloatingPosition)({anchorRect:i,contentRect:(0,e.measurePopupContentRect)(s),side:y,align:b,sideOffset:x,alignOffset:ne,avoidCollisions:S,collisionPadding:C}),c=(0,e.computeFloatingTransformOrigin)({side:a.side,align:a.align,anchorRect:i,popupX:a.x,popupY:a.y});w?(t.style.position=`fixed`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${a.x}px, ${a.y}px, 0)`):(t.style.position=`absolute`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${a.x+n.scrollX}px, ${a.y+n.scrollY}px, 0)`),t.style.setProperty(`--transform-origin`,c),t.style.willChange=`transform`,t.style.margin=`0`,s.setAttribute(`data-side`,a.side),s.setAttribute(`data-align`,a.align),t!==s&&(t.setAttribute(`data-side`,a.side),t.setAttribute(`data-align`,a.align))},G=(0,e.createPositionSync)({observedElements:[o,s],isActive:()=>E,ancestorScroll:w,onUpdate:W}),K=(t,n=!0)=>{for(let r=0;r<L.length;r++){let i=L[r];r===t?(i.setAttribute(`data-highlighted`,``),(0,e.ensureItemVisibleInContainer)(i,s),n&&i.focus()):i.removeAttribute(`data-highlighted`)}O=t},q=()=>{for(let e of I)e.removeAttribute(`data-highlighted`);O=-1},J=()=>{q(),(0,e.focusElement)(s)},Y=e=>{r.setAttribute(`data-state`,e),s.setAttribute(`data-state`,e),e===`open`?(r.setAttribute(`data-open`,``),s.setAttribute(`data-open`,``),r.removeAttribute(`data-closed`),s.removeAttribute(`data-closed`)):(r.setAttribute(`data-closed`,``),s.setAttribute(`data-closed`,``),r.removeAttribute(`data-open`),s.removeAttribute(`data-open`))},X=()=>{requestAnimationFrame(()=>{D&&document.contains(D)?(0,e.focusElement)(D):o&&document.contains(o)&&(0,e.focusElement)(o),D=null})},Z=(0,e.createPresenceLifecycle)({element:s,onExitComplete:()=>{F||(P.restore(),s.hidden=!0,X())}}),Q=t=>{E!==t&&(t?(D=document.activeElement,E=!0,(0,e.setAria)(o,`expanded`,!0),P.mount(),s.hidden=!1,Y(`open`),Z.enter(),w&&!N&&((0,e.lockScroll)(),N=!0),U(),j=!1,q(),G.start(),W(),G.update(),s.focus()):(E=!1,(0,e.setAria)(o,`expanded`,!1),Y(`closed`),q(),k=``,j=!1,N&&=((0,e.unlockScroll)(),!1),G.stop(),Z.exit()),(0,e.emit)(r,`dropdown-menu:change`,{open:E}),f?.(E))},$=t=>{if(z(t))return;let n=t.dataset.value||t.textContent?.trim()||``;(0,e.emit)(r,`dropdown-menu:select`,{value:n}),te?.(n),h&&Q(!1)},re=e=>{let t=L.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),j=!0,K(O===-1?0:(O+1)%t);break;case`ArrowUp`:e.preventDefault(),j=!0,K(O===-1?t-1:(O-1+t)%t);break;case`Home`:e.preventDefault(),j=!0,K(0);break;case`End`:e.preventDefault(),j=!0,K(t-1);break;case`Enter`:case` `:e.preventDefault(),O>=0&&$(L[O]);break;case`Tab`:Q(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),ie(e.key.toLowerCase()))}},ie=e=>{A&&clearTimeout(A),A=setTimeout(()=>{k=``},500),k+=e;let t=L.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(k));if(t===-1&&k.length===1){let n=O+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&&(j=!0,K(t))};return(0,e.setAria)(o,`expanded`,!1),s.hidden=!0,Y(`closed`),M.push((0,e.on)(o,`click`,()=>Q(!E)),(0,e.on)(o,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!E&&(e.preventDefault(),Q(!0))})),M.push((0,e.on)(s,`keydown`,re),(0,e.on)(s,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),(0,e.on)(s,`pointermove`,e=>{if(!T||!B(e))return;let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(j&&(j=!1,t&&R.get(t)===O)))if(t&&!z(t)){let e=R.get(t);e!==void 0&&e!==O&&K(e,!0)}else J()}),(0,e.on)(s,`pointerleave`,e=>{!T||!B(e)||j||J()})),M.push((0,e.createDismissLayer)({root:r,isOpen:()=>E,onDismiss:()=>Q(!1),closeOnClickOutside:p,closeOnEscape:m})),M.push((0,e.on)(r,`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)})),ee&&Q(!0),{open:()=>Q(!0),close:()=>Q(!1),toggle:()=>Q(!E),get isOpen(){return E},destroy:()=>{F=!0,A&&clearTimeout(A),G.stop(),Z.cleanup(),P.cleanup(),N&&=((0,e.unlockScroll)(),!1),M.forEach(e=>e()),M.length=0,i.delete(r)}}}const i=new WeakSet;function a(t=document){let n=[];for(let a of(0,e.getRoots)(t,`dropdown-menu`))i.has(a)||(i.add(a),n.push(r(a)));return n}exports.create=a,exports.createDropdownMenu=r;
package/dist/index.d.cts CHANGED
@@ -53,6 +53,11 @@ interface DropdownMenuOptions {
53
53
  * @default true
54
54
  */
55
55
  lockScroll?: boolean;
56
+ /**
57
+ * Whether moving the pointer over items should highlight and focus them.
58
+ * @default true
59
+ */
60
+ highlightItemOnHover?: boolean;
56
61
  }
57
62
  interface DropdownMenuController {
58
63
  /** Open the dropdown menu */
package/dist/index.d.ts CHANGED
@@ -53,6 +53,11 @@ interface DropdownMenuOptions {
53
53
  * @default true
54
54
  */
55
55
  lockScroll?: boolean;
56
+ /**
57
+ * Whether moving the pointer over items should highlight and focus them.
58
+ * @default true
59
+ */
60
+ highlightItemOnHover?: boolean;
56
61
  }
57
62
  interface DropdownMenuController {
58
63
  /** Open the dropdown menu */
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- import{computeFloatingPosition as e,computeFloatingTransformOrigin as t,createDismissLayer as n,createPortalLifecycle as r,createPositionSync as i,createPresenceLifecycle as a,emit as o,ensureId as s,ensureItemVisibleInContainer as ee,focusElement as c,getDataBool as l,getDataEnum as u,getDataNumber as d,getPart as f,getParts as te,getRoots as p,lockScroll as ne,measurePopupContentRect as m,on as h,setAria as g,unlockScroll as _}from"@data-slot/core";const re=[`top`,`right`,`bottom`,`left`],ie=[`start`,`center`,`end`];function v(p,v={}){let b=f(p,`dropdown-menu-trigger`),x=f(p,`dropdown-menu-content`),S=f(p,`dropdown-menu-positioner`),C=S&&x&&S.contains(x)?S:null,w=f(p,`dropdown-menu-portal`),ae=w&&C&&w.contains(C)?w:null;if(!b||!x)throw Error(`DropdownMenu requires trigger and content slots`);let T=v.defaultOpen??l(p,`defaultOpen`)??!1,E=v.onOpenChange,oe=v.onSelect,se=v.closeOnClickOutside??l(p,`closeOnClickOutside`)??!0,D=v.closeOnEscape??l(p,`closeOnEscape`)??!0,O=v.closeOnSelect??l(p,`closeOnSelect`)??!0,k=(e,t)=>u(x,e,t)??(C?u(C,e,t):void 0)??u(p,e,t),A=e=>d(x,e)??(C?d(C,e):void 0)??d(p,e),ce=e=>l(x,e)??(C?l(C,e):void 0)??l(p,e),le=v.side??k(`side`,re)??`bottom`,ue=v.align??k(`align`,ie)??`start`,de=v.sideOffset??A(`sideOffset`)??4,fe=v.alignOffset??A(`alignOffset`)??0,pe=v.avoidCollisions??ce(`avoidCollisions`)??!0,me=v.collisionPadding??A(`collisionPadding`)??8,j=v.lockScroll??l(p,`lockScroll`)??!0,M=!1,N=null,P=-1,F=``,I=null,L=!1,R=[],z=!1,B=r({content:x,root:p,wrapperSlot:C?void 0:`dropdown-menu-positioner`,container:C??void 0,mountTarget:C?ae??C:void 0}),V=!1,H=[],U=[],W=new Map,G=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,he=s(b,`dropdown-menu-trigger`),ge=s(x,`dropdown-menu-content`);b.setAttribute(`aria-haspopup`,`menu`),b.setAttribute(`aria-controls`,ge),x.setAttribute(`role`,`menu`),x.setAttribute(`aria-labelledby`,he),x.tabIndex=-1;let _e=()=>{H=te(x,`dropdown-menu-item`);for(let e of H)e.setAttribute(`role`,`menuitem`),e.hasAttribute(`data-disabled`)||e.hasAttribute(`disabled`)?e.setAttribute(`aria-disabled`,`true`):e.removeAttribute(`aria-disabled`),e.tabIndex=-1;U=H.filter(e=>!G(e)),W=new Map(U.map((e,t)=>[e,t]))},K=()=>{let n=B.container,r=p.ownerDocument.defaultView??window,i=b.getBoundingClientRect(),a=e({anchorRect:i,contentRect:m(x),side:le,align:ue,sideOffset:de,alignOffset:fe,avoidCollisions:pe,collisionPadding:me}),o=t({side:a.side,align:a.align,anchorRect:i,popupX:a.x,popupY:a.y});j?(n.style.position=`fixed`,n.style.top=`0px`,n.style.left=`0px`,n.style.transform=`translate3d(${a.x}px, ${a.y}px, 0)`):(n.style.position=`absolute`,n.style.top=`0px`,n.style.left=`0px`,n.style.transform=`translate3d(${a.x+r.scrollX}px, ${a.y+r.scrollY}px, 0)`),n.style.setProperty(`--transform-origin`,o),n.style.willChange=`transform`,n.style.margin=`0`,x.setAttribute(`data-side`,a.side),x.setAttribute(`data-align`,a.align),n!==x&&(n.setAttribute(`data-side`,a.side),n.setAttribute(`data-align`,a.align))},q=i({observedElements:[b,x],isActive:()=>M,ancestorScroll:j,onUpdate:K}),J=(e,t=!0)=>{for(let n=0;n<U.length;n++){let r=U[n];n===e?(r.setAttribute(`data-highlighted`,``),ee(r,x),t&&r.focus()):r.removeAttribute(`data-highlighted`)}P=e},Y=()=>{for(let e of H)e.removeAttribute(`data-highlighted`);P=-1},X=e=>{p.setAttribute(`data-state`,e),x.setAttribute(`data-state`,e),e===`open`?(p.setAttribute(`data-open`,``),x.setAttribute(`data-open`,``),p.removeAttribute(`data-closed`),x.removeAttribute(`data-closed`)):(p.setAttribute(`data-closed`,``),x.setAttribute(`data-closed`,``),p.removeAttribute(`data-open`),x.removeAttribute(`data-open`))},ve=()=>{requestAnimationFrame(()=>{N&&document.contains(N)?c(N):b&&document.contains(b)&&c(b),N=null})},Z=a({element:x,onExitComplete:()=>{V||(B.restore(),x.hidden=!0,ve())}}),Q=e=>{M!==e&&(e?(N=document.activeElement,M=!0,g(b,`expanded`,!0),B.mount(),x.hidden=!1,X(`open`),Z.enter(),j&&!z&&(ne(),z=!0),_e(),L=!1,Y(),q.start(),K(),q.update(),x.focus()):(M=!1,g(b,`expanded`,!1),X(`closed`),Y(),F=``,L=!1,z&&=(_(),!1),q.stop(),Z.exit()),o(p,`dropdown-menu:change`,{open:M}),E?.(M))},$=e=>{if(G(e))return;let t=e.dataset.value||e.textContent?.trim()||``;o(p,`dropdown-menu:select`,{value:t}),oe?.(t),O&&Q(!1)},ye=e=>{let t=U.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),L=!0,J(P===-1?0:(P+1)%t);break;case`ArrowUp`:e.preventDefault(),L=!0,J(P===-1?t-1:(P-1+t)%t);break;case`Home`:e.preventDefault(),L=!0,J(0);break;case`End`:e.preventDefault(),L=!0,J(t-1);break;case`Enter`:case` `:e.preventDefault(),P>=0&&$(U[P]);break;case`Tab`:Q(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),be(e.key.toLowerCase()))}},be=e=>{I&&clearTimeout(I),I=setTimeout(()=>{F=``},500),F+=e;let t=U.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(F));if(t===-1&&F.length===1){let n=P+1;for(let r=0;r<U.length;r++){let i=(n+r)%U.length;if((U[i].textContent?.trim().toLowerCase()||``).startsWith(e)){t=i;break}}}t!==-1&&(L=!0,J(t))};return g(b,`expanded`,!1),x.hidden=!0,X(`closed`),R.push(h(b,`click`,()=>Q(!M)),h(b,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!M&&(e.preventDefault(),Q(!0))})),R.push(h(x,`keydown`,ye),h(x,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),h(x,`pointermove`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(L&&(L=!1,t&&W.get(t)===P)))if(t&&!G(t)){let e=W.get(t);e!==void 0&&e!==P&&J(e,!1)}else Y()}),h(x,`pointerleave`,()=>{L||Y()})),R.push(n({root:p,isOpen:()=>M,onDismiss:()=>Q(!1),closeOnClickOutside:se,closeOnEscape:D})),R.push(h(p,`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)})),T&&Q(!0),{open:()=>Q(!0),close:()=>Q(!1),toggle:()=>Q(!M),get isOpen(){return M},destroy:()=>{V=!0,I&&clearTimeout(I),q.stop(),Z.cleanup(),B.cleanup(),z&&=(_(),!1),R.forEach(e=>e()),R.length=0,y.delete(p)}}}const y=new WeakSet;function b(e=document){let t=[];for(let n of p(e,`dropdown-menu`))y.has(n)||(y.add(n),t.push(v(n)));return t}export{b as create,v as createDropdownMenu};
1
+ import{computeFloatingPosition as e,computeFloatingTransformOrigin as t,createDismissLayer as n,createPortalLifecycle as r,createPositionSync as i,createPresenceLifecycle as a,emit as o,ensureId as s,ensureItemVisibleInContainer as ee,focusElement as c,getDataBool as l,getDataEnum as u,getDataNumber as d,getPart as f,getParts as te,getRoots as p,lockScroll as ne,measurePopupContentRect as re,on as m,setAria as h,unlockScroll as g}from"@data-slot/core";const ie=[`top`,`right`,`bottom`,`left`],ae=[`start`,`center`,`end`];function _(p,_={}){let y=f(p,`dropdown-menu-trigger`),b=f(p,`dropdown-menu-content`),x=f(p,`dropdown-menu-positioner`),S=x&&b&&x.contains(b)?x:null,C=f(p,`dropdown-menu-portal`),oe=C&&S&&C.contains(S)?C:null;if(!y||!b)throw Error(`DropdownMenu requires trigger and content slots`);let se=_.defaultOpen??l(p,`defaultOpen`)??!1,ce=_.onOpenChange,le=_.onSelect,ue=_.closeOnClickOutside??l(p,`closeOnClickOutside`)??!0,w=_.closeOnEscape??l(p,`closeOnEscape`)??!0,de=_.closeOnSelect??l(p,`closeOnSelect`)??!0,T=(e,t)=>u(b,e,t)??(S?u(S,e,t):void 0)??u(p,e,t),E=e=>d(b,e)??(S?d(S,e):void 0)??d(p,e),fe=e=>l(b,e)??(S?l(S,e):void 0)??l(p,e),pe=_.side??T(`side`,ie)??`bottom`,me=_.align??T(`align`,ae)??`start`,he=_.sideOffset??E(`sideOffset`)??4,ge=_.alignOffset??E(`alignOffset`)??0,_e=_.avoidCollisions??fe(`avoidCollisions`)??!0,D=_.collisionPadding??E(`collisionPadding`)??8,O=_.lockScroll??l(p,`lockScroll`)??!0,k=_.highlightItemOnHover??l(p,`highlightItemOnHover`)??!0,A=!1,j=null,M=-1,N=``,P=null,F=!1,I=[],L=!1,R=r({content:b,root:p,wrapperSlot:S?void 0:`dropdown-menu-positioner`,container:S??void 0,mountTarget:S?oe??S:void 0}),z=!1,B=[],V=[],H=new Map,U=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,W=e=>e.pointerType!==`touch`,ve=s(y,`dropdown-menu-trigger`),ye=s(b,`dropdown-menu-content`);y.setAttribute(`aria-haspopup`,`menu`),y.setAttribute(`aria-controls`,ye),b.setAttribute(`role`,`menu`),b.setAttribute(`aria-labelledby`,ve),b.tabIndex=-1;let be=()=>{B=te(b,`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]))},G=()=>{let n=R.container,r=p.ownerDocument.defaultView??window,i=y.getBoundingClientRect(),a=e({anchorRect:i,contentRect:re(b),side:pe,align:me,sideOffset:he,alignOffset:ge,avoidCollisions:_e,collisionPadding:D}),o=t({side:a.side,align:a.align,anchorRect:i,popupX:a.x,popupY:a.y});O?(n.style.position=`fixed`,n.style.top=`0px`,n.style.left=`0px`,n.style.transform=`translate3d(${a.x}px, ${a.y}px, 0)`):(n.style.position=`absolute`,n.style.top=`0px`,n.style.left=`0px`,n.style.transform=`translate3d(${a.x+r.scrollX}px, ${a.y+r.scrollY}px, 0)`),n.style.setProperty(`--transform-origin`,o),n.style.willChange=`transform`,n.style.margin=`0`,b.setAttribute(`data-side`,a.side),b.setAttribute(`data-align`,a.align),n!==b&&(n.setAttribute(`data-side`,a.side),n.setAttribute(`data-align`,a.align))},K=i({observedElements:[y,b],isActive:()=>A,ancestorScroll:O,onUpdate:G}),q=(e,t=!0)=>{for(let n=0;n<V.length;n++){let r=V[n];n===e?(r.setAttribute(`data-highlighted`,``),ee(r,b),t&&r.focus()):r.removeAttribute(`data-highlighted`)}M=e},J=()=>{for(let e of B)e.removeAttribute(`data-highlighted`);M=-1},Y=()=>{J(),c(b)},X=e=>{p.setAttribute(`data-state`,e),b.setAttribute(`data-state`,e),e===`open`?(p.setAttribute(`data-open`,``),b.setAttribute(`data-open`,``),p.removeAttribute(`data-closed`),b.removeAttribute(`data-closed`)):(p.setAttribute(`data-closed`,``),b.setAttribute(`data-closed`,``),p.removeAttribute(`data-open`),b.removeAttribute(`data-open`))},xe=()=>{requestAnimationFrame(()=>{j&&document.contains(j)?c(j):y&&document.contains(y)&&c(y),j=null})},Z=a({element:b,onExitComplete:()=>{z||(R.restore(),b.hidden=!0,xe())}}),Q=e=>{A!==e&&(e?(j=document.activeElement,A=!0,h(y,`expanded`,!0),R.mount(),b.hidden=!1,X(`open`),Z.enter(),O&&!L&&(ne(),L=!0),be(),F=!1,J(),K.start(),G(),K.update(),b.focus()):(A=!1,h(y,`expanded`,!1),X(`closed`),J(),N=``,F=!1,L&&=(g(),!1),K.stop(),Z.exit()),o(p,`dropdown-menu:change`,{open:A}),ce?.(A))},$=e=>{if(U(e))return;let t=e.dataset.value||e.textContent?.trim()||``;o(p,`dropdown-menu:select`,{value:t}),le?.(t),de&&Q(!1)},Se=e=>{let t=V.length;if(t!==0)switch(e.key){case`ArrowDown`:e.preventDefault(),F=!0,q(M===-1?0:(M+1)%t);break;case`ArrowUp`:e.preventDefault(),F=!0,q(M===-1?t-1:(M-1+t)%t);break;case`Home`:e.preventDefault(),F=!0,q(0);break;case`End`:e.preventDefault(),F=!0,q(t-1);break;case`Enter`:case` `:e.preventDefault(),M>=0&&$(V[M]);break;case`Tab`:Q(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),Ce(e.key.toLowerCase()))}},Ce=e=>{P&&clearTimeout(P),P=setTimeout(()=>{N=``},500),N+=e;let t=V.findIndex(e=>(e.textContent?.trim().toLowerCase()||``).startsWith(N));if(t===-1&&N.length===1){let n=M+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&&(F=!0,q(t))};return h(y,`expanded`,!1),b.hidden=!0,X(`closed`),I.push(m(y,`click`,()=>Q(!A)),m(y,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!A&&(e.preventDefault(),Q(!0))})),I.push(m(b,`keydown`,Se),m(b,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),m(b,`pointermove`,e=>{if(!k||!W(e))return;let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);if(!(F&&(F=!1,t&&H.get(t)===M)))if(t&&!U(t)){let e=H.get(t);e!==void 0&&e!==M&&q(e,!0)}else Y()}),m(b,`pointerleave`,e=>{!k||!W(e)||F||Y()})),I.push(n({root:p,isOpen:()=>A,onDismiss:()=>Q(!1),closeOnClickOutside:ue,closeOnEscape:w})),I.push(m(p,`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)})),se&&Q(!0),{open:()=>Q(!0),close:()=>Q(!1),toggle:()=>Q(!A),get isOpen(){return A},destroy:()=>{z=!0,P&&clearTimeout(P),K.stop(),Z.cleanup(),R.cleanup(),L&&=(g(),!1),I.forEach(e=>e()),I.length=0,v.delete(p)}}}const v=new WeakSet;function y(e=document){let t=[];for(let n of p(e,`dropdown-menu`))v.has(n)||(v.add(n),t.push(_(n)));return t}export{y as create,_ as createDropdownMenu};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-slot/dropdown-menu",
3
- "version": "0.2.120",
3
+ "version": "0.2.121",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "main": "./dist/index.cjs",
@@ -35,6 +35,6 @@
35
35
  ],
36
36
  "license": "MIT",
37
37
  "dependencies": {
38
- "@data-slot/core": "0.2.120"
38
+ "@data-slot/core": "0.2.121"
39
39
  }
40
40
  }