@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 +4 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +1 -1
- package/package.json +2 -2
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` | - |
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
38
|
+
"@data-slot/core": "0.2.121"
|
|
39
39
|
}
|
|
40
40
|
}
|