@data-slot/dropdown-menu 0.2.121 → 0.2.123
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 +2 -0
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -52,6 +52,8 @@ controller.toggle();
|
|
|
52
52
|
controller.destroy();
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
+
`createDropdownMenu(root)` is idempotent per root. Calling it again for the same element returns the existing controller; destroy it first if you need to rebind with different options.
|
|
56
|
+
|
|
55
57
|
## Slots
|
|
56
58
|
|
|
57
59
|
| Slot | Description |
|
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`]
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`@data-slot/core`);const t=[`top`,`right`,`bottom`,`left`],n=[`start`,`center`,`end`],r=`@data-slot/dropdown-menu`;function i(i,a={}){let o=(0,e.getRootBinding)(i,r);if(o)return(0,e.warnRootBindingOnce)(i,r,`[@data-slot/dropdown-menu] createDropdownMenu() called more than once for the same root. Returning the existing controller. Destroy it before rebinding with new options.`),o;let s=(0,e.getPart)(i,`dropdown-menu-trigger`),c=(0,e.getPart)(i,`dropdown-menu-content`),l=(0,e.getPart)(i,`dropdown-menu-positioner`),u=l&&c&&l.contains(c)?l:null,d=(0,e.getPart)(i,`dropdown-menu-portal`),f=d&&u&&d.contains(u)?d:null;if(!s||!c)throw Error(`DropdownMenu requires trigger and content slots`);let p=a.defaultOpen??(0,e.getDataBool)(i,`defaultOpen`)??!1,m=a.onOpenChange,h=a.onSelect,ee=a.closeOnClickOutside??(0,e.getDataBool)(i,`closeOnClickOutside`)??!0,g=a.closeOnEscape??(0,e.getDataBool)(i,`closeOnEscape`)??!0,_=a.closeOnSelect??(0,e.getDataBool)(i,`closeOnSelect`)??!0,v=(t,n)=>(0,e.getDataEnum)(c,t,n)??(u?(0,e.getDataEnum)(u,t,n):void 0)??(0,e.getDataEnum)(i,t,n),y=t=>(0,e.getDataNumber)(c,t)??(u?(0,e.getDataNumber)(u,t):void 0)??(0,e.getDataNumber)(i,t),te=t=>(0,e.getDataBool)(c,t)??(u?(0,e.getDataBool)(u,t):void 0)??(0,e.getDataBool)(i,t),b=a.side??v(`side`,t)??`bottom`,x=a.align??v(`align`,n)??`start`,S=a.sideOffset??y(`sideOffset`)??4,C=a.alignOffset??y(`alignOffset`)??0,ne=a.avoidCollisions??te(`avoidCollisions`)??!0,re=a.collisionPadding??y(`collisionPadding`)??8,w=a.lockScroll??(0,e.getDataBool)(i,`lockScroll`)??!0,T=a.highlightItemOnHover??(0,e.getDataBool)(i,`highlightItemOnHover`)??!0,E=!1,D=null,O=-1,k=``,A=null,j=!1,M=[],N=!1,P=(0,e.createPortalLifecycle)({content:c,root:i,wrapperSlot:u?void 0:`dropdown-menu-positioner`,container:u??void 0,mountTarget:u?f??u: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)(s,`dropdown-menu-trigger`),H=(0,e.ensureId)(c,`dropdown-menu-content`);s.setAttribute(`aria-haspopup`,`menu`),s.setAttribute(`aria-controls`,H),c.setAttribute(`role`,`menu`),c.setAttribute(`aria-labelledby`,V),c.tabIndex=-1;let U=()=>{I=(0,e.getParts)(c,`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=i.ownerDocument.defaultView??window,r=s.getBoundingClientRect(),a=(0,e.computeFloatingPosition)({anchorRect:r,contentRect:(0,e.measurePopupContentRect)(c),side:b,align:x,sideOffset:S,alignOffset:C,avoidCollisions:ne,collisionPadding:re}),o=(0,e.computeFloatingTransformOrigin)({side:a.side,align:a.align,anchorRect:r,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`,o),t.style.willChange=`transform`,t.style.margin=`0`,c.setAttribute(`data-side`,a.side),c.setAttribute(`data-align`,a.align),t!==c&&(t.setAttribute(`data-side`,a.side),t.setAttribute(`data-align`,a.align))},G=(0,e.createPositionSync)({observedElements:[s,c],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,c),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)(c)},Y=e=>{i.setAttribute(`data-state`,e),c.setAttribute(`data-state`,e),e===`open`?(i.setAttribute(`data-open`,``),c.setAttribute(`data-open`,``),i.removeAttribute(`data-closed`),c.removeAttribute(`data-closed`)):(i.setAttribute(`data-closed`,``),c.setAttribute(`data-closed`,``),i.removeAttribute(`data-open`),c.removeAttribute(`data-open`))},ie=()=>{requestAnimationFrame(()=>{D&&document.contains(D)?(0,e.focusElement)(D):s&&document.contains(s)&&(0,e.focusElement)(s),D=null})},X=(0,e.createPresenceLifecycle)({element:c,onExitComplete:()=>{F||(P.restore(),c.hidden=!0,ie())}}),Z=t=>{E!==t&&(t?(D=document.activeElement,E=!0,(0,e.setAria)(s,`expanded`,!0),P.mount(),c.hidden=!1,Y(`open`),X.enter(),w&&!N&&((0,e.lockScroll)(),N=!0),U(),j=!1,q(),G.start(),W(),G.update(),c.focus()):(E=!1,(0,e.setAria)(s,`expanded`,!1),Y(`closed`),q(),k=``,j=!1,N&&=((0,e.unlockScroll)(),!1),G.stop(),X.exit()),(0,e.emit)(i,`dropdown-menu:change`,{open:E}),m?.(E))},Q=t=>{if(z(t))return;let n=t.dataset.value||t.textContent?.trim()||``;(0,e.emit)(i,`dropdown-menu:select`,{value:n}),h?.(n),_&&Z(!1)},ae=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&&Q(L[O]);break;case`Tab`:Z(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),oe(e.key.toLowerCase()))}},oe=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))};(0,e.setAria)(s,`expanded`,!1),c.hidden=!0,Y(`closed`),M.push((0,e.on)(s,`click`,()=>Z(!E)),(0,e.on)(s,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!E&&(e.preventDefault(),Z(!0))})),M.push((0,e.on)(c,`keydown`,ae),(0,e.on)(c,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&Q(t)}),(0,e.on)(c,`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)(c,`pointerleave`,e=>{!T||!B(e)||j||J()})),M.push((0,e.createDismissLayer)({root:i,isOpen:()=>E,onDismiss:()=>Z(!1),closeOnClickOutside:ee,closeOnEscape:g})),M.push((0,e.on)(i,`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`&&Z(n)}));let $={open:()=>Z(!0),close:()=>Z(!1),toggle:()=>Z(!E),get isOpen(){return E},destroy:()=>{F=!0,A&&clearTimeout(A),G.stop(),X.cleanup(),P.cleanup(),N&&=((0,e.unlockScroll)(),!1),M.forEach(e=>e()),M.length=0,(0,e.clearRootBinding)(i,r,$)}};return(0,e.setRootBinding)(i,r,$),p&&Z(!0),$}function a(t=document){let n=[];for(let a of(0,e.getRoots)(t,`dropdown-menu`))(0,e.getRootBinding)(a,r)||n.push(i(a));return n}exports.create=a,exports.createDropdownMenu=i;
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{clearRootBinding as e,computeFloatingPosition as t,computeFloatingTransformOrigin as n,createDismissLayer as r,createPortalLifecycle as i,createPositionSync as a,createPresenceLifecycle as o,emit as s,ensureId as c,ensureItemVisibleInContainer as ee,focusElement as l,getDataBool as u,getDataEnum as d,getDataNumber as f,getPart as p,getParts as te,getRootBinding as m,getRoots as h,lockScroll as ne,measurePopupContentRect as re,on as g,setAria as _,setRootBinding as ie,unlockScroll as v,warnRootBindingOnce as ae}from"@data-slot/core";const oe=[`top`,`right`,`bottom`,`left`],se=[`start`,`center`,`end`],y=`@data-slot/dropdown-menu`;function b(h,b={}){let x=m(h,y);if(x)return ae(h,y,`[@data-slot/dropdown-menu] createDropdownMenu() called more than once for the same root. Returning the existing controller. Destroy it before rebinding with new options.`),x;let S=p(h,`dropdown-menu-trigger`),C=p(h,`dropdown-menu-content`),w=p(h,`dropdown-menu-positioner`),T=w&&C&&w.contains(C)?w:null,E=p(h,`dropdown-menu-portal`),ce=E&&T&&E.contains(T)?E:null;if(!S||!C)throw Error(`DropdownMenu requires trigger and content slots`);let le=b.defaultOpen??u(h,`defaultOpen`)??!1,ue=b.onOpenChange,de=b.onSelect,fe=b.closeOnClickOutside??u(h,`closeOnClickOutside`)??!0,pe=b.closeOnEscape??u(h,`closeOnEscape`)??!0,me=b.closeOnSelect??u(h,`closeOnSelect`)??!0,D=(e,t)=>d(C,e,t)??(T?d(T,e,t):void 0)??d(h,e,t),O=e=>f(C,e)??(T?f(T,e):void 0)??f(h,e),he=e=>u(C,e)??(T?u(T,e):void 0)??u(h,e),ge=b.side??D(`side`,oe)??`bottom`,_e=b.align??D(`align`,se)??`start`,ve=b.sideOffset??O(`sideOffset`)??4,ye=b.alignOffset??O(`alignOffset`)??0,be=b.avoidCollisions??he(`avoidCollisions`)??!0,xe=b.collisionPadding??O(`collisionPadding`)??8,k=b.lockScroll??u(h,`lockScroll`)??!0,Se=b.highlightItemOnHover??u(h,`highlightItemOnHover`)??!0,A=!1,j=null,M=-1,N=``,P=null,F=!1,I=[],L=!1,R=i({content:C,root:h,wrapperSlot:T?void 0:`dropdown-menu-positioner`,container:T??void 0,mountTarget:T?ce??T: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`,Ce=c(S,`dropdown-menu-trigger`),we=c(C,`dropdown-menu-content`);S.setAttribute(`aria-haspopup`,`menu`),S.setAttribute(`aria-controls`,we),C.setAttribute(`role`,`menu`),C.setAttribute(`aria-labelledby`,Ce),C.tabIndex=-1;let Te=()=>{B=te(C,`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 e=R.container,r=h.ownerDocument.defaultView??window,i=S.getBoundingClientRect(),a=t({anchorRect:i,contentRect:re(C),side:ge,align:_e,sideOffset:ve,alignOffset:ye,avoidCollisions:be,collisionPadding:xe}),o=n({side:a.side,align:a.align,anchorRect:i,popupX:a.x,popupY:a.y});k?(e.style.position=`fixed`,e.style.top=`0px`,e.style.left=`0px`,e.style.transform=`translate3d(${a.x}px, ${a.y}px, 0)`):(e.style.position=`absolute`,e.style.top=`0px`,e.style.left=`0px`,e.style.transform=`translate3d(${a.x+r.scrollX}px, ${a.y+r.scrollY}px, 0)`),e.style.setProperty(`--transform-origin`,o),e.style.willChange=`transform`,e.style.margin=`0`,C.setAttribute(`data-side`,a.side),C.setAttribute(`data-align`,a.align),e!==C&&(e.setAttribute(`data-side`,a.side),e.setAttribute(`data-align`,a.align))},K=a({observedElements:[S,C],isActive:()=>A,ancestorScroll:k,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,C),t&&r.focus()):r.removeAttribute(`data-highlighted`)}M=e},J=()=>{for(let e of B)e.removeAttribute(`data-highlighted`);M=-1},Y=()=>{J(),l(C)},X=e=>{h.setAttribute(`data-state`,e),C.setAttribute(`data-state`,e),e===`open`?(h.setAttribute(`data-open`,``),C.setAttribute(`data-open`,``),h.removeAttribute(`data-closed`),C.removeAttribute(`data-closed`)):(h.setAttribute(`data-closed`,``),C.setAttribute(`data-closed`,``),h.removeAttribute(`data-open`),C.removeAttribute(`data-open`))},Ee=()=>{requestAnimationFrame(()=>{j&&document.contains(j)?l(j):S&&document.contains(S)&&l(S),j=null})},Z=o({element:C,onExitComplete:()=>{z||(R.restore(),C.hidden=!0,Ee())}}),Q=e=>{A!==e&&(e?(j=document.activeElement,A=!0,_(S,`expanded`,!0),R.mount(),C.hidden=!1,X(`open`),Z.enter(),k&&!L&&(ne(),L=!0),Te(),F=!1,J(),K.start(),G(),K.update(),C.focus()):(A=!1,_(S,`expanded`,!1),X(`closed`),J(),N=``,F=!1,L&&=(v(),!1),K.stop(),Z.exit()),s(h,`dropdown-menu:change`,{open:A}),ue?.(A))},De=e=>{if(U(e))return;let t=e.dataset.value||e.textContent?.trim()||``;s(h,`dropdown-menu:select`,{value:t}),de?.(t),me&&Q(!1)},Oe=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&&De(V[M]);break;case`Tab`:Q(!1);break;default:e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),ke(e.key.toLowerCase()))}},ke=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))};_(S,`expanded`,!1),C.hidden=!0,X(`closed`),I.push(g(S,`click`,()=>Q(!A)),g(S,`keydown`,e=>{(e.key===`Enter`||e.key===` `||e.key===`ArrowDown`)&&!A&&(e.preventDefault(),Q(!0))})),I.push(g(C,`keydown`,Oe),g(C,`click`,e=>{let t=e.target.closest?.(`[data-slot="dropdown-menu-item"]`);t&&De(t)}),g(C,`pointermove`,e=>{if(!Se||!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()}),g(C,`pointerleave`,e=>{!Se||!W(e)||F||Y()})),I.push(r({root:h,isOpen:()=>A,onDismiss:()=>Q(!1),closeOnClickOutside:fe,closeOnEscape:pe})),I.push(g(h,`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 $={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&&=(v(),!1),I.forEach(e=>e()),I.length=0,e(h,y,$)}};return ie(h,y,$),le&&Q(!0),$}function x(e=document){let t=[];for(let n of h(e,`dropdown-menu`))m(n,y)||t.push(b(n));return t}export{x as create,b 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.123",
|
|
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.
|
|
38
|
+
"@data-slot/core": "0.2.123"
|
|
39
39
|
}
|
|
40
40
|
}
|