@data-slot/dropdown-menu 0.2.91 → 0.2.92
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 +8 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -180,7 +180,14 @@ interface DropdownMenuOptions {
|
|
|
180
180
|
|
|
181
181
|
### Data Attribute Options
|
|
182
182
|
|
|
183
|
-
Options can also be set via data attributes
|
|
183
|
+
Options can also be set via data attributes. JS options take precedence.
|
|
184
|
+
|
|
185
|
+
Placement attributes (`data-side`, `data-align`, `data-side-offset`, `data-align-offset`, `data-avoid-collisions`, `data-collision-padding`) resolve in this order:
|
|
186
|
+
|
|
187
|
+
1. JavaScript option
|
|
188
|
+
2. `dropdown-menu-content`
|
|
189
|
+
3. `dropdown-menu-positioner`
|
|
190
|
+
4. `dropdown-menu` root (fallback)
|
|
184
191
|
|
|
185
192
|
| Attribute | Type | Default | Description |
|
|
186
193
|
|-----------|------|---------|-------------|
|
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=
|
|
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=(0,e.computeFloatingPosition)({anchorRect:o.getBoundingClientRect(),contentRect:(0,e.measurePopupContentRect)(s),side:x,align:S,sideOffset:C,alignOffset:w,avoidCollisions:T,collisionPadding:E});D?(t.style.position=`fixed`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${i.x}px, ${i.y}px, 0)`):(t.style.position=`absolute`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${i.x+n.scrollX}px, ${i.y+n.scrollY}px, 0)`),t.style.willChange=`transform`,t.style.margin=`0`,s.setAttribute(`data-side`,i.side),s.setAttribute(`data-align`,i.align),t!==s&&(t.setAttribute(`data-side`,i.side),t.setAttribute(`data-align`,i.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;
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{computeFloatingPosition as e,createDismissLayer as t,createPortalLifecycle as n,createPositionSync as r,createPresenceLifecycle as i,emit as a,ensureId as o,ensureItemVisibleInContainer as
|
|
1
|
+
import{computeFloatingPosition as e,createDismissLayer as t,createPortalLifecycle as n,createPositionSync as r,createPresenceLifecycle as i,emit as a,ensureId as o,ensureItemVisibleInContainer as ee,focusElement as s,getDataBool as c,getDataEnum as l,getDataNumber as u,getPart as d,getParts as te,getRoots as f,lockScroll as ne,measurePopupContentRect as re,on as p,setAria as m,unlockScroll as h}from"@data-slot/core";const g=[`top`,`right`,`bottom`,`left`],ie=[`start`,`center`,`end`];function _(f,_={}){let y=d(f,`dropdown-menu-trigger`),b=d(f,`dropdown-menu-content`),x=d(f,`dropdown-menu-positioner`),S=x&&b&&x.contains(b)?x:null,C=d(f,`dropdown-menu-portal`),ae=C&&S&&C.contains(S)?C:null;if(!y||!b)throw Error(`DropdownMenu requires trigger and content slots`);let oe=_.defaultOpen??c(f,`defaultOpen`)??!1,se=_.onOpenChange,w=_.onSelect,T=_.closeOnClickOutside??c(f,`closeOnClickOutside`)??!0,ce=_.closeOnEscape??c(f,`closeOnEscape`)??!0,le=_.closeOnSelect??c(f,`closeOnSelect`)??!0,E=(e,t)=>l(b,e,t)??(S?l(S,e,t):void 0)??l(f,e,t),D=e=>u(b,e)??(S?u(S,e):void 0)??u(f,e),ue=e=>c(b,e)??(S?c(S,e):void 0)??c(f,e),de=_.side??E(`side`,g)??`bottom`,fe=_.align??E(`align`,ie)??`start`,pe=_.sideOffset??D(`sideOffset`)??4,O=_.alignOffset??D(`alignOffset`)??0,k=_.avoidCollisions??ue(`avoidCollisions`)??!0,A=_.collisionPadding??D(`collisionPadding`)??8,j=_.lockScroll??c(f,`lockScroll`)??!0,M=!1,N=null,P=-1,F=``,I=null,L=!1,R=[],z=!1,B=n({content:b,root:f,wrapperSlot:S?void 0:`dropdown-menu-positioner`,container:S??void 0,mountTarget:S?ae??S:void 0}),V=!1,H=[],U=[],W=new Map,G=e=>e.hasAttribute(`disabled`)||e.hasAttribute(`data-disabled`)||e.getAttribute(`aria-disabled`)===`true`,me=o(y,`dropdown-menu-trigger`),he=o(b,`dropdown-menu-content`);y.setAttribute(`aria-haspopup`,`menu`),y.setAttribute(`aria-controls`,he),b.setAttribute(`role`,`menu`),b.setAttribute(`aria-labelledby`,me),b.tabIndex=-1;let ge=()=>{H=te(b,`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 t=B.container,n=f.ownerDocument.defaultView??window,r=e({anchorRect:y.getBoundingClientRect(),contentRect:re(b),side:de,align:fe,sideOffset:pe,alignOffset:O,avoidCollisions:k,collisionPadding:A});j?(t.style.position=`fixed`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${r.x}px, ${r.y}px, 0)`):(t.style.position=`absolute`,t.style.top=`0px`,t.style.left=`0px`,t.style.transform=`translate3d(${r.x+n.scrollX}px, ${r.y+n.scrollY}px, 0)`),t.style.willChange=`transform`,t.style.margin=`0`,b.setAttribute(`data-side`,r.side),b.setAttribute(`data-align`,r.align),t!==b&&(t.setAttribute(`data-side`,r.side),t.setAttribute(`data-align`,r.align))},q=r({observedElements:[y,b],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,b),t&&r.focus()):r.removeAttribute(`data-highlighted`)}P=e},Y=()=>{for(let e of H)e.removeAttribute(`data-highlighted`);P=-1},X=e=>{f.setAttribute(`data-state`,e),b.setAttribute(`data-state`,e),e===`open`?(f.setAttribute(`data-open`,``),b.setAttribute(`data-open`,``),f.removeAttribute(`data-closed`),b.removeAttribute(`data-closed`)):(f.setAttribute(`data-closed`,``),b.setAttribute(`data-closed`,``),f.removeAttribute(`data-open`),b.removeAttribute(`data-open`))},_e=()=>{requestAnimationFrame(()=>{N&&document.contains(N)?s(N):y&&document.contains(y)&&s(y),N=null})},Z=i({element:b,onExitComplete:()=>{V||(B.restore(),b.hidden=!0,_e())}}),Q=e=>{M!==e&&(e?(N=document.activeElement,M=!0,m(y,`expanded`,!0),B.mount(),b.hidden=!1,X(`open`),Z.enter(),j&&!z&&(ne(),z=!0),ge(),L=!1,Y(),q.start(),K(),q.update(),b.focus()):(M=!1,m(y,`expanded`,!1),X(`closed`),Y(),F=``,L=!1,z&&=(h(),!1),q.stop(),Z.exit()),a(f,`dropdown-menu:change`,{open:M}),se?.(M))},$=e=>{if(G(e))return;let t=e.dataset.value||e.textContent?.trim()||``;a(f,`dropdown-menu:select`,{value:t}),w?.(t),le&&Q(!1)},ve=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(),ye(e.key.toLowerCase()))}},ye=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 m(y,`expanded`,!1),b.hidden=!0,X(`closed`),R.push(p(y,`click`,()=>Q(!M)),p(y,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!M&&(e.preventDefault(),Q(!0))})),R.push(p(b,`keydown`,ve),p(b,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&$(t)}),p(b,`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()}),p(b,`pointerleave`,()=>{L||Y()})),R.push(t({root:f,isOpen:()=>M,onDismiss:()=>Q(!1),closeOnClickOutside:T,closeOnEscape:ce})),R.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)})),oe&&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&&=(h(),!1),R.forEach(e=>e()),R.length=0,v.delete(f)}}}const v=new WeakSet;function y(e=document){let t=[];for(let n of f(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.
|
|
3
|
+
"version": "0.2.92",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -39,6 +39,6 @@
|
|
|
39
39
|
],
|
|
40
40
|
"license": "MIT",
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@data-slot/core": "0.2.
|
|
42
|
+
"@data-slot/core": "0.2.92"
|
|
43
43
|
}
|
|
44
44
|
}
|