@contentful/f36-menu 6.2.0 → 6.3.1
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/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import*as g from'react';import g__default from'react';import {useMergeRefs,FloatingList,FloatingPortal,FloatingFocusManager,useListItem,useFloatingTree,useFloatingParentNodeId,FloatingTree,FloatingNode,useFloatingNodeId,offset,flip,shift,autoPlacement,size,useFloating,autoUpdate,useHover,safePolygon,useClick,useRole,useDismiss,useListNavigation,useTypeahead,useInteractions}from'@floating-ui/react';import {cx,css}from'@emotion/css';import d from'@contentful/f36-tokens';import {useId,getMenuItemStyles}from'@contentful/f36-core';import {Caption}from'@contentful/f36-typography';import {CaretRightIcon}from'@contentful/f36-icons';var Ge=Object.defineProperty,je=Object.defineProperties;var Ke=Object.getOwnPropertyDescriptors;var j=Object.getOwnPropertySymbols;var ge=Object.prototype.hasOwnProperty,Me=Object.prototype.propertyIsEnumerable;var fe=(e,t,o)=>t in e?Ge(e,t,{enumerable:true,configurable:true,writable:true,value:o}):e[t]=o,a=(e,t)=>{for(var o in t||(t={}))ge.call(t,o)&&fe(e,o,t[o]);if(j)for(var o of j(t))Me.call(t,o)&&fe(e,o,t[o]);return e},L=(e,t)=>je(e,Ke(t));var c=(e,t)=>{var o={};for(var n in e)ge.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(e!=null&&j)for(var n of j(e))t.indexOf(n)<0&&Me.call(e,n)&&(o[n]=e[n]);return o};var F=g__default.createContext(null);function N(){let e=g__default.useContext(F);if(!e)throw new Error("useMenuContext must be used within <MenuContext.Provider>");return e}var Pe=F.Provider;function xe({placement:e,isFullWidth:t=false,isAutoalignmentEnabled:o=true,isOpen:n,defaultIsOpen:u=false,onOpen:s,onClose:r,offset:i,renderOnlyWhenOpen:y=true,usePortal:M=true,closeOnEsc:f=true,closeOnBlur:P=true,closeOnSelect:m=true,autoFocus:R=true}){let I=g__default.useRef([]),b=g__default.useRef([]),p=useFloatingTree(),l=useFloatingNodeId(),h=useFloatingParentNodeId(),H=useListItem(),ie=g__default.useContext(F),S=h!=null,_=n!==void 0,[De,Oe]=g__default.useState(u),T=_?n:De,ae=g__default.useRef(T);g__default.useEffect(()=>{ae.current=T;},[T]);let X=g__default.useCallback((v,k,G)=>{if(_&&!s&&G==="click")return;let ze=ae.current;v!==ze&&(_||Oe(v),v?s==null||s():r==null||r());},[_,s,r]),[ue,Ae]=g__default.useState(false),[$,Y]=g__default.useState(0),z=[offset(i||(S?{mainAxis:4,alignmentAxis:-4}:5))],q;e!=="auto"&&o?(q=e,z.push(flip({padding:5}),shift({padding:5}))):e==="auto"?z.push(autoPlacement()):q=e,t&&z.push(size({apply({rects:v,elements:k}){Object.assign(k.floating.style,{minWidth:`${v.reference.width}px`});}}));let{floatingStyles:pe,refs:me,context:E}=useFloating({nodeId:l,open:T,onOpenChange:X,whileElementsMounted:autoUpdate,placement:q,middleware:z}),Be=useHover(E,{enabled:S,delay:{open:75},handleClose:safePolygon({blockPointerEvents:true})}),We=useClick(E,{event:"mousedown",toggle:!S,ignoreMouse:S}),Ue=useRole(E,{role:"menu"}),_e=useDismiss(E,{escapeKey:f,outsidePress:P,bubbles:true}),Xe=useListNavigation(E,{listRef:I,activeIndex:$,nested:S,onNavigate:Y,loop:true}),$e=useTypeahead(E,{listRef:b,onMatch:T?Y:void 0,activeIndex:$}),{getReferenceProps:le,getFloatingProps:ce,getItemProps:de}=useInteractions([Be,We,Ue,_e,Xe,$e]);return g__default.useEffect(()=>{if(!p)return;function v(){m&&X(false);}function k(G){G.nodeId!==l&&G.parentId===h&&X(false);}return p.events.on("click",v),p.events.on("menuopen",k),()=>{p.events.off("click",v),p.events.off("menuopen",k);}},[p,l,h,X,m]),g__default.useEffect(()=>{T&&p&&p.events.emit("menuopen",{parentId:h,nodeId:l});},[p,T,l,h]),g__default.useMemo(()=>({isOpen:T,hasFocusInside:ue,activeIndex:$,isNested:S,refs:me,elementsRef:I,labelsRef:b,floatingStyles:pe,context:E,renderOnlyWhenOpen:y,usePortal:M,autoFocus:R,getReferenceProps:le,getFloatingProps:ce,getItemProps:de,setHasFocusInside:Ae,setActiveIndex:Y,nodeId:l,item:H,parent:ie}),[$,E,pe,ce,de,le,ue,S,T,H,l,ie,me,y,M,R])}var Re=o=>{var n=o,{children:e}=n,t=c(n,["children"]);let u=xe(a({},t));return g.createElement(Pe,{value:u},g.createElement(FloatingNode,{id:u.nodeId},e))};var w=e=>{let i=e,{children:t,placement:o}=i,n=c(i,["children","placement"]),u=useFloatingParentNodeId(),s=o!=null?o:u===null?"bottom-start":"right-start",r=g__default.createElement(Re,a({placement:s},n),t);return u===null?g__default.createElement(FloatingTree,null,r):r};w.displayName="Menu";var be=()=>css({position:"sticky",top:0,left:0,backgroundColor:d.colorWhite,borderBottom:`1px solid ${d.gray300}`,marginBottom:d.spacing2Xs,padding:`${d.spacing2Xs} 0`,zIndex:1001}),Te=()=>css({position:"sticky",bottom:0,left:0,backgroundColor:d.colorWhite,borderTop:`1px solid ${d.gray300}`,marginTop:d.spacing2Xs,padding:`${d.spacing2Xs} 0`,zIndex:1001}),he=e=>({container:css({display:e.isOpen?"initial":"none",borderRadius:"8px",overflowY:"auto",position:"absolute",top:0,left:0,padding:0,background:d.colorWhite,paddingTop:e.hasStickyHeader?0:d.spacing2Xs,paddingBottom:e.hasStickyFooter?0:d.spacing2Xs,boxShadow:d.boxShadowDefault,zIndex:d.zIndexDropdown,"&:focus":{boxShadow:d.glowPrimary,outline:"none"},"&:focus:not(:focus-visible)":{boxShadow:d.boxShadowDefault}})});var D=e=>{let r=e,{children:t,testId:o="cf-ui-menu-list-header",className:n}=r,u=c(r,["children","testId","className"]),s=be();return g__default.createElement("div",a({"data-test-id":o,className:cx(s,n)},u),t)};D.displayName="MenuListHeader";var O=e=>{let r=e,{children:t,testId:o="cf-ui-menu-list-footer",className:n}=r,u=c(r,["children","testId","className"]),s=Te();return g__default.createElement("div",a({"data-test-id":o,className:cx(s,n)},u),t)};O.displayName="MenuListFooter";function Et(e){return !g__default.isValidElement(e)||typeof e.type=="string"?false:typeof e.type.displayName=="string"}var Ee=(e,t)=>{let b=e,{children:o,testId:n="cf-ui-menu-list",className:u,style:s}=b,r=c(b,["children","testId","className","style"]),i=N(),y=null,M=null,f=[],P=useMergeRefs([i.refs.setFloating,t]);g__default.Children.forEach(o,p=>{let l=true;Et(p)&&(p.type.displayName===D.displayName?(y=p,l=false):p.type.displayName===O.displayName&&(M=p,l=false)),l&&f.push(p);});let m=he({hasStickyHeader:!!y,hasStickyFooter:!!M,isOpen:i.isOpen});if(i.renderOnlyWhenOpen&&!i.isOpen)return null;let R=g__default.createElement("div",a(a({role:"menu",style:a(a({},s),i.floatingStyles),className:cx(m.container,u),"data-test-id":n,ref:P},r),i.getFloatingProps()),y,f,M),I=p=>i.autoFocus===false?p:g__default.createElement(FloatingFocusManager,{context:i.context,modal:false,initialFocus:i.isNested?-1:0,returnFocus:!i.isNested},p);return g__default.createElement(FloatingList,{elementsRef:i.elementsRef,labelsRef:i.labelsRef},i.usePortal?g__default.createElement(FloatingPortal,null,I(R)):I(R))};Ee.displayName="MenuList";var Z=g__default.forwardRef(Ee);function Se(){let e=g__default.useContext(F),t=useListItem(),o=useFloatingTree(),n=t.index===e.activeIndex,u=g__default.useCallback((s={})=>e.getItemProps(L(a({},s),{onClick(r){var i;(i=s.onClick)==null||i.call(s,r),o==null||o.events.emit("click");},onFocus(r){var i;(i=s.onFocus)==null||i.call(s,r),e.setHasFocusInside(true);}})),[e,o]);return {isActive:n,item:t,menu:e,tree:o,getItemProps:u}}var Ce=({isActive:e,isDisabled:t})=>cx(getMenuItemStyles({isActive:e,isDisabled:t}),css({width:`calc(100% - 2 * ${d.spacing2Xs})`,margin:`0 ${d.spacing2Xs}`,gap:d.spacingXs}));var wt="button";function Le(e,t){let H=e,{testId:o,className:n,as:u,isActive:s=false,isDisabled:r,isInitiallyFocused:i,icon:y}=H,M=c(H,["testId","className","as","isActive","isDisabled","isInitiallyFocused","icon"]),f=r!=null?r:e.disabled,P=Se(),m=useId(void 0,"menu-item"),R=o||`cf-ui-${m}`,I=Ce({isActive:s,isDisabled:r}),b=u!=null?u:wt,{menu:p,item:l}=P,{setActiveIndex:h}=p;return g__default.useEffect(()=>{i&&h(l.index);},[i,l.index,h]),g__default.createElement(b,a(L(a({},M),{ref:useMergeRefs([P.item.ref,t]),role:"menuitem",className:cx(I,n),"data-test-id":R,tabIndex:P.isActive?0:-1,disabled:f}),P.getItemProps(M)),y,e.children)}Le.displayName="MenuItem";var A=g__default.forwardRef(Le);var B=g__default.forwardRef(function({children:t},o){let n=N(),{refs:u,item:s,isNested:r,isOpen:i,hasFocusInside:y,setHasFocusInside:M,parent:f}=n,P=t.ref,m=t.props,R=f==null?void 0:f.activeIndex,I=f?f.getItemProps:n.getItemProps,b=a({ref:useMergeRefs([u.setReference,s.ref,o,P]),tabIndex:r?R===s.index?0:-1:void 0,role:r?"menuitem":void 0,"data-open":i?"":void 0,"data-nested":r?"":void 0,"data-focus-inside":y?"":void 0},n.getReferenceProps(I({onClick:m.onClick,onMouseDown:m.onMouseDown,onKeyDown:m.onKeyDown,onMouseEnter:m.onMouseEnter,onMouseLeave:m.onMouseLeave,onPointerDown:m.onPointerDown,onPointerEnter:m.onPointerEnter,onPointerLeave:m.onPointerLeave,onFocus(p){var l;(l=m.onFocus)==null||l.call(m,p),M(false),f&&f.setHasFocusInside(true);}})));return g__default.cloneElement(t,b)});var He=()=>css({border:"none",width:"100%",height:"1px",backgroundColor:d.gray200,margin:`${d.spacing2Xs} 0`});var K=e=>{let r=e,{children:t,testId:o="cf-ui-menu-divider",className:n}=r,u=c(r,["children","testId","className"]),s=He();return g__default.createElement("hr",a({"aria-orientation":"horizontal","data-test-id":o,className:cx(s,n)},u))};K.displayName="MenuDivider";var ke=()=>css({color:d.gray500,textAlign:"left",padding:`${d.spacingXs} ${d.spacingS} ${d.spacing2Xs}`,lineHeight:d.lineHeightM});var oe=e=>{let r=e,{children:t,testId:o="cf-ui-menu-section-title",className:n}=r,u=c(r,["children","testId","className"]),s=ke();return g__default.createElement(Caption,a({"aria-hidden":"true",as:"div",testId:o,className:cx(s,n),marginBottom:"none"},u),t)};var V=e=>g__default.createElement(w,a({},e));V.displayName="Submenu";var we=()=>({root:({isActive:e})=>css(a({display:"flex",alignItems:"center",paddingRight:d.spacingXs},e?{backgroundColor:d.gray100}:{})),content:css({marginRight:d.spacingM}),icon:css({marginLeft:"auto",fill:"currentColor"})});var jt=(e,t)=>{let{className:o,children:n}=e,u=we(),{isOpen:s}=N();return g__default.createElement(B,null,g__default.createElement(A,L(a({},e),{ref:t,className:cx(u.root({isActive:s}),o)}),g__default.createElement("span",{className:u.content},n),g__default.createElement(CaretRightIcon,{className:u.icon})))},se=g__default.forwardRef(jt);var x=w;x.List=Z;x.ListHeader=D;x.ListFooter=O;x.Item=A;x.Trigger=B;x.Divider=K;x.SectionTitle=oe;x.Submenu=V;x.SubmenuTrigger=se;export{x as Menu,K as MenuDivider,A as MenuItem,Z as MenuList,oe as MenuSectionTitle,B as MenuTrigger,V as Submenu,se as SubmenuTrigger};//# sourceMappingURL=index.js.map
|
|
1
|
+
import*as g from'react';import g__default from'react';import {useMergeRefs,FloatingList,FloatingPortal,FloatingFocusManager,useListItem,useFloatingTree,useFloatingParentNodeId,FloatingTree,FloatingNode,useFloatingNodeId,offset,flip,shift,autoPlacement,size,useFloating,autoUpdate,useHover,safePolygon,useClick,useRole,useDismiss,useListNavigation,useTypeahead,useInteractions}from'@floating-ui/react';import {cx,css}from'@emotion/css';import d from'@contentful/f36-tokens';import {useId,getMenuItemStyles}from'@contentful/f36-core';import {Caption}from'@contentful/f36-typography';import {CaretRightIcon}from'@contentful/f36-icons';var je=Object.defineProperty,Ke=Object.defineProperties;var Ve=Object.getOwnPropertyDescriptors;var j=Object.getOwnPropertySymbols;var Me=Object.prototype.hasOwnProperty,ye=Object.prototype.propertyIsEnumerable;var ge=(e,t,o)=>t in e?je(e,t,{enumerable:true,configurable:true,writable:true,value:o}):e[t]=o,a=(e,t)=>{for(var o in t||(t={}))Me.call(t,o)&&ge(e,o,t[o]);if(j)for(var o of j(t))ye.call(t,o)&&ge(e,o,t[o]);return e},F=(e,t)=>Ke(e,Ve(t));var c=(e,t)=>{var o={};for(var n in e)Me.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(e!=null&&j)for(var n of j(e))t.indexOf(n)<0&&ye.call(e,n)&&(o[n]=e[n]);return o};var N=g__default.createContext(null);function H(){let e=g__default.useContext(N);if(!e)throw new Error("useMenuContext must be used within <MenuContext.Provider>");return e}var xe=N.Provider;function Re({placement:e,isFullWidth:t=false,isAutoalignmentEnabled:o=true,isOpen:n,defaultIsOpen:u=false,onOpen:s,onClose:r,offset:i,renderOnlyWhenOpen:y=true,usePortal:M=true,useTypeahead:f=false,closeOnEsc:P=true,closeOnBlur:m=true,closeOnSelect:I=true,autoFocus:b=true}){let T=g__default.useRef([]),l=g__default.useRef([]),p=useFloatingTree(),x=useFloatingNodeId(),E=useFloatingParentNodeId(),ie=useListItem(),ae=g__default.useContext(N),C=E!=null,_=n!==void 0,[Oe,Ae]=g__default.useState(u),h=_?n:Oe,ue=g__default.useRef(h);g__default.useEffect(()=>{ue.current=h;},[h]);let X=g__default.useCallback((S,k,G)=>{if(_&&!s&&G==="click")return;let Ge=ue.current;S!==Ge&&(_||Ae(S),S?s==null||s():r==null||r());},[_,s,r]),[pe,Be]=g__default.useState(false),[$,Y]=g__default.useState(0),z=[offset(i||(C?{mainAxis:4,alignmentAxis:-4}:5))],q;e!=="auto"&&o?(q=e,z.push(flip({padding:5}),shift({padding:5}))):e==="auto"?z.push(autoPlacement()):q=e,t&&z.push(size({apply({rects:S,elements:k}){Object.assign(k.floating.style,{minWidth:`${S.reference.width}px`});}}));let{floatingStyles:me,refs:le,context:v}=useFloating({nodeId:x,open:h,onOpenChange:X,whileElementsMounted:autoUpdate,placement:q,middleware:z}),We=useHover(v,{enabled:C,delay:{open:75},handleClose:safePolygon({blockPointerEvents:true})}),Ue=useClick(v,{event:"mousedown",toggle:!C,ignoreMouse:C}),_e=useRole(v,{role:"menu"}),Xe=useDismiss(v,{escapeKey:P,outsidePress:m,bubbles:true}),$e=useListNavigation(v,{listRef:T,activeIndex:$,nested:C,onNavigate:Y,loop:true}),ze=useTypeahead(v,{enabled:f,listRef:l,onMatch:h?Y:void 0,activeIndex:$}),{getReferenceProps:ce,getFloatingProps:de,getItemProps:fe}=useInteractions([We,Ue,_e,Xe,$e,ze]);return g__default.useEffect(()=>{if(!p)return;function S(){I&&X(false);}function k(G){G.nodeId!==x&&G.parentId===E&&X(false);}return p.events.on("click",S),p.events.on("menuopen",k),()=>{p.events.off("click",S),p.events.off("menuopen",k);}},[p,x,E,X,I]),g__default.useEffect(()=>{h&&p&&p.events.emit("menuopen",{parentId:E,nodeId:x});},[p,h,x,E]),g__default.useMemo(()=>({isOpen:h,hasFocusInside:pe,activeIndex:$,isNested:C,refs:le,elementsRef:T,labelsRef:l,floatingStyles:me,context:v,renderOnlyWhenOpen:y,usePortal:M,autoFocus:b,getReferenceProps:ce,getFloatingProps:de,getItemProps:fe,setHasFocusInside:Be,setActiveIndex:Y,nodeId:x,item:ie,parent:ae}),[$,v,me,de,fe,ce,pe,C,h,ie,x,ae,le,y,M,b])}var Ie=o=>{var n=o,{children:e}=n,t=c(n,["children"]);let u=Re(a({},t));return g.createElement(xe,{value:u},g.createElement(FloatingNode,{id:u.nodeId},e))};var w=e=>{let i=e,{children:t,placement:o}=i,n=c(i,["children","placement"]),u=useFloatingParentNodeId(),s=o!=null?o:u===null?"bottom-start":"right-start",r=g__default.createElement(Ie,a({placement:s},n),t);return u===null?g__default.createElement(FloatingTree,null,r):r};w.displayName="Menu";var Te=()=>css({position:"sticky",top:0,left:0,backgroundColor:d.colorWhite,borderBottom:`1px solid ${d.gray300}`,marginBottom:d.spacing2Xs,padding:`${d.spacing2Xs} 0`,zIndex:1001}),he=()=>css({position:"sticky",bottom:0,left:0,backgroundColor:d.colorWhite,borderTop:`1px solid ${d.gray300}`,marginTop:d.spacing2Xs,padding:`${d.spacing2Xs} 0`,zIndex:1001}),Ee=e=>({container:css({display:e.isOpen?"initial":"none",borderRadius:"8px",overflowY:"auto",position:"absolute",top:0,left:0,padding:0,background:d.colorWhite,paddingTop:e.hasStickyHeader?0:d.spacing2Xs,paddingBottom:e.hasStickyFooter?0:d.spacing2Xs,boxShadow:d.boxShadowDefault,zIndex:d.zIndexDropdown,"&:focus":{boxShadow:d.glowPrimary,outline:"none"},"&:focus:not(:focus-visible)":{boxShadow:d.boxShadowDefault}})});var D=e=>{let r=e,{children:t,testId:o="cf-ui-menu-list-header",className:n}=r,u=c(r,["children","testId","className"]),s=Te();return g__default.createElement("div",a({"data-test-id":o,className:cx(s,n)},u),t)};D.displayName="MenuListHeader";var O=e=>{let r=e,{children:t,testId:o="cf-ui-menu-list-footer",className:n}=r,u=c(r,["children","testId","className"]),s=he();return g__default.createElement("div",a({"data-test-id":o,className:cx(s,n)},u),t)};O.displayName="MenuListFooter";function vt(e){return !g__default.isValidElement(e)||typeof e.type=="string"?false:typeof e.type.displayName=="string"}var ve=(e,t)=>{let T=e,{children:o,testId:n="cf-ui-menu-list",className:u,style:s}=T,r=c(T,["children","testId","className","style"]),i=H(),y=null,M=null,f=[],P=useMergeRefs([i.refs.setFloating,t]);g__default.Children.forEach(o,l=>{let p=true;vt(l)&&(l.type.displayName===D.displayName?(y=l,p=false):l.type.displayName===O.displayName&&(M=l,p=false)),p&&f.push(l);});let m=Ee({hasStickyHeader:!!y,hasStickyFooter:!!M,isOpen:i.isOpen});if(i.renderOnlyWhenOpen&&!i.isOpen)return null;let I=g__default.createElement("div",a(a({role:"menu",style:a(a({},s),i.floatingStyles),className:cx(m.container,u),"data-test-id":n,ref:P},r),i.getFloatingProps()),y,f,M),b=l=>i.autoFocus===false?l:g__default.createElement(FloatingFocusManager,{context:i.context,modal:false,initialFocus:i.isNested?-1:0,returnFocus:!i.isNested},l);return g__default.createElement(FloatingList,{elementsRef:i.elementsRef,labelsRef:i.labelsRef},i.usePortal?g__default.createElement(FloatingPortal,null,b(I)):b(I))};ve.displayName="MenuList";var Z=g__default.forwardRef(ve);function Ce(){let e=g__default.useContext(N),t=useListItem(),o=useFloatingTree(),n=t.index===e.activeIndex,u=g__default.useCallback((s={})=>e.getItemProps(F(a({},s),{onClick(r){var i;(i=s.onClick)==null||i.call(s,r),o==null||o.events.emit("click");},onFocus(r){var i;(i=s.onFocus)==null||i.call(s,r),e.setHasFocusInside(true);}})),[e,o]);return {isActive:n,item:t,menu:e,tree:o,getItemProps:u}}var Le=({isActive:e,isDisabled:t})=>cx(getMenuItemStyles({isActive:e,isDisabled:t}),css({width:`calc(100% - 2 * ${d.spacing2Xs})`,margin:`0 ${d.spacing2Xs}`,gap:d.spacingXs}));var Dt="button";function Fe(e,t){let E=e,{testId:o,className:n,as:u,isActive:s=false,isDisabled:r,isInitiallyFocused:i,icon:y}=E,M=c(E,["testId","className","as","isActive","isDisabled","isInitiallyFocused","icon"]),f=r!=null?r:e.disabled,P=Ce(),m=useId(void 0,"menu-item"),I=o||`cf-ui-${m}`,b=Le({isActive:s,isDisabled:r}),T=u!=null?u:Dt,{menu:l,item:p}=P,{setActiveIndex:x}=l;return g__default.useEffect(()=>{i&&x(p.index);},[i,p.index,x]),g__default.createElement(T,a(F(a({},M),{ref:useMergeRefs([P.item.ref,t]),role:"menuitem",className:cx(b,n),"data-test-id":I,tabIndex:P.isActive?0:-1,disabled:f}),P.getItemProps(M)),y,e.children)}Fe.displayName="MenuItem";var A=g__default.forwardRef(Fe);var B=g__default.forwardRef(function({children:t},o){let n=H(),{refs:u,item:s,isNested:r,isOpen:i,hasFocusInside:y,setHasFocusInside:M,parent:f}=n,P=t.ref,m=t.props,I=f==null?void 0:f.activeIndex,b=f?f.getItemProps:n.getItemProps,T=a({ref:useMergeRefs([u.setReference,s.ref,o,P]),tabIndex:r?I===s.index?0:-1:void 0,role:r?"menuitem":void 0,"data-open":i?"":void 0,"data-nested":r?"":void 0,"data-focus-inside":y?"":void 0},n.getReferenceProps(b({onClick:m.onClick,onMouseDown:m.onMouseDown,onKeyDown:m.onKeyDown,onMouseEnter:m.onMouseEnter,onMouseLeave:m.onMouseLeave,onPointerDown:m.onPointerDown,onPointerEnter:m.onPointerEnter,onPointerLeave:m.onPointerLeave,onFocus(l){var p;(p=m.onFocus)==null||p.call(m,l),M(false),f&&f.setHasFocusInside(true);}})));return g__default.cloneElement(t,T)});var ke=()=>css({border:"none",width:"100%",height:"1px",backgroundColor:d.gray200,margin:`${d.spacing2Xs} 0`});var K=e=>{let r=e,{children:t,testId:o="cf-ui-menu-divider",className:n}=r,u=c(r,["children","testId","className"]),s=ke();return g__default.createElement("hr",a({"aria-orientation":"horizontal","data-test-id":o,className:cx(s,n)},u))};K.displayName="MenuDivider";var we=()=>css({color:d.gray500,textAlign:"left",padding:`${d.spacingXs} ${d.spacingS} ${d.spacing2Xs}`,lineHeight:d.lineHeightM});var oe=e=>{let r=e,{children:t,testId:o="cf-ui-menu-section-title",className:n}=r,u=c(r,["children","testId","className"]),s=we();return g__default.createElement(Caption,a({"aria-hidden":"true",as:"div",testId:o,className:cx(s,n),marginBottom:"none"},u),t)};var V=e=>g__default.createElement(w,a({},e));V.displayName="Submenu";var De=()=>({root:({isActive:e})=>css(a({display:"flex",alignItems:"center",paddingRight:d.spacingXs},e?{backgroundColor:d.gray100}:{})),content:css({marginRight:d.spacingM}),icon:css({marginLeft:"auto",fill:"currentColor"})});var Kt=(e,t)=>{let{className:o,children:n}=e,u=De(),{isOpen:s}=H();return g__default.createElement(B,null,g__default.createElement(A,F(a({},e),{ref:t,className:cx(u.root({isActive:s}),o)}),g__default.createElement("span",{className:u.content},n),g__default.createElement(CaretRightIcon,{className:u.icon})))},se=g__default.forwardRef(Kt);var R=w;R.List=Z;R.ListHeader=D;R.ListFooter=O;R.Item=A;R.Trigger=B;R.Divider=K;R.SectionTitle=oe;R.Submenu=V;R.SubmenuTrigger=se;export{R as Menu,K as MenuDivider,A as MenuItem,Z as MenuList,oe as MenuSectionTitle,B as MenuTrigger,V as Submenu,se as SubmenuTrigger};//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/MenuContext.ts","../../src/useMenu.ts","../../src/MenuComponent.tsx","../../src/Menu.tsx","../../src/MenuList/MenuList.styles.ts","../../src/MenuList/MenuListHeader.tsx","../../src/MenuList/MenuListFooter.tsx","../../src/MenuList/MenuList.tsx","../../src/MenuItem/useMenuItem.tsx","../../src/MenuItem/MenuItem.styles.ts","../../src/MenuItem/MenuItem.tsx","../../src/MenuTrigger/MenuTrigger.tsx","../../src/MenuDivider/MenuDivider.styles.ts","../../src/MenuDivider/MenuDivider.tsx","../../src/MenuSectionTitle/MenuSectionTitle.styles.ts","../../src/MenuSectionTitle/MenuSectionTitle.tsx","../../src/Submenu/Submenu.tsx","../../src/SubmenuTrigger/SubmenuTrigger.styles.ts","../../src/SubmenuTrigger/SubmenuTrigger.tsx","../../src/CompoundMenu.tsx"],"names":["MenuContext","React","useMenuContext","ctx","MenuContextProvider","useMenu","placement","isFullWidth","isAutoalignmentEnabled","controlledIsOpen","defaultIsOpen","onOpen","onClose","offsetProp","renderOnlyWhenOpen","usePortal","closeOnEsc","closeOnBlur","closeOnSelect","autoFocus","elementsRef","labelsRef","tree","useFloatingTree","nodeId","useFloatingNodeId","parentId","useFloatingParentNodeId","item","useListItem","parent","isNested","isControlled","uncontrolledIsOpen","setUncontrolledIsOpen","isOpen","prevOpenRef","handleOpenChange","nextOpen","_event","reason","wasOpen","hasFocusInside","setHasFocusInside","activeIndex","setActiveIndex","middleware","offset","sanitizedPlacement","flip","shift","autoPlacement","size","rects","elements","floatingStyles","refs","context","useFloating","autoUpdate","hover","useHover","safePolygon","click","useClick","role","useRole","dismiss","useDismiss","listNavigation","useListNavigation","typeahead","useTypeahead","getReferenceProps","getFloatingProps","getItemProps","useInteractions","handleTreeClick","onSubMenuOpen","event","MenuComponent","_a","_b","children","otherProps","__objRest","menuContext","__spreadValues","J","FloatingNode","Menu","props","resolvedPlacement","content","FloatingTree","getMenuHeaderStyles","css","tokens","getMenuFooterStyles","getMenuListStyles","MenuListHeader","testId","className","styles","cx","MenuListFooter","assertChild","child","MenuListBase","forwardedRef","style","menu","header","footer","items","useMergeRefs","appendChild","maybeWrapWithFocusManager","node","FloatingFocusManager","FloatingList","FloatingPortal","MenuList","useMenuItem","isActive","userProps","__spreadProps","getMenuItemStyles","isDisabled","globalGetMenuItemStyles","MENU_ITEM_DEFAULT_TAG","MenuItemBase","as","isInitiallyFocused","icon","propDisabled","menuItem","id","useId","itemTestId","Element","MenuItem","MenuTrigger","childRef","childProps","parentActiveIndex","triggerProps","getMenuDividerStyles","MenuDivider","getMenuSectionTitleStyles","MenuSectionTitle","Caption","Submenu","getSubmenuTriggerStyles","SubmenuTriggerBase","ref","CaretRightIcon","SubmenuTrigger"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react';\nimport type { UseMenuReturn } from './useMenu';\n\nexport const MenuContext = React.createContext<UseMenuReturn | null>(null);\n\nexport function useMenuContext() {\n const ctx = React.useContext(MenuContext);\n if (!ctx) {\n throw new Error(\n 'useMenuContext must be used within <MenuContext.Provider>',\n );\n }\n return ctx;\n}\nexport const MenuContextProvider = MenuContext.Provider;\n","import React from 'react';\nimport {\n autoUpdate,\n flip,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useRole,\n useTypeahead,\n autoPlacement,\n size,\n} from '@floating-ui/react';\nimport type { Placement, UseFloatingOptions } from '@floating-ui/react';\nimport type { MenuProps } from './Menu';\nimport { MenuContext } from './MenuContext';\n\nexport interface UseMenuReturn {\n // State\n isOpen: boolean;\n hasFocusInside: boolean;\n activeIndex: number | null;\n isNested: boolean;\n\n // Refs\n refs: {\n setReference: (node: HTMLButtonElement | null) => void;\n setFloating: (node: HTMLElement | null) => void;\n };\n elementsRef: React.RefObject<Array<HTMLButtonElement | null>>;\n labelsRef: React.RefObject<Array<string | null>>;\n\n // Floating UI\n floatingStyles: React.CSSProperties;\n context: ReturnType<typeof useFloating>['context'];\n renderOnlyWhenOpen: boolean;\n usePortal: boolean;\n autoFocus: boolean;\n\n // Props getters\n getReferenceProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n getFloatingProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n getItemProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n\n // State setters\n setHasFocusInside: React.Dispatch<React.SetStateAction<boolean>>;\n setActiveIndex: React.Dispatch<React.SetStateAction<number | null>>;\n\n // Tree and item info\n nodeId: string;\n item: ReturnType<typeof useListItem>;\n parent: React.ContextType<typeof MenuContext>;\n}\n\nexport function useMenu({\n placement,\n isFullWidth = false,\n isAutoalignmentEnabled = true,\n isOpen: controlledIsOpen,\n defaultIsOpen = false,\n onOpen,\n onClose,\n offset: offsetProp,\n renderOnlyWhenOpen = true,\n usePortal = true,\n closeOnEsc = true,\n closeOnBlur = true,\n closeOnSelect = true,\n autoFocus = true,\n}: MenuProps): UseMenuReturn {\n const elementsRef = React.useRef<Array<HTMLButtonElement | null>>([]);\n const labelsRef = React.useRef<Array<string | null>>([]);\n\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const item = useListItem();\n const parent = React.useContext(MenuContext);\n\n const isNested = parentId != null;\n\n /**\n * Handle open and closed state\n * supports controlled and uncontrolled behavior\n * */\n const isControlled = controlledIsOpen !== undefined;\n const [uncontrolledIsOpen, setUncontrolledIsOpen] =\n React.useState(defaultIsOpen);\n const isOpen = isControlled ? controlledIsOpen : uncontrolledIsOpen;\n\n // Track previous open for transition detection\n const prevOpenRef = React.useRef(isOpen);\n React.useEffect(() => {\n prevOpenRef.current = isOpen;\n }, [isOpen]);\n\n const handleOpenChange = React.useCallback<\n UseFloatingOptions['onOpenChange']\n >(\n (nextOpen, _event, reason) => {\n // if the user made component controlled by providing isOpen prop\n // but onOpen callback is not provided, we won't add toggle logic\n // to the trigger component. So they can make any toggle logic on their own.\n const isFullyControlled = isControlled && !onOpen;\n if (isFullyControlled && reason === 'click') {\n return;\n }\n\n const wasOpen = prevOpenRef.current;\n if (nextOpen === wasOpen) {\n return;\n }\n\n if (!isControlled) {\n setUncontrolledIsOpen(nextOpen);\n }\n\n if (nextOpen) {\n onOpen?.();\n } else {\n onClose?.();\n }\n },\n [isControlled, onOpen, onClose],\n );\n\n // Focus Handling\n const [hasFocusInside, setHasFocusInside] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState<number>(0);\n\n /** Configure middleware based on placement with offset\n * and isAutoalignmentEnabled\n * If placement is \"auto\" it will use autoPlacement() in the middleware and not make use of flip and switch.\n * If isAutoalignmentEnabled is false, it will also not use flip and switch but only use the placement variable.\n */\n\n const offsetOption = offsetProp\n ? offsetProp\n : isNested\n ? { mainAxis: 4, alignmentAxis: -4 }\n : 5;\n\n const middleware = [offset(offsetOption)];\n\n // sanitize the placement to allow auto setting alongside with isAutoalignmentEnabled\n\n let sanitizedPlacement: Placement;\n\n if (placement !== 'auto' && isAutoalignmentEnabled) {\n sanitizedPlacement = placement;\n middleware.push(flip({ padding: 5 }), shift({ padding: 5 }));\n } else if (placement === 'auto') {\n middleware.push(autoPlacement());\n } else {\n sanitizedPlacement = placement;\n }\n\n /**\n * Set to same size as trigger reference element\n */\n if (isFullWidth) {\n middleware.push(\n size({\n apply({ rects, elements }) {\n Object.assign(elements.floating.style, {\n minWidth: `${rects.reference.width}px`,\n });\n },\n }),\n );\n }\n\n const { floatingStyles, refs, context } = useFloating<HTMLButtonElement>({\n nodeId,\n open: isOpen,\n onOpenChange: handleOpenChange,\n whileElementsMounted: autoUpdate,\n placement: sanitizedPlacement,\n middleware,\n });\n\n const hover = useHover(context, {\n enabled: isNested,\n delay: { open: 75 },\n handleClose: safePolygon({ blockPointerEvents: true }),\n });\n const click = useClick(context, {\n event: 'mousedown',\n toggle: !isNested,\n ignoreMouse: isNested,\n });\n const role = useRole(context, { role: 'menu' });\n\n const dismiss = useDismiss(context, {\n escapeKey: closeOnEsc,\n outsidePress: closeOnBlur,\n bubbles: true,\n });\n\n const listNavigation = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: isNested,\n onNavigate: setActiveIndex,\n loop: true,\n });\n\n const typeahead = useTypeahead(context, {\n listRef: labelsRef,\n onMatch: isOpen ? setActiveIndex : undefined,\n activeIndex,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNavigation, typeahead],\n );\n\n // Event emitter allows you to communicate across tree components.\n // This effect closes all menus when an item gets clicked anywhere\n // in the tree.\n React.useEffect(() => {\n if (!tree) return;\n\n function handleTreeClick() {\n // Only close menus on item click if the consumer opted in via closeOnSelect\n if (closeOnSelect) {\n handleOpenChange(false);\n }\n }\n\n function onSubMenuOpen(event: { nodeId: string; parentId: string }) {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n handleOpenChange(false);\n }\n }\n\n tree.events.on('click', handleTreeClick);\n tree.events.on('menuopen', onSubMenuOpen);\n\n return () => {\n tree.events.off('click', handleTreeClick);\n tree.events.off('menuopen', onSubMenuOpen);\n };\n }, [tree, nodeId, parentId, handleOpenChange, closeOnSelect]);\n\n React.useEffect(() => {\n if (isOpen && tree) {\n tree.events.emit('menuopen', { parentId, nodeId });\n }\n }, [tree, isOpen, nodeId, parentId]);\n\n return React.useMemo(\n () => ({\n // State\n isOpen,\n hasFocusInside,\n activeIndex,\n isNested,\n\n // Refs\n refs,\n elementsRef,\n labelsRef,\n\n // Floating UI\n floatingStyles,\n context,\n renderOnlyWhenOpen,\n usePortal,\n autoFocus,\n\n // Props getters\n getReferenceProps,\n getFloatingProps,\n getItemProps,\n\n // State setters\n setHasFocusInside,\n setActiveIndex,\n\n // Tree and item info\n nodeId,\n item,\n parent,\n }),\n [\n activeIndex,\n context,\n floatingStyles,\n getFloatingProps,\n getItemProps,\n getReferenceProps,\n hasFocusInside,\n isNested,\n isOpen,\n item,\n nodeId,\n parent,\n refs,\n renderOnlyWhenOpen,\n usePortal,\n autoFocus,\n ],\n );\n}\n","import * as React from 'react';\nimport { FloatingNode } from '@floating-ui/react';\nimport type { ExpandProps } from '@contentful/f36-core';\nimport { useMenu } from './useMenu';\nimport { MenuContextProvider } from './MenuContext';\nimport type { MenuProps } from './Menu';\n\nexport const MenuComponent = ({\n children,\n ...otherProps\n}: ExpandProps<MenuProps>) => {\n const menuContext = useMenu({ ...otherProps });\n return (\n <MenuContextProvider value={menuContext}>\n <FloatingNode id={menuContext.nodeId}>{children}</FloatingNode>\n </MenuContextProvider>\n );\n};\n","import React from 'react';\nimport {\n useFloatingParentNodeId,\n FloatingTree,\n type Placement,\n type OffsetOptions,\n} from '@floating-ui/react';\nimport { MenuComponent } from './MenuComponent';\nimport type { ExpandProps } from '@contentful/f36-core';\n\ntype BaseMenuProps = {\n /**\n * Boolean to determine if the Popover should be the same width as\n * the trigger element\n *\n * @default false\n */\n isFullWidth?: boolean;\n\n /**\n * If `true`, the Menu will be initially opened. This property has no influence on the uncontrolled status of the Menu\n */\n defaultIsOpen?: boolean;\n\n /**\n * Callback fired when the Menu opens\n */\n onOpen?: () => void;\n\n /**\n * Callback fired when the Menu closes\n */\n onClose?: () => void;\n\n /**\n * Determines the preferred position of where the MenuList opens. This position is not\n * guaranteed, as the MenuList might be moved to fit the viewport.\n *\n * @default bottom-start OR right-start\n */\n placement?: Placement | 'auto';\n\n /**\n * Boolean to control if popover is allowed to change its placement automatically\n * based on available space in the viewport.\n *\n * For example:\n * If you set placement prop to bottom, but there isn't enough space to position the popover in that direction,\n * it will change the popper placement to top. As soon as enough space is detected, the placement will be reverted to the defined one.\n *\n * If you want the popover to strictly follow the placement prop you should set this prop to false.\n *\n * @default true\n */\n isAutoalignmentEnabled?: boolean;\n\n /**\n * Single number as short hand for `mainAxis`\n * Or object which can contain `mainAxis`, `crossAxis` or `alignmentAxis`\n *\n * @default 0\n */\n offset?: OffsetOptions;\n\n /**\n * Defines if the menu list content should be rendered in the DOM only when it's open\n * or all the time (after the component has been mounted)\n *\n * @default true\n */\n renderOnlyWhenOpen?: boolean;\n\n /**\n * If `true`, the Menu will close when a menu item is\n * clicked\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnSelect?: boolean;\n\n /**\n * If true, the menu will close when you blur out it by clicking outside\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnBlur?: boolean;\n\n /**\n * If true, the menu will close when you hit the Esc key\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnEsc?: boolean;\n\n /**\n * Boolean to control whether or not to render the Menu in a React Portal.\n * Rendering content inside a Portal allows the Menu to escape the bounds\n * of its parent while still being positioned correctly. Using a Portal is\n * necessary if an ancestor of the Menu hides overflow.\n *\n * @default true\n */\n usePortal?: boolean;\n\n /**\n * If true, the Menu will be focused after opening\n *\n * @default true\n */\n autoFocus?: boolean;\n\n /**\n * Menu compound children (Trigger, List, Item, etc.)\n */\n children?: React.ReactNode;\n};\n\n// Uncontrolled: no isOpen prop\ninterface UncontrolledMenuProps extends BaseMenuProps {\n isOpen?: undefined;\n}\n\n// Controlled: isOpen present AND at least one of onOpen/onClose must be provided.\n// We encode this by creating two branches and unioning them; supplying neither will error.\ntype ControlledProps = BaseMenuProps & {\n isOpen: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n} & (\n | { onOpen: () => void }\n | { onClose: () => void }\n | { onOpen: () => void; onClose: () => void }\n );\n\nexport type MenuProps = UncontrolledMenuProps | ControlledProps;\n\nexport const Menu = (props: ExpandProps<MenuProps>) => {\n const { children, placement, ...otherProps } = props;\n const parentId = useFloatingParentNodeId();\n\n // Set default placement based on nesting: root menus open down, nested menus open right\n const resolvedPlacement =\n placement ?? (parentId === null ? 'bottom-start' : 'right-start');\n\n const content = (\n <MenuComponent placement={resolvedPlacement} {...otherProps}>\n {children}\n </MenuComponent>\n );\n\n if (parentId === null) {\n return <FloatingTree>{content}</FloatingTree>;\n }\n\n return content;\n};\n\nMenu.displayName = 'Menu';\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuHeaderStyles = () => {\n return css({\n position: 'sticky',\n top: 0,\n left: 0,\n backgroundColor: tokens.colorWhite,\n borderBottom: `1px solid ${tokens.gray300}`,\n marginBottom: tokens.spacing2Xs,\n padding: `${tokens.spacing2Xs} 0`,\n zIndex: 1001,\n });\n};\n\nexport const getMenuFooterStyles = () => {\n return css({\n position: 'sticky',\n bottom: 0,\n left: 0,\n backgroundColor: tokens.colorWhite,\n borderTop: `1px solid ${tokens.gray300}`,\n marginTop: tokens.spacing2Xs,\n padding: `${tokens.spacing2Xs} 0`,\n zIndex: 1001,\n });\n};\n\nexport const getMenuListStyles = (props: {\n hasStickyFooter?: boolean;\n hasStickyHeader?: boolean;\n isOpen?: boolean;\n}) => ({\n container: css({\n display: props.isOpen ? 'initial' : 'none',\n // To get to our regular border radius for the inner menu items (6px),\n // we need to use 8px on the outer container\n borderRadius: '8px',\n overflowY: 'auto',\n position: 'absolute',\n top: 0,\n left: 0,\n padding: 0,\n background: tokens.colorWhite,\n paddingTop: props.hasStickyHeader ? 0 : tokens.spacing2Xs,\n paddingBottom: props.hasStickyFooter ? 0 : tokens.spacing2Xs,\n boxShadow: tokens.boxShadowDefault,\n zIndex: tokens.zIndexDropdown,\n '&:focus': {\n boxShadow: tokens.glowPrimary,\n outline: 'none',\n },\n '&:focus:not(:focus-visible)': {\n boxShadow: tokens.boxShadowDefault,\n },\n }),\n});\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\n\nimport { getMenuHeaderStyles } from './MenuList.styles';\n\nexport type MenuListHeaderProps = PropsWithHTMLElement<CommonProps, 'div'>;\n\nexport const MenuListHeader: React.FC<ExpandProps<MenuListHeaderProps>> = (\n props,\n) => {\n const {\n children,\n testId = 'cf-ui-menu-list-header',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuHeaderStyles();\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n >\n {children}\n </div>\n );\n};\n\nMenuListHeader.displayName = 'MenuListHeader';\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\n\nimport { getMenuFooterStyles } from './MenuList.styles';\n\nexport type MenuListFooterProps = PropsWithHTMLElement<CommonProps, 'div'>;\n\nexport const MenuListFooter: React.FC<ExpandProps<MenuListFooterProps>> = (\n props,\n) => {\n const {\n children,\n testId = 'cf-ui-menu-list-footer',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuFooterStyles();\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n >\n {children}\n </div>\n );\n};\n\nMenuListFooter.displayName = 'MenuListFooter';\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { useMenuContext } from '../MenuContext';\n\nimport { cx } from '@emotion/css';\nimport { getMenuListStyles } from './MenuList.styles';\nimport { MenuListHeader } from './MenuListHeader';\nimport { MenuListFooter } from './MenuListFooter';\nimport {\n FloatingList,\n FloatingPortal,\n FloatingFocusManager,\n useMergeRefs,\n} from '@floating-ui/react';\n\ninterface MenuListInternalProps extends CommonProps {\n children?: React.ReactNode;\n}\n\ntype ComponentWithDisplayName = React.ComponentType<unknown> & {\n displayName?: string;\n};\n\nfunction assertChild(\n child: React.ReactNode,\n): child is React.ReactElement<unknown, ComponentWithDisplayName> {\n if (!React.isValidElement(child)) return false;\n // Exclude intrinsic elements (strings like 'div')\n if (typeof child.type === 'string') return false;\n const type = child.type as ComponentWithDisplayName;\n return typeof type.displayName === 'string';\n}\n\nexport type MenuListProps = PropsWithHTMLElement<MenuListInternalProps, 'div'>;\n\nconst MenuListBase = (props: ExpandProps<MenuListProps>, forwardedRef) => {\n const {\n children,\n testId = 'cf-ui-menu-list',\n className,\n style,\n ...otherProps\n } = props;\n\n const menu = useMenuContext();\n let header: React.ReactElement | null = null;\n let footer: React.ReactElement | null = null;\n const items: React.ReactElement[] = [];\n\n const refs = useMergeRefs([menu.refs.setFloating, forwardedRef]);\n\n React.Children.forEach(children, (child) => {\n let appendChild = true;\n if (assertChild(child)) {\n if (child.type.displayName === MenuListHeader.displayName) {\n header = child as unknown as React.ReactElement;\n appendChild = false;\n } else if (child.type.displayName === MenuListFooter.displayName) {\n footer = child as unknown as React.ReactElement;\n appendChild = false;\n }\n }\n if (appendChild) {\n items.push(child as unknown as React.ReactElement);\n }\n });\n\n const styles = getMenuListStyles({\n hasStickyHeader: Boolean(header),\n hasStickyFooter: Boolean(footer),\n isOpen: menu.isOpen,\n });\n\n if (menu.renderOnlyWhenOpen && !menu.isOpen) {\n return null;\n }\n\n const content = (\n <div\n role=\"menu\"\n style={{ ...style, ...menu.floatingStyles }}\n className={cx(styles.container, className)}\n data-test-id={testId}\n ref={refs}\n {...otherProps}\n {...menu.getFloatingProps()}\n >\n {header}\n {items}\n {footer}\n </div>\n );\n\n const maybeWrapWithFocusManager = (node: React.ReactElement) =>\n menu.autoFocus === false ? (\n node\n ) : (\n <FloatingFocusManager\n context={menu.context}\n modal={false}\n initialFocus={menu.isNested ? -1 : 0}\n returnFocus={!menu.isNested}\n >\n {node}\n </FloatingFocusManager>\n );\n\n return (\n <FloatingList elementsRef={menu.elementsRef} labelsRef={menu.labelsRef}>\n {menu.usePortal ? (\n <FloatingPortal>\n {maybeWrapWithFocusManager(content as React.ReactElement)}\n </FloatingPortal>\n ) : (\n maybeWrapWithFocusManager(content as React.ReactElement)\n )}\n </FloatingList>\n );\n};\n\nMenuListBase.displayName = 'MenuList';\nexport const MenuList = React.forwardRef(MenuListBase);\n","import React from 'react';\nimport {\n useListItem,\n useFloatingTree,\n type FloatingTreeType,\n} from '@floating-ui/react';\nimport { MenuContext } from '../MenuContext';\n\ninterface UseMenuItemReturn {\n // State\n isActive: boolean;\n\n // Tree and context\n item: ReturnType<typeof useListItem>;\n menu: React.ContextType<typeof MenuContext>;\n tree: FloatingTreeType | null;\n\n // Props getters\n getItemProps: (\n userProps?: React.ButtonHTMLAttributes<HTMLButtonElement>,\n ) => Record<string, unknown>;\n}\n\nexport function useMenuItem(): UseMenuItemReturn {\n const menu = React.useContext(MenuContext);\n const item = useListItem();\n const tree = useFloatingTree();\n const isActive = item.index === menu.activeIndex;\n\n const getItemProps = React.useCallback(\n (userProps: React.ButtonHTMLAttributes<HTMLButtonElement> = {}) => {\n return menu.getItemProps({\n ...userProps,\n onClick(event: React.MouseEvent<HTMLButtonElement>) {\n userProps.onClick?.(event);\n tree?.events.emit('click');\n },\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n userProps.onFocus?.(event);\n menu.setHasFocusInside(true);\n },\n });\n },\n [menu, tree],\n );\n\n return {\n isActive,\n item,\n menu,\n tree,\n getItemProps,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { getMenuItemStyles as globalGetMenuItemStyles } from '@contentful/f36-core';\nimport type { MenuItemProps } from './MenuItem';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuItemStyles = ({\n isActive,\n isDisabled,\n}: {\n isActive: MenuItemProps['isActive'];\n isDisabled: MenuItemProps['isDisabled'];\n}) =>\n cx(\n globalGetMenuItemStyles({ isActive, isDisabled }),\n css({\n width: `calc(100% - 2 * ${tokens.spacing2Xs})`,\n margin: `0 ${tokens.spacing2Xs}`,\n gap: tokens.spacingXs,\n }),\n );\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport {\n useId,\n type CommonProps,\n type PolymorphicComponent,\n type PolymorphicProps,\n type ExpandProps,\n} from '@contentful/f36-core';\n\nimport { useMergeRefs } from '@floating-ui/react';\n\nimport { useMenuItem } from './useMenuItem';\nimport { getMenuItemStyles } from './MenuItem.styles';\n\nconst MENU_ITEM_DEFAULT_TAG = 'button';\n\ninterface MenuItemInternalProps extends CommonProps {\n children?: React.ReactNode;\n as?: 'a' | 'button';\n\n /**\n * Marks item as active\n */\n isActive?: boolean;\n /**\n * Marks item as disabled\n */\n isDisabled?: boolean;\n /**\n * Sets focus on item\n */\n isInitiallyFocused?: boolean;\n /**\n * Expects any of the icon components. Renders the icon aligned to the start\n */\n icon?: React.ReactElement;\n}\n\nexport type MenuItemProps<\n E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG,\n> = PolymorphicProps<MenuItemInternalProps, E>;\n\nfunction MenuItemBase<\n E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG,\n>(props: MenuItemProps<E>, forwardedRef: React.Ref<Element>) {\n const {\n testId,\n className,\n as,\n isActive = false,\n isDisabled,\n isInitiallyFocused,\n icon,\n ...otherProps\n } = props;\n const propDisabled = isDisabled ?? props.disabled;\n const menuItem = useMenuItem();\n const id = useId(undefined, 'menu-item');\n const itemTestId = testId || `cf-ui-${id}`;\n const styles = getMenuItemStyles({ isActive, isDisabled });\n\n const Element = (as ?? MENU_ITEM_DEFAULT_TAG) as React.ElementType;\n\n // If this item requests initial focus, set active index\n const { menu, item } = menuItem;\n const { setActiveIndex } = menu;\n\n React.useEffect(() => {\n if (isInitiallyFocused) {\n setActiveIndex(item.index);\n }\n }, [isInitiallyFocused, item.index, setActiveIndex]);\n\n return (\n <Element\n {...otherProps}\n ref={useMergeRefs([menuItem.item.ref, forwardedRef])}\n role=\"menuitem\"\n className={cx(styles, className)}\n data-test-id={itemTestId}\n tabIndex={menuItem.isActive ? 0 : -1}\n disabled={propDisabled}\n {...menuItem.getItemProps(otherProps)}\n >\n {icon}\n {props.children}\n </Element>\n );\n}\n\nMenuItemBase.displayName = 'MenuItem';\n\nexport const MenuItem = React.forwardRef(MenuItemBase) as PolymorphicComponent<\n ExpandProps<MenuItemInternalProps>,\n typeof MENU_ITEM_DEFAULT_TAG\n>;\n","import React from 'react';\nimport { useMergeRefs } from '@floating-ui/react';\nimport { useMenuContext } from '../MenuContext';\n\nexport interface MenuTriggerProps {\n children: React.ReactElement;\n}\nexport const MenuTrigger = React.forwardRef<HTMLElement, MenuTriggerProps>(\n function MenuTrigger({ children }, forwardedRef) {\n const menu = useMenuContext();\n const {\n refs,\n item,\n isNested,\n isOpen,\n hasFocusInside,\n setHasFocusInside,\n parent,\n } = menu;\n\n // Existing ref on the child (if any) so we can merge it.\n const childRef: React.Ref<HTMLElement> | undefined = (\n children as unknown as { ref?: React.Ref<HTMLElement> }\n ).ref;\n\n // Get children's existing props to merge event handlers\n const childProps = children.props as React.ComponentPropsWithRef<'button'>;\n\n const parentActiveIndex = parent?.activeIndex;\n const getItemProps = parent ? parent.getItemProps : menu.getItemProps;\n\n const triggerProps = {\n ref: useMergeRefs([refs.setReference, item.ref, forwardedRef, childRef]),\n tabIndex: !isNested\n ? undefined\n : parentActiveIndex === item.index\n ? 0\n : -1,\n role: isNested ? 'menuitem' : undefined,\n 'data-open': isOpen ? '' : undefined,\n 'data-nested': isNested ? '' : undefined,\n 'data-focus-inside': hasFocusInside ? '' : undefined,\n ...menu.getReferenceProps(\n getItemProps({\n onClick: childProps.onClick,\n onMouseDown: childProps.onMouseDown,\n onKeyDown: childProps.onKeyDown,\n onMouseEnter: childProps.onMouseEnter,\n onMouseLeave: childProps.onMouseLeave,\n onPointerDown: childProps.onPointerDown,\n onPointerEnter: childProps.onPointerEnter,\n onPointerLeave: childProps.onPointerLeave,\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n childProps.onFocus?.(event);\n setHasFocusInside(false);\n if (parent) parent.setHasFocusInside(true);\n },\n }),\n ),\n };\n\n return React.cloneElement(children, triggerProps);\n },\n);\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuDividerStyles = () =>\n css({\n border: 'none',\n width: '100%',\n height: '1px',\n backgroundColor: tokens.gray200,\n margin: `${tokens.spacing2Xs} 0`,\n });\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { cx } from '@emotion/css';\nimport { getMenuDividerStyles } from './MenuDivider.styles';\n\nexport type MenuDividerProps = PropsWithHTMLElement<CommonProps, 'hr'>;\n\nexport const MenuDivider = (props: ExpandProps<MenuDividerProps>) => {\n const {\n children,\n testId = 'cf-ui-menu-divider',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuDividerStyles();\n\n return (\n <hr\n aria-orientation=\"horizontal\"\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n />\n );\n};\n\nMenuDivider.displayName = 'MenuDivider';\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuSectionTitleStyles = () =>\n css({\n color: tokens.gray500,\n textAlign: 'left',\n padding: `${tokens.spacingXs} ${tokens.spacingS} ${tokens.spacing2Xs}`,\n lineHeight: tokens.lineHeightM,\n });\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport { Caption, type CaptionProps } from '@contentful/f36-typography';\nimport type { ExpandProps } from '@contentful/f36-core';\n\nimport { getMenuSectionTitleStyles } from './MenuSectionTitle.styles';\n\nexport type MenuSectionTitleProps = CaptionProps;\n\nexport const MenuSectionTitle = (props: ExpandProps<MenuSectionTitleProps>) => {\n const {\n children,\n testId = 'cf-ui-menu-section-title',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuSectionTitleStyles();\n\n return (\n <Caption\n // Techincally, menus cannot contain headings according to ARIA.\n // We hide the heading from assistive technology, and only use it\n // as a label\n aria-hidden=\"true\"\n as=\"div\"\n testId={testId}\n className={cx(styles, className)}\n marginBottom=\"none\"\n {...otherProps}\n >\n {children}\n </Caption>\n );\n};\n","import React from 'react';\nimport { Menu, type MenuProps } from '../Menu';\n\n/**\n * @deprecated Submenu is deprecated. Use Menu component instead.\n * This component will be removed in a future version.\n *\n * Migration guide:\n * Replace `<Submenu>` with `<Menu>` - the API is identical.\n */\nexport const Submenu = (props: MenuProps) => {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.warn(\n '[Submenu] This component is deprecated. Use Menu component instead. ' +\n 'Replace <Submenu> with <Menu> - the API is identical.',\n );\n }\n\n return <Menu {...props} />;\n};\n\nSubmenu.displayName = 'Submenu';\n\n/**\n * @deprecated Use MenuProps instead.\n */\nexport type SubmenuProps = MenuProps;\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getSubmenuTriggerStyles = () => {\n return {\n root: ({ isActive }) =>\n css({\n display: 'flex',\n alignItems: 'center',\n paddingRight: tokens.spacingXs,\n ...(isActive\n ? {\n backgroundColor: tokens.gray100,\n }\n : {}),\n }),\n content: css({\n marginRight: tokens.spacingM,\n }),\n icon: css({\n marginLeft: 'auto',\n fill: 'currentColor',\n }),\n };\n};\n","import React from 'react';\nimport { MenuTrigger } from '../MenuTrigger/MenuTrigger';\nimport { MenuItem, MenuItemProps } from '../MenuItem/MenuItem';\nimport { useMenuContext } from '../MenuContext';\nimport { CaretRightIcon } from '@contentful/f36-icons';\nimport type { ExpandProps } from '@contentful/f36-core';\nimport { cx } from '@emotion/css';\nimport { getSubmenuTriggerStyles } from './SubmenuTrigger.styles';\n\nexport type SubmenuTriggerProps = Omit<\n MenuItemProps<'button'>,\n 'isInitiallyFocused' | 'as'\n>;\n\nconst SubmenuTriggerBase = (\n props: ExpandProps<SubmenuTriggerProps>,\n ref: React.Ref<HTMLButtonElement>,\n) => {\n const { className, children } = props;\n\n const styles = getSubmenuTriggerStyles();\n const { isOpen } = useMenuContext();\n\n return (\n <MenuTrigger>\n <MenuItem\n {...props}\n ref={ref}\n className={cx(styles.root({ isActive: isOpen }), className)}\n >\n <span className={styles.content}>{children}</span>\n <CaretRightIcon className={styles.icon} />\n </MenuItem>\n </MenuTrigger>\n );\n};\n\nexport const SubmenuTrigger = React.forwardRef(SubmenuTriggerBase);\n","import { Menu as OriginalMenu } from './Menu';\nimport { MenuList } from './MenuList/MenuList';\nimport { MenuListHeader } from './MenuList/MenuListHeader';\nimport { MenuListFooter } from './MenuList/MenuListFooter';\nimport { MenuItem } from './MenuItem/MenuItem';\nimport { MenuTrigger } from './MenuTrigger/MenuTrigger';\nimport { MenuDivider } from './MenuDivider/MenuDivider';\nimport { MenuSectionTitle } from './MenuSectionTitle/MenuSectionTitle';\nimport { Submenu } from './Submenu/Submenu';\nimport { SubmenuTrigger } from './SubmenuTrigger/SubmenuTrigger';\n\ntype CompoundMenu = typeof OriginalMenu & {\n List: typeof MenuList;\n ListHeader: typeof MenuListHeader;\n ListFooter: typeof MenuListFooter;\n Item: typeof MenuItem;\n Trigger: typeof MenuTrigger;\n Divider: typeof MenuDivider;\n SectionTitle: typeof MenuSectionTitle;\n Submenu: typeof Submenu;\n SubmenuTrigger: typeof SubmenuTrigger;\n};\n\nexport const Menu = OriginalMenu as CompoundMenu;\nMenu.List = MenuList;\nMenu.ListHeader = MenuListHeader;\nMenu.ListFooter = MenuListFooter;\nMenu.Item = MenuItem;\nMenu.Trigger = MenuTrigger;\nMenu.Divider = MenuDivider;\nMenu.SectionTitle = MenuSectionTitle;\nMenu.Submenu = Submenu;\nMenu.SubmenuTrigger = SubmenuTrigger;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/MenuContext.ts","../../src/useMenu.ts","../../src/MenuComponent.tsx","../../src/Menu.tsx","../../src/MenuList/MenuList.styles.ts","../../src/MenuList/MenuListHeader.tsx","../../src/MenuList/MenuListFooter.tsx","../../src/MenuList/MenuList.tsx","../../src/MenuItem/useMenuItem.tsx","../../src/MenuItem/MenuItem.styles.ts","../../src/MenuItem/MenuItem.tsx","../../src/MenuTrigger/MenuTrigger.tsx","../../src/MenuDivider/MenuDivider.styles.ts","../../src/MenuDivider/MenuDivider.tsx","../../src/MenuSectionTitle/MenuSectionTitle.styles.ts","../../src/MenuSectionTitle/MenuSectionTitle.tsx","../../src/Submenu/Submenu.tsx","../../src/SubmenuTrigger/SubmenuTrigger.styles.ts","../../src/SubmenuTrigger/SubmenuTrigger.tsx","../../src/CompoundMenu.tsx"],"names":["MenuContext","React","useMenuContext","ctx","MenuContextProvider","useMenu","placement","isFullWidth","isAutoalignmentEnabled","controlledIsOpen","defaultIsOpen","onOpen","onClose","offsetProp","renderOnlyWhenOpen","usePortal","useTypeaheadProp","closeOnEsc","closeOnBlur","closeOnSelect","autoFocus","elementsRef","labelsRef","tree","useFloatingTree","nodeId","useFloatingNodeId","parentId","useFloatingParentNodeId","item","useListItem","parent","isNested","isControlled","uncontrolledIsOpen","setUncontrolledIsOpen","isOpen","prevOpenRef","handleOpenChange","nextOpen","_event","reason","wasOpen","hasFocusInside","setHasFocusInside","activeIndex","setActiveIndex","middleware","offset","sanitizedPlacement","flip","shift","autoPlacement","size","rects","elements","floatingStyles","refs","context","useFloating","autoUpdate","hover","useHover","safePolygon","click","useClick","role","useRole","dismiss","useDismiss","listNavigation","useListNavigation","typeahead","useTypeahead","getReferenceProps","getFloatingProps","getItemProps","useInteractions","handleTreeClick","onSubMenuOpen","event","MenuComponent","_a","_b","children","otherProps","__objRest","menuContext","__spreadValues","J","FloatingNode","Menu","props","resolvedPlacement","content","FloatingTree","getMenuHeaderStyles","css","tokens","getMenuFooterStyles","getMenuListStyles","MenuListHeader","testId","className","styles","cx","MenuListFooter","assertChild","child","MenuListBase","forwardedRef","style","menu","header","footer","items","useMergeRefs","appendChild","maybeWrapWithFocusManager","node","FloatingFocusManager","FloatingList","FloatingPortal","MenuList","useMenuItem","isActive","userProps","__spreadProps","getMenuItemStyles","isDisabled","globalGetMenuItemStyles","MENU_ITEM_DEFAULT_TAG","MenuItemBase","as","isInitiallyFocused","icon","propDisabled","menuItem","id","useId","itemTestId","Element","MenuItem","MenuTrigger","childRef","childProps","parentActiveIndex","triggerProps","getMenuDividerStyles","MenuDivider","getMenuSectionTitleStyles","MenuSectionTitle","Caption","Submenu","getSubmenuTriggerStyles","SubmenuTriggerBase","ref","CaretRightIcon","SubmenuTrigger"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react';\nimport type { UseMenuReturn } from './useMenu';\n\nexport const MenuContext = React.createContext<UseMenuReturn | null>(null);\n\nexport function useMenuContext() {\n const ctx = React.useContext(MenuContext);\n if (!ctx) {\n throw new Error(\n 'useMenuContext must be used within <MenuContext.Provider>',\n );\n }\n return ctx;\n}\nexport const MenuContextProvider = MenuContext.Provider;\n","import React from 'react';\nimport {\n autoUpdate,\n flip,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useRole,\n useTypeahead,\n autoPlacement,\n size,\n} from '@floating-ui/react';\nimport type { Placement, UseFloatingOptions } from '@floating-ui/react';\nimport type { MenuProps } from './Menu';\nimport { MenuContext } from './MenuContext';\n\nexport interface UseMenuReturn {\n // State\n isOpen: boolean;\n hasFocusInside: boolean;\n activeIndex: number | null;\n isNested: boolean;\n\n // Refs\n refs: {\n setReference: (node: HTMLButtonElement | null) => void;\n setFloating: (node: HTMLElement | null) => void;\n };\n elementsRef: React.RefObject<Array<HTMLButtonElement | null>>;\n labelsRef: React.RefObject<Array<string | null>>;\n\n // Floating UI\n floatingStyles: React.CSSProperties;\n context: ReturnType<typeof useFloating>['context'];\n renderOnlyWhenOpen: boolean;\n usePortal: boolean;\n autoFocus: boolean;\n\n // Props getters\n getReferenceProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n getFloatingProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n getItemProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n\n // State setters\n setHasFocusInside: React.Dispatch<React.SetStateAction<boolean>>;\n setActiveIndex: React.Dispatch<React.SetStateAction<number | null>>;\n\n // Tree and item info\n nodeId: string;\n item: ReturnType<typeof useListItem>;\n parent: React.ContextType<typeof MenuContext>;\n}\n\nexport function useMenu({\n placement,\n isFullWidth = false,\n isAutoalignmentEnabled = true,\n isOpen: controlledIsOpen,\n defaultIsOpen = false,\n onOpen,\n onClose,\n offset: offsetProp,\n renderOnlyWhenOpen = true,\n usePortal = true,\n useTypeahead: useTypeaheadProp = false,\n closeOnEsc = true,\n closeOnBlur = true,\n closeOnSelect = true,\n autoFocus = true,\n}: MenuProps): UseMenuReturn {\n const elementsRef = React.useRef<Array<HTMLButtonElement | null>>([]);\n const labelsRef = React.useRef<Array<string | null>>([]);\n\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const item = useListItem();\n const parent = React.useContext(MenuContext);\n\n const isNested = parentId != null;\n\n /**\n * Handle open and closed state\n * supports controlled and uncontrolled behavior\n * */\n const isControlled = controlledIsOpen !== undefined;\n const [uncontrolledIsOpen, setUncontrolledIsOpen] =\n React.useState(defaultIsOpen);\n const isOpen = isControlled ? controlledIsOpen : uncontrolledIsOpen;\n\n // Track previous open for transition detection\n const prevOpenRef = React.useRef(isOpen);\n React.useEffect(() => {\n prevOpenRef.current = isOpen;\n }, [isOpen]);\n\n const handleOpenChange = React.useCallback<\n UseFloatingOptions['onOpenChange']\n >(\n (nextOpen, _event, reason) => {\n // if the user made component controlled by providing isOpen prop\n // but onOpen callback is not provided, we won't add toggle logic\n // to the trigger component. So they can make any toggle logic on their own.\n const isFullyControlled = isControlled && !onOpen;\n if (isFullyControlled && reason === 'click') {\n return;\n }\n\n const wasOpen = prevOpenRef.current;\n if (nextOpen === wasOpen) {\n return;\n }\n\n if (!isControlled) {\n setUncontrolledIsOpen(nextOpen);\n }\n\n if (nextOpen) {\n onOpen?.();\n } else {\n onClose?.();\n }\n },\n [isControlled, onOpen, onClose],\n );\n\n // Focus Handling\n const [hasFocusInside, setHasFocusInside] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState<number>(0);\n\n /** Configure middleware based on placement with offset\n * and isAutoalignmentEnabled\n * If placement is \"auto\" it will use autoPlacement() in the middleware and not make use of flip and switch.\n * If isAutoalignmentEnabled is false, it will also not use flip and switch but only use the placement variable.\n */\n\n const offsetOption = offsetProp\n ? offsetProp\n : isNested\n ? { mainAxis: 4, alignmentAxis: -4 }\n : 5;\n\n const middleware = [offset(offsetOption)];\n\n // sanitize the placement to allow auto setting alongside with isAutoalignmentEnabled\n\n let sanitizedPlacement: Placement;\n\n if (placement !== 'auto' && isAutoalignmentEnabled) {\n sanitizedPlacement = placement;\n middleware.push(flip({ padding: 5 }), shift({ padding: 5 }));\n } else if (placement === 'auto') {\n middleware.push(autoPlacement());\n } else {\n sanitizedPlacement = placement;\n }\n\n /**\n * Set to same size as trigger reference element\n */\n if (isFullWidth) {\n middleware.push(\n size({\n apply({ rects, elements }) {\n Object.assign(elements.floating.style, {\n minWidth: `${rects.reference.width}px`,\n });\n },\n }),\n );\n }\n\n const { floatingStyles, refs, context } = useFloating<HTMLButtonElement>({\n nodeId,\n open: isOpen,\n onOpenChange: handleOpenChange,\n whileElementsMounted: autoUpdate,\n placement: sanitizedPlacement,\n middleware,\n });\n\n const hover = useHover(context, {\n enabled: isNested,\n delay: { open: 75 },\n handleClose: safePolygon({ blockPointerEvents: true }),\n });\n const click = useClick(context, {\n event: 'mousedown',\n toggle: !isNested,\n ignoreMouse: isNested,\n });\n const role = useRole(context, { role: 'menu' });\n\n const dismiss = useDismiss(context, {\n escapeKey: closeOnEsc,\n outsidePress: closeOnBlur,\n bubbles: true,\n });\n\n const listNavigation = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: isNested,\n onNavigate: setActiveIndex,\n loop: true,\n });\n\n const typeahead = useTypeahead(context, {\n enabled: useTypeaheadProp,\n listRef: labelsRef,\n onMatch: isOpen ? setActiveIndex : undefined,\n activeIndex,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNavigation, typeahead],\n );\n\n // Event emitter allows you to communicate across tree components.\n // This effect closes all menus when an item gets clicked anywhere\n // in the tree.\n React.useEffect(() => {\n if (!tree) return;\n\n function handleTreeClick() {\n // Only close menus on item click if the consumer opted in via closeOnSelect\n if (closeOnSelect) {\n handleOpenChange(false);\n }\n }\n\n function onSubMenuOpen(event: { nodeId: string; parentId: string }) {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n handleOpenChange(false);\n }\n }\n\n tree.events.on('click', handleTreeClick);\n tree.events.on('menuopen', onSubMenuOpen);\n\n return () => {\n tree.events.off('click', handleTreeClick);\n tree.events.off('menuopen', onSubMenuOpen);\n };\n }, [tree, nodeId, parentId, handleOpenChange, closeOnSelect]);\n\n React.useEffect(() => {\n if (isOpen && tree) {\n tree.events.emit('menuopen', { parentId, nodeId });\n }\n }, [tree, isOpen, nodeId, parentId]);\n\n return React.useMemo(\n () => ({\n // State\n isOpen,\n hasFocusInside,\n activeIndex,\n isNested,\n\n // Refs\n refs,\n elementsRef,\n labelsRef,\n\n // Floating UI\n floatingStyles,\n context,\n renderOnlyWhenOpen,\n usePortal,\n autoFocus,\n\n // Props getters\n getReferenceProps,\n getFloatingProps,\n getItemProps,\n\n // State setters\n setHasFocusInside,\n setActiveIndex,\n\n // Tree and item info\n nodeId,\n item,\n parent,\n }),\n [\n activeIndex,\n context,\n floatingStyles,\n getFloatingProps,\n getItemProps,\n getReferenceProps,\n hasFocusInside,\n isNested,\n isOpen,\n item,\n nodeId,\n parent,\n refs,\n renderOnlyWhenOpen,\n usePortal,\n autoFocus,\n ],\n );\n}\n","import * as React from 'react';\nimport { FloatingNode } from '@floating-ui/react';\nimport type { ExpandProps } from '@contentful/f36-core';\nimport { useMenu } from './useMenu';\nimport { MenuContextProvider } from './MenuContext';\nimport type { MenuProps } from './Menu';\n\nexport const MenuComponent = ({\n children,\n ...otherProps\n}: ExpandProps<MenuProps>) => {\n const menuContext = useMenu({ ...otherProps });\n return (\n <MenuContextProvider value={menuContext}>\n <FloatingNode id={menuContext.nodeId}>{children}</FloatingNode>\n </MenuContextProvider>\n );\n};\n","import React from 'react';\nimport {\n useFloatingParentNodeId,\n FloatingTree,\n type Placement,\n type OffsetOptions,\n} from '@floating-ui/react';\nimport { MenuComponent } from './MenuComponent';\nimport type { ExpandProps } from '@contentful/f36-core';\n\ntype BaseMenuProps = {\n /**\n * Boolean to determine if the Popover should be the same width as\n * the trigger element\n *\n * @default false\n */\n isFullWidth?: boolean;\n\n /**\n * If `true`, the Menu will be initially opened. This property has no influence on the uncontrolled status of the Menu\n */\n defaultIsOpen?: boolean;\n\n /**\n * Callback fired when the Menu opens\n */\n onOpen?: () => void;\n\n /**\n * Callback fired when the Menu closes\n */\n onClose?: () => void;\n\n /**\n * Determines the preferred position of where the MenuList opens. This position is not\n * guaranteed, as the MenuList might be moved to fit the viewport.\n *\n * @default bottom-start OR right-start\n */\n placement?: Placement | 'auto';\n\n /**\n * Boolean to control if popover is allowed to change its placement automatically\n * based on available space in the viewport.\n *\n * For example:\n * If you set placement prop to bottom, but there isn't enough space to position the popover in that direction,\n * it will change the popper placement to top. As soon as enough space is detected, the placement will be reverted to the defined one.\n *\n * If you want the popover to strictly follow the placement prop you should set this prop to false.\n *\n * @default true\n */\n isAutoalignmentEnabled?: boolean;\n\n /**\n * Single number as short hand for `mainAxis`\n * Or object which can contain `mainAxis`, `crossAxis` or `alignmentAxis`\n *\n * @default 0\n */\n offset?: OffsetOptions;\n\n /**\n * Defines if the menu list content should be rendered in the DOM only when it's open\n * or all the time (after the component has been mounted)\n *\n * @default true\n */\n renderOnlyWhenOpen?: boolean;\n\n /**\n * If `true`, the Menu will close when a menu item is\n * clicked\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnSelect?: boolean;\n\n /**\n * If true, the menu will close when you blur out it by clicking outside\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnBlur?: boolean;\n\n /**\n * If true, the menu will close when you hit the Esc key\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnEsc?: boolean;\n\n /**\n * Boolean to control whether or not to render the Menu in a React Portal.\n * Rendering content inside a Portal allows the Menu to escape the bounds\n * of its parent while still being positioned correctly. Using a Portal is\n * necessary if an ancestor of the Menu hides overflow.\n *\n * @default true\n */\n usePortal?: boolean;\n\n /**\n * Boolean to control wether or not to enable Typeahead functionality\n * which enables focus an item as the user types\n */\n useTypeahead?: boolean;\n\n /**\n * If true, the Menu will be focused after opening\n *\n * @default true\n */\n autoFocus?: boolean;\n\n /**\n * Menu compound children (Trigger, List, Item, etc.)\n */\n children?: React.ReactNode;\n};\n\n// Uncontrolled: no isOpen prop\ninterface UncontrolledMenuProps extends BaseMenuProps {\n isOpen?: undefined;\n}\n\n// Controlled: isOpen present AND at least one of onOpen/onClose must be provided.\n// We encode this by creating two branches and unioning them; supplying neither will error.\ntype ControlledProps = BaseMenuProps & {\n isOpen: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n} & (\n | { onOpen: () => void }\n | { onClose: () => void }\n | { onOpen: () => void; onClose: () => void }\n );\n\nexport type MenuProps = UncontrolledMenuProps | ControlledProps;\n\nexport const Menu = (props: ExpandProps<MenuProps>) => {\n const { children, placement, ...otherProps } = props;\n const parentId = useFloatingParentNodeId();\n\n // Set default placement based on nesting: root menus open down, nested menus open right\n const resolvedPlacement =\n placement ?? (parentId === null ? 'bottom-start' : 'right-start');\n\n const content = (\n <MenuComponent placement={resolvedPlacement} {...otherProps}>\n {children}\n </MenuComponent>\n );\n\n if (parentId === null) {\n return <FloatingTree>{content}</FloatingTree>;\n }\n\n return content;\n};\n\nMenu.displayName = 'Menu';\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuHeaderStyles = () => {\n return css({\n position: 'sticky',\n top: 0,\n left: 0,\n backgroundColor: tokens.colorWhite,\n borderBottom: `1px solid ${tokens.gray300}`,\n marginBottom: tokens.spacing2Xs,\n padding: `${tokens.spacing2Xs} 0`,\n zIndex: 1001,\n });\n};\n\nexport const getMenuFooterStyles = () => {\n return css({\n position: 'sticky',\n bottom: 0,\n left: 0,\n backgroundColor: tokens.colorWhite,\n borderTop: `1px solid ${tokens.gray300}`,\n marginTop: tokens.spacing2Xs,\n padding: `${tokens.spacing2Xs} 0`,\n zIndex: 1001,\n });\n};\n\nexport const getMenuListStyles = (props: {\n hasStickyFooter?: boolean;\n hasStickyHeader?: boolean;\n isOpen?: boolean;\n}) => ({\n container: css({\n display: props.isOpen ? 'initial' : 'none',\n // To get to our regular border radius for the inner menu items (6px),\n // we need to use 8px on the outer container\n borderRadius: '8px',\n overflowY: 'auto',\n position: 'absolute',\n top: 0,\n left: 0,\n padding: 0,\n background: tokens.colorWhite,\n paddingTop: props.hasStickyHeader ? 0 : tokens.spacing2Xs,\n paddingBottom: props.hasStickyFooter ? 0 : tokens.spacing2Xs,\n boxShadow: tokens.boxShadowDefault,\n zIndex: tokens.zIndexDropdown,\n '&:focus': {\n boxShadow: tokens.glowPrimary,\n outline: 'none',\n },\n '&:focus:not(:focus-visible)': {\n boxShadow: tokens.boxShadowDefault,\n },\n }),\n});\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\n\nimport { getMenuHeaderStyles } from './MenuList.styles';\n\nexport type MenuListHeaderProps = PropsWithHTMLElement<CommonProps, 'div'>;\n\nexport const MenuListHeader: React.FC<ExpandProps<MenuListHeaderProps>> = (\n props,\n) => {\n const {\n children,\n testId = 'cf-ui-menu-list-header',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuHeaderStyles();\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n >\n {children}\n </div>\n );\n};\n\nMenuListHeader.displayName = 'MenuListHeader';\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\n\nimport { getMenuFooterStyles } from './MenuList.styles';\n\nexport type MenuListFooterProps = PropsWithHTMLElement<CommonProps, 'div'>;\n\nexport const MenuListFooter: React.FC<ExpandProps<MenuListFooterProps>> = (\n props,\n) => {\n const {\n children,\n testId = 'cf-ui-menu-list-footer',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuFooterStyles();\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n >\n {children}\n </div>\n );\n};\n\nMenuListFooter.displayName = 'MenuListFooter';\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { useMenuContext } from '../MenuContext';\n\nimport { cx } from '@emotion/css';\nimport { getMenuListStyles } from './MenuList.styles';\nimport { MenuListHeader } from './MenuListHeader';\nimport { MenuListFooter } from './MenuListFooter';\nimport {\n FloatingList,\n FloatingPortal,\n FloatingFocusManager,\n useMergeRefs,\n} from '@floating-ui/react';\n\ninterface MenuListInternalProps extends CommonProps {\n children?: React.ReactNode;\n}\n\ntype ComponentWithDisplayName = React.ComponentType<unknown> & {\n displayName?: string;\n};\n\nfunction assertChild(\n child: React.ReactNode,\n): child is React.ReactElement<unknown, ComponentWithDisplayName> {\n if (!React.isValidElement(child)) return false;\n // Exclude intrinsic elements (strings like 'div')\n if (typeof child.type === 'string') return false;\n const type = child.type as ComponentWithDisplayName;\n return typeof type.displayName === 'string';\n}\n\nexport type MenuListProps = PropsWithHTMLElement<MenuListInternalProps, 'div'>;\n\nconst MenuListBase = (props: ExpandProps<MenuListProps>, forwardedRef) => {\n const {\n children,\n testId = 'cf-ui-menu-list',\n className,\n style,\n ...otherProps\n } = props;\n\n const menu = useMenuContext();\n let header: React.ReactElement | null = null;\n let footer: React.ReactElement | null = null;\n const items: React.ReactElement[] = [];\n\n const refs = useMergeRefs([menu.refs.setFloating, forwardedRef]);\n\n React.Children.forEach(children, (child) => {\n let appendChild = true;\n if (assertChild(child)) {\n if (child.type.displayName === MenuListHeader.displayName) {\n header = child as unknown as React.ReactElement;\n appendChild = false;\n } else if (child.type.displayName === MenuListFooter.displayName) {\n footer = child as unknown as React.ReactElement;\n appendChild = false;\n }\n }\n if (appendChild) {\n items.push(child as unknown as React.ReactElement);\n }\n });\n\n const styles = getMenuListStyles({\n hasStickyHeader: Boolean(header),\n hasStickyFooter: Boolean(footer),\n isOpen: menu.isOpen,\n });\n\n if (menu.renderOnlyWhenOpen && !menu.isOpen) {\n return null;\n }\n\n const content = (\n <div\n role=\"menu\"\n style={{ ...style, ...menu.floatingStyles }}\n className={cx(styles.container, className)}\n data-test-id={testId}\n ref={refs}\n {...otherProps}\n {...menu.getFloatingProps()}\n >\n {header}\n {items}\n {footer}\n </div>\n );\n\n const maybeWrapWithFocusManager = (node: React.ReactElement) =>\n menu.autoFocus === false ? (\n node\n ) : (\n <FloatingFocusManager\n context={menu.context}\n modal={false}\n initialFocus={menu.isNested ? -1 : 0}\n returnFocus={!menu.isNested}\n >\n {node}\n </FloatingFocusManager>\n );\n\n return (\n <FloatingList elementsRef={menu.elementsRef} labelsRef={menu.labelsRef}>\n {menu.usePortal ? (\n <FloatingPortal>\n {maybeWrapWithFocusManager(content as React.ReactElement)}\n </FloatingPortal>\n ) : (\n maybeWrapWithFocusManager(content as React.ReactElement)\n )}\n </FloatingList>\n );\n};\n\nMenuListBase.displayName = 'MenuList';\nexport const MenuList = React.forwardRef(MenuListBase);\n","import React from 'react';\nimport {\n useListItem,\n useFloatingTree,\n type FloatingTreeType,\n} from '@floating-ui/react';\nimport { MenuContext } from '../MenuContext';\n\ninterface UseMenuItemReturn {\n // State\n isActive: boolean;\n\n // Tree and context\n item: ReturnType<typeof useListItem>;\n menu: React.ContextType<typeof MenuContext>;\n tree: FloatingTreeType | null;\n\n // Props getters\n getItemProps: (\n userProps?: React.ButtonHTMLAttributes<HTMLButtonElement>,\n ) => Record<string, unknown>;\n}\n\nexport function useMenuItem(): UseMenuItemReturn {\n const menu = React.useContext(MenuContext);\n const item = useListItem();\n const tree = useFloatingTree();\n const isActive = item.index === menu.activeIndex;\n\n const getItemProps = React.useCallback(\n (userProps: React.ButtonHTMLAttributes<HTMLButtonElement> = {}) => {\n return menu.getItemProps({\n ...userProps,\n onClick(event: React.MouseEvent<HTMLButtonElement>) {\n userProps.onClick?.(event);\n tree?.events.emit('click');\n },\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n userProps.onFocus?.(event);\n menu.setHasFocusInside(true);\n },\n });\n },\n [menu, tree],\n );\n\n return {\n isActive,\n item,\n menu,\n tree,\n getItemProps,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { getMenuItemStyles as globalGetMenuItemStyles } from '@contentful/f36-core';\nimport type { MenuItemProps } from './MenuItem';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuItemStyles = ({\n isActive,\n isDisabled,\n}: {\n isActive: MenuItemProps['isActive'];\n isDisabled: MenuItemProps['isDisabled'];\n}) =>\n cx(\n globalGetMenuItemStyles({ isActive, isDisabled }),\n css({\n width: `calc(100% - 2 * ${tokens.spacing2Xs})`,\n margin: `0 ${tokens.spacing2Xs}`,\n gap: tokens.spacingXs,\n }),\n );\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport {\n useId,\n type CommonProps,\n type PolymorphicComponent,\n type PolymorphicProps,\n type ExpandProps,\n} from '@contentful/f36-core';\n\nimport { useMergeRefs } from '@floating-ui/react';\n\nimport { useMenuItem } from './useMenuItem';\nimport { getMenuItemStyles } from './MenuItem.styles';\n\nconst MENU_ITEM_DEFAULT_TAG = 'button';\n\ninterface MenuItemInternalProps extends CommonProps {\n children?: React.ReactNode;\n as?: 'a' | 'button';\n\n /**\n * Marks item as active\n */\n isActive?: boolean;\n /**\n * Marks item as disabled\n */\n isDisabled?: boolean;\n /**\n * Sets focus on item\n */\n isInitiallyFocused?: boolean;\n /**\n * Expects any of the icon components. Renders the icon aligned to the start\n */\n icon?: React.ReactElement;\n}\n\nexport type MenuItemProps<\n E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG,\n> = PolymorphicProps<MenuItemInternalProps, E>;\n\nfunction MenuItemBase<\n E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG,\n>(props: MenuItemProps<E>, forwardedRef: React.Ref<Element>) {\n const {\n testId,\n className,\n as,\n isActive = false,\n isDisabled,\n isInitiallyFocused,\n icon,\n ...otherProps\n } = props;\n const propDisabled = isDisabled ?? props.disabled;\n const menuItem = useMenuItem();\n const id = useId(undefined, 'menu-item');\n const itemTestId = testId || `cf-ui-${id}`;\n const styles = getMenuItemStyles({ isActive, isDisabled });\n\n const Element = (as ?? MENU_ITEM_DEFAULT_TAG) as React.ElementType;\n\n // If this item requests initial focus, set active index\n const { menu, item } = menuItem;\n const { setActiveIndex } = menu;\n\n React.useEffect(() => {\n if (isInitiallyFocused) {\n setActiveIndex(item.index);\n }\n }, [isInitiallyFocused, item.index, setActiveIndex]);\n\n return (\n <Element\n {...otherProps}\n ref={useMergeRefs([menuItem.item.ref, forwardedRef])}\n role=\"menuitem\"\n className={cx(styles, className)}\n data-test-id={itemTestId}\n tabIndex={menuItem.isActive ? 0 : -1}\n disabled={propDisabled}\n {...menuItem.getItemProps(otherProps)}\n >\n {icon}\n {props.children}\n </Element>\n );\n}\n\nMenuItemBase.displayName = 'MenuItem';\n\nexport const MenuItem = React.forwardRef(MenuItemBase) as PolymorphicComponent<\n ExpandProps<MenuItemInternalProps>,\n typeof MENU_ITEM_DEFAULT_TAG\n>;\n","import React from 'react';\nimport { useMergeRefs } from '@floating-ui/react';\nimport { useMenuContext } from '../MenuContext';\n\nexport interface MenuTriggerProps {\n children: React.ReactElement;\n}\nexport const MenuTrigger = React.forwardRef<HTMLElement, MenuTriggerProps>(\n function MenuTrigger({ children }, forwardedRef) {\n const menu = useMenuContext();\n const {\n refs,\n item,\n isNested,\n isOpen,\n hasFocusInside,\n setHasFocusInside,\n parent,\n } = menu;\n\n // Existing ref on the child (if any) so we can merge it.\n const childRef: React.Ref<HTMLElement> | undefined = (\n children as unknown as { ref?: React.Ref<HTMLElement> }\n ).ref;\n\n // Get children's existing props to merge event handlers\n const childProps = children.props as React.ComponentPropsWithRef<'button'>;\n\n const parentActiveIndex = parent?.activeIndex;\n const getItemProps = parent ? parent.getItemProps : menu.getItemProps;\n\n const triggerProps = {\n ref: useMergeRefs([refs.setReference, item.ref, forwardedRef, childRef]),\n tabIndex: !isNested\n ? undefined\n : parentActiveIndex === item.index\n ? 0\n : -1,\n role: isNested ? 'menuitem' : undefined,\n 'data-open': isOpen ? '' : undefined,\n 'data-nested': isNested ? '' : undefined,\n 'data-focus-inside': hasFocusInside ? '' : undefined,\n ...menu.getReferenceProps(\n getItemProps({\n onClick: childProps.onClick,\n onMouseDown: childProps.onMouseDown,\n onKeyDown: childProps.onKeyDown,\n onMouseEnter: childProps.onMouseEnter,\n onMouseLeave: childProps.onMouseLeave,\n onPointerDown: childProps.onPointerDown,\n onPointerEnter: childProps.onPointerEnter,\n onPointerLeave: childProps.onPointerLeave,\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n childProps.onFocus?.(event);\n setHasFocusInside(false);\n if (parent) parent.setHasFocusInside(true);\n },\n }),\n ),\n };\n\n return React.cloneElement(children, triggerProps);\n },\n);\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuDividerStyles = () =>\n css({\n border: 'none',\n width: '100%',\n height: '1px',\n backgroundColor: tokens.gray200,\n margin: `${tokens.spacing2Xs} 0`,\n });\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { cx } from '@emotion/css';\nimport { getMenuDividerStyles } from './MenuDivider.styles';\n\nexport type MenuDividerProps = PropsWithHTMLElement<CommonProps, 'hr'>;\n\nexport const MenuDivider = (props: ExpandProps<MenuDividerProps>) => {\n const {\n children,\n testId = 'cf-ui-menu-divider',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuDividerStyles();\n\n return (\n <hr\n aria-orientation=\"horizontal\"\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n />\n );\n};\n\nMenuDivider.displayName = 'MenuDivider';\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuSectionTitleStyles = () =>\n css({\n color: tokens.gray500,\n textAlign: 'left',\n padding: `${tokens.spacingXs} ${tokens.spacingS} ${tokens.spacing2Xs}`,\n lineHeight: tokens.lineHeightM,\n });\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport { Caption, type CaptionProps } from '@contentful/f36-typography';\nimport type { ExpandProps } from '@contentful/f36-core';\n\nimport { getMenuSectionTitleStyles } from './MenuSectionTitle.styles';\n\nexport type MenuSectionTitleProps = CaptionProps;\n\nexport const MenuSectionTitle = (props: ExpandProps<MenuSectionTitleProps>) => {\n const {\n children,\n testId = 'cf-ui-menu-section-title',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuSectionTitleStyles();\n\n return (\n <Caption\n // Techincally, menus cannot contain headings according to ARIA.\n // We hide the heading from assistive technology, and only use it\n // as a label\n aria-hidden=\"true\"\n as=\"div\"\n testId={testId}\n className={cx(styles, className)}\n marginBottom=\"none\"\n {...otherProps}\n >\n {children}\n </Caption>\n );\n};\n","import React from 'react';\nimport { Menu, type MenuProps } from '../Menu';\n\n/**\n * @deprecated Submenu is deprecated. Use Menu component instead.\n * This component will be removed in a future version.\n *\n * Migration guide:\n * Replace `<Submenu>` with `<Menu>` - the API is identical.\n */\nexport const Submenu = (props: MenuProps) => {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.warn(\n '[Submenu] This component is deprecated. Use Menu component instead. ' +\n 'Replace <Submenu> with <Menu> - the API is identical.',\n );\n }\n\n return <Menu {...props} />;\n};\n\nSubmenu.displayName = 'Submenu';\n\n/**\n * @deprecated Use MenuProps instead.\n */\nexport type SubmenuProps = MenuProps;\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getSubmenuTriggerStyles = () => {\n return {\n root: ({ isActive }) =>\n css({\n display: 'flex',\n alignItems: 'center',\n paddingRight: tokens.spacingXs,\n ...(isActive\n ? {\n backgroundColor: tokens.gray100,\n }\n : {}),\n }),\n content: css({\n marginRight: tokens.spacingM,\n }),\n icon: css({\n marginLeft: 'auto',\n fill: 'currentColor',\n }),\n };\n};\n","import React from 'react';\nimport { MenuTrigger } from '../MenuTrigger/MenuTrigger';\nimport { MenuItem, MenuItemProps } from '../MenuItem/MenuItem';\nimport { useMenuContext } from '../MenuContext';\nimport { CaretRightIcon } from '@contentful/f36-icons';\nimport type { ExpandProps } from '@contentful/f36-core';\nimport { cx } from '@emotion/css';\nimport { getSubmenuTriggerStyles } from './SubmenuTrigger.styles';\n\nexport type SubmenuTriggerProps = Omit<\n MenuItemProps<'button'>,\n 'isInitiallyFocused' | 'as'\n>;\n\nconst SubmenuTriggerBase = (\n props: ExpandProps<SubmenuTriggerProps>,\n ref: React.Ref<HTMLButtonElement>,\n) => {\n const { className, children } = props;\n\n const styles = getSubmenuTriggerStyles();\n const { isOpen } = useMenuContext();\n\n return (\n <MenuTrigger>\n <MenuItem\n {...props}\n ref={ref}\n className={cx(styles.root({ isActive: isOpen }), className)}\n >\n <span className={styles.content}>{children}</span>\n <CaretRightIcon className={styles.icon} />\n </MenuItem>\n </MenuTrigger>\n );\n};\n\nexport const SubmenuTrigger = React.forwardRef(SubmenuTriggerBase);\n","import { Menu as OriginalMenu } from './Menu';\nimport { MenuList } from './MenuList/MenuList';\nimport { MenuListHeader } from './MenuList/MenuListHeader';\nimport { MenuListFooter } from './MenuList/MenuListFooter';\nimport { MenuItem } from './MenuItem/MenuItem';\nimport { MenuTrigger } from './MenuTrigger/MenuTrigger';\nimport { MenuDivider } from './MenuDivider/MenuDivider';\nimport { MenuSectionTitle } from './MenuSectionTitle/MenuSectionTitle';\nimport { Submenu } from './Submenu/Submenu';\nimport { SubmenuTrigger } from './SubmenuTrigger/SubmenuTrigger';\n\ntype CompoundMenu = typeof OriginalMenu & {\n List: typeof MenuList;\n ListHeader: typeof MenuListHeader;\n ListFooter: typeof MenuListFooter;\n Item: typeof MenuItem;\n Trigger: typeof MenuTrigger;\n Divider: typeof MenuDivider;\n SectionTitle: typeof MenuSectionTitle;\n Submenu: typeof Submenu;\n SubmenuTrigger: typeof SubmenuTrigger;\n};\n\nexport const Menu = OriginalMenu as CompoundMenu;\nMenu.List = MenuList;\nMenu.ListHeader = MenuListHeader;\nMenu.ListFooter = MenuListFooter;\nMenu.Item = MenuItem;\nMenu.Trigger = MenuTrigger;\nMenu.Divider = MenuDivider;\nMenu.SectionTitle = MenuSectionTitle;\nMenu.Submenu = Submenu;\nMenu.SubmenuTrigger = SubmenuTrigger;\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -94,6 +94,11 @@ type BaseMenuProps = {
|
|
|
94
94
|
* @default true
|
|
95
95
|
*/
|
|
96
96
|
usePortal?: boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Boolean to control wether or not to enable Typeahead functionality
|
|
99
|
+
* which enables focus an item as the user types
|
|
100
|
+
*/
|
|
101
|
+
useTypeahead?: boolean;
|
|
97
102
|
/**
|
|
98
103
|
* If true, the Menu will be focused after opening
|
|
99
104
|
*
|
package/dist/index.d.ts
CHANGED
|
@@ -94,6 +94,11 @@ type BaseMenuProps = {
|
|
|
94
94
|
* @default true
|
|
95
95
|
*/
|
|
96
96
|
usePortal?: boolean;
|
|
97
|
+
/**
|
|
98
|
+
* Boolean to control wether or not to enable Typeahead functionality
|
|
99
|
+
* which enables focus an item as the user types
|
|
100
|
+
*/
|
|
101
|
+
useTypeahead?: boolean;
|
|
97
102
|
/**
|
|
98
103
|
* If true, the Menu will be focused after opening
|
|
99
104
|
*
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var g=require('react'),react=require('@floating-ui/react'),css=require('@emotion/css'),d=require('@contentful/f36-tokens'),f36Core=require('@contentful/f36-core'),f36Typography=require('@contentful/f36-typography'),f36Icons=require('@contentful/f36-icons');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var g__namespace=/*#__PURE__*/_interopNamespace(g);var d__default=/*#__PURE__*/_interopDefault(d);var Ge=Object.defineProperty,je=Object.defineProperties;var Ke=Object.getOwnPropertyDescriptors;var j=Object.getOwnPropertySymbols;var ge=Object.prototype.hasOwnProperty,Me=Object.prototype.propertyIsEnumerable;var fe=(e,t,o)=>t in e?Ge(e,t,{enumerable:true,configurable:true,writable:true,value:o}):e[t]=o,a=(e,t)=>{for(var o in t||(t={}))ge.call(t,o)&&fe(e,o,t[o]);if(j)for(var o of j(t))Me.call(t,o)&&fe(e,o,t[o]);return e},L=(e,t)=>je(e,Ke(t));var c=(e,t)=>{var o={};for(var n in e)ge.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(e!=null&&j)for(var n of j(e))t.indexOf(n)<0&&Me.call(e,n)&&(o[n]=e[n]);return o};var F=g__namespace.default.createContext(null);function N(){let e=g__namespace.default.useContext(F);if(!e)throw new Error("useMenuContext must be used within <MenuContext.Provider>");return e}var Pe=F.Provider;function xe({placement:e,isFullWidth:t=false,isAutoalignmentEnabled:o=true,isOpen:n,defaultIsOpen:u=false,onOpen:s,onClose:r,offset:i,renderOnlyWhenOpen:y=true,usePortal:M=true,closeOnEsc:f=true,closeOnBlur:P=true,closeOnSelect:m=true,autoFocus:R=true}){let I=g__namespace.default.useRef([]),b=g__namespace.default.useRef([]),p=react.useFloatingTree(),l=react.useFloatingNodeId(),h=react.useFloatingParentNodeId(),H=react.useListItem(),ie=g__namespace.default.useContext(F),S=h!=null,_=n!==void 0,[De,Oe]=g__namespace.default.useState(u),T=_?n:De,ae=g__namespace.default.useRef(T);g__namespace.default.useEffect(()=>{ae.current=T;},[T]);let X=g__namespace.default.useCallback((v,k,G)=>{if(_&&!s&&G==="click")return;let ze=ae.current;v!==ze&&(_||Oe(v),v?s==null||s():r==null||r());},[_,s,r]),[ue,Ae]=g__namespace.default.useState(false),[$,Y]=g__namespace.default.useState(0),z=[react.offset(i||(S?{mainAxis:4,alignmentAxis:-4}:5))],q;e!=="auto"&&o?(q=e,z.push(react.flip({padding:5}),react.shift({padding:5}))):e==="auto"?z.push(react.autoPlacement()):q=e,t&&z.push(react.size({apply({rects:v,elements:k}){Object.assign(k.floating.style,{minWidth:`${v.reference.width}px`});}}));let{floatingStyles:pe,refs:me,context:E}=react.useFloating({nodeId:l,open:T,onOpenChange:X,whileElementsMounted:react.autoUpdate,placement:q,middleware:z}),Be=react.useHover(E,{enabled:S,delay:{open:75},handleClose:react.safePolygon({blockPointerEvents:true})}),We=react.useClick(E,{event:"mousedown",toggle:!S,ignoreMouse:S}),Ue=react.useRole(E,{role:"menu"}),_e=react.useDismiss(E,{escapeKey:f,outsidePress:P,bubbles:true}),Xe=react.useListNavigation(E,{listRef:I,activeIndex:$,nested:S,onNavigate:Y,loop:true}),$e=react.useTypeahead(E,{listRef:b,onMatch:T?Y:void 0,activeIndex:$}),{getReferenceProps:le,getFloatingProps:ce,getItemProps:de}=react.useInteractions([Be,We,Ue,_e,Xe,$e]);return g__namespace.default.useEffect(()=>{if(!p)return;function v(){m&&X(false);}function k(G){G.nodeId!==l&&G.parentId===h&&X(false);}return p.events.on("click",v),p.events.on("menuopen",k),()=>{p.events.off("click",v),p.events.off("menuopen",k);}},[p,l,h,X,m]),g__namespace.default.useEffect(()=>{T&&p&&p.events.emit("menuopen",{parentId:h,nodeId:l});},[p,T,l,h]),g__namespace.default.useMemo(()=>({isOpen:T,hasFocusInside:ue,activeIndex:$,isNested:S,refs:me,elementsRef:I,labelsRef:b,floatingStyles:pe,context:E,renderOnlyWhenOpen:y,usePortal:M,autoFocus:R,getReferenceProps:le,getFloatingProps:ce,getItemProps:de,setHasFocusInside:Ae,setActiveIndex:Y,nodeId:l,item:H,parent:ie}),[$,E,pe,ce,de,le,ue,S,T,H,l,ie,me,y,M,R])}var Re=o=>{var n=o,{children:e}=n,t=c(n,["children"]);let u=xe(a({},t));return g__namespace.createElement(Pe,{value:u},g__namespace.createElement(react.FloatingNode,{id:u.nodeId},e))};var w=e=>{let i=e,{children:t,placement:o}=i,n=c(i,["children","placement"]),u=react.useFloatingParentNodeId(),s=o!=null?o:u===null?"bottom-start":"right-start",r=g__namespace.default.createElement(Re,a({placement:s},n),t);return u===null?g__namespace.default.createElement(react.FloatingTree,null,r):r};w.displayName="Menu";var be=()=>css.css({position:"sticky",top:0,left:0,backgroundColor:d__default.default.colorWhite,borderBottom:`1px solid ${d__default.default.gray300}`,marginBottom:d__default.default.spacing2Xs,padding:`${d__default.default.spacing2Xs} 0`,zIndex:1001}),Te=()=>css.css({position:"sticky",bottom:0,left:0,backgroundColor:d__default.default.colorWhite,borderTop:`1px solid ${d__default.default.gray300}`,marginTop:d__default.default.spacing2Xs,padding:`${d__default.default.spacing2Xs} 0`,zIndex:1001}),he=e=>({container:css.css({display:e.isOpen?"initial":"none",borderRadius:"8px",overflowY:"auto",position:"absolute",top:0,left:0,padding:0,background:d__default.default.colorWhite,paddingTop:e.hasStickyHeader?0:d__default.default.spacing2Xs,paddingBottom:e.hasStickyFooter?0:d__default.default.spacing2Xs,boxShadow:d__default.default.boxShadowDefault,zIndex:d__default.default.zIndexDropdown,"&:focus":{boxShadow:d__default.default.glowPrimary,outline:"none"},"&:focus:not(:focus-visible)":{boxShadow:d__default.default.boxShadowDefault}})});var D=e=>{let r=e,{children:t,testId:o="cf-ui-menu-list-header",className:n}=r,u=c(r,["children","testId","className"]),s=be();return g__namespace.default.createElement("div",a({"data-test-id":o,className:css.cx(s,n)},u),t)};D.displayName="MenuListHeader";var O=e=>{let r=e,{children:t,testId:o="cf-ui-menu-list-footer",className:n}=r,u=c(r,["children","testId","className"]),s=Te();return g__namespace.default.createElement("div",a({"data-test-id":o,className:css.cx(s,n)},u),t)};O.displayName="MenuListFooter";function Et(e){return !g__namespace.default.isValidElement(e)||typeof e.type=="string"?false:typeof e.type.displayName=="string"}var Ee=(e,t)=>{let b=e,{children:o,testId:n="cf-ui-menu-list",className:u,style:s}=b,r=c(b,["children","testId","className","style"]),i=N(),y=null,M=null,f=[],P=react.useMergeRefs([i.refs.setFloating,t]);g__namespace.default.Children.forEach(o,p=>{let l=true;Et(p)&&(p.type.displayName===D.displayName?(y=p,l=false):p.type.displayName===O.displayName&&(M=p,l=false)),l&&f.push(p);});let m=he({hasStickyHeader:!!y,hasStickyFooter:!!M,isOpen:i.isOpen});if(i.renderOnlyWhenOpen&&!i.isOpen)return null;let R=g__namespace.default.createElement("div",a(a({role:"menu",style:a(a({},s),i.floatingStyles),className:css.cx(m.container,u),"data-test-id":n,ref:P},r),i.getFloatingProps()),y,f,M),I=p=>i.autoFocus===false?p:g__namespace.default.createElement(react.FloatingFocusManager,{context:i.context,modal:false,initialFocus:i.isNested?-1:0,returnFocus:!i.isNested},p);return g__namespace.default.createElement(react.FloatingList,{elementsRef:i.elementsRef,labelsRef:i.labelsRef},i.usePortal?g__namespace.default.createElement(react.FloatingPortal,null,I(R)):I(R))};Ee.displayName="MenuList";var Z=g__namespace.default.forwardRef(Ee);function Se(){let e=g__namespace.default.useContext(F),t=react.useListItem(),o=react.useFloatingTree(),n=t.index===e.activeIndex,u=g__namespace.default.useCallback((s={})=>e.getItemProps(L(a({},s),{onClick(r){var i;(i=s.onClick)==null||i.call(s,r),o==null||o.events.emit("click");},onFocus(r){var i;(i=s.onFocus)==null||i.call(s,r),e.setHasFocusInside(true);}})),[e,o]);return {isActive:n,item:t,menu:e,tree:o,getItemProps:u}}var Ce=({isActive:e,isDisabled:t})=>css.cx(f36Core.getMenuItemStyles({isActive:e,isDisabled:t}),css.css({width:`calc(100% - 2 * ${d__default.default.spacing2Xs})`,margin:`0 ${d__default.default.spacing2Xs}`,gap:d__default.default.spacingXs}));var wt="button";function Le(e,t){let H=e,{testId:o,className:n,as:u,isActive:s=false,isDisabled:r,isInitiallyFocused:i,icon:y}=H,M=c(H,["testId","className","as","isActive","isDisabled","isInitiallyFocused","icon"]),f=r!=null?r:e.disabled,P=Se(),m=f36Core.useId(void 0,"menu-item"),R=o||`cf-ui-${m}`,I=Ce({isActive:s,isDisabled:r}),b=u!=null?u:wt,{menu:p,item:l}=P,{setActiveIndex:h}=p;return g__namespace.default.useEffect(()=>{i&&h(l.index);},[i,l.index,h]),g__namespace.default.createElement(b,a(L(a({},M),{ref:react.useMergeRefs([P.item.ref,t]),role:"menuitem",className:css.cx(I,n),"data-test-id":R,tabIndex:P.isActive?0:-1,disabled:f}),P.getItemProps(M)),y,e.children)}Le.displayName="MenuItem";var A=g__namespace.default.forwardRef(Le);var B=g__namespace.default.forwardRef(function({children:t},o){let n=N(),{refs:u,item:s,isNested:r,isOpen:i,hasFocusInside:y,setHasFocusInside:M,parent:f}=n,P=t.ref,m=t.props,R=f==null?void 0:f.activeIndex,I=f?f.getItemProps:n.getItemProps,b=a({ref:react.useMergeRefs([u.setReference,s.ref,o,P]),tabIndex:r?R===s.index?0:-1:void 0,role:r?"menuitem":void 0,"data-open":i?"":void 0,"data-nested":r?"":void 0,"data-focus-inside":y?"":void 0},n.getReferenceProps(I({onClick:m.onClick,onMouseDown:m.onMouseDown,onKeyDown:m.onKeyDown,onMouseEnter:m.onMouseEnter,onMouseLeave:m.onMouseLeave,onPointerDown:m.onPointerDown,onPointerEnter:m.onPointerEnter,onPointerLeave:m.onPointerLeave,onFocus(p){var l;(l=m.onFocus)==null||l.call(m,p),M(false),f&&f.setHasFocusInside(true);}})));return g__namespace.default.cloneElement(t,b)});var He=()=>css.css({border:"none",width:"100%",height:"1px",backgroundColor:d__default.default.gray200,margin:`${d__default.default.spacing2Xs} 0`});var K=e=>{let r=e,{children:t,testId:o="cf-ui-menu-divider",className:n}=r,u=c(r,["children","testId","className"]),s=He();return g__namespace.default.createElement("hr",a({"aria-orientation":"horizontal","data-test-id":o,className:css.cx(s,n)},u))};K.displayName="MenuDivider";var ke=()=>css.css({color:d__default.default.gray500,textAlign:"left",padding:`${d__default.default.spacingXs} ${d__default.default.spacingS} ${d__default.default.spacing2Xs}`,lineHeight:d__default.default.lineHeightM});var oe=e=>{let r=e,{children:t,testId:o="cf-ui-menu-section-title",className:n}=r,u=c(r,["children","testId","className"]),s=ke();return g__namespace.default.createElement(f36Typography.Caption,a({"aria-hidden":"true",as:"div",testId:o,className:css.cx(s,n),marginBottom:"none"},u),t)};var V=e=>g__namespace.default.createElement(w,a({},e));V.displayName="Submenu";var we=()=>({root:({isActive:e})=>css.css(a({display:"flex",alignItems:"center",paddingRight:d__default.default.spacingXs},e?{backgroundColor:d__default.default.gray100}:{})),content:css.css({marginRight:d__default.default.spacingM}),icon:css.css({marginLeft:"auto",fill:"currentColor"})});var jt=(e,t)=>{let{className:o,children:n}=e,u=we(),{isOpen:s}=N();return g__namespace.default.createElement(B,null,g__namespace.default.createElement(A,L(a({},e),{ref:t,className:css.cx(u.root({isActive:s}),o)}),g__namespace.default.createElement("span",{className:u.content},n),g__namespace.default.createElement(f36Icons.CaretRightIcon,{className:u.icon})))},se=g__namespace.default.forwardRef(jt);var x=w;x.List=Z;x.ListHeader=D;x.ListFooter=O;x.Item=A;x.Trigger=B;x.Divider=K;x.SectionTitle=oe;x.Submenu=V;x.SubmenuTrigger=se;exports.Menu=x;exports.MenuDivider=K;exports.MenuItem=A;exports.MenuList=Z;exports.MenuSectionTitle=oe;exports.MenuTrigger=B;exports.Submenu=V;exports.SubmenuTrigger=se;//# sourceMappingURL=index.js.map
|
|
1
|
+
'use strict';var g=require('react'),react=require('@floating-ui/react'),css=require('@emotion/css'),d=require('@contentful/f36-tokens'),f36Core=require('@contentful/f36-core'),f36Typography=require('@contentful/f36-typography'),f36Icons=require('@contentful/f36-icons');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var g__namespace=/*#__PURE__*/_interopNamespace(g);var d__default=/*#__PURE__*/_interopDefault(d);var je=Object.defineProperty,Ke=Object.defineProperties;var Ve=Object.getOwnPropertyDescriptors;var j=Object.getOwnPropertySymbols;var Me=Object.prototype.hasOwnProperty,ye=Object.prototype.propertyIsEnumerable;var ge=(e,t,o)=>t in e?je(e,t,{enumerable:true,configurable:true,writable:true,value:o}):e[t]=o,a=(e,t)=>{for(var o in t||(t={}))Me.call(t,o)&&ge(e,o,t[o]);if(j)for(var o of j(t))ye.call(t,o)&&ge(e,o,t[o]);return e},F=(e,t)=>Ke(e,Ve(t));var c=(e,t)=>{var o={};for(var n in e)Me.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(e!=null&&j)for(var n of j(e))t.indexOf(n)<0&&ye.call(e,n)&&(o[n]=e[n]);return o};var N=g__namespace.default.createContext(null);function H(){let e=g__namespace.default.useContext(N);if(!e)throw new Error("useMenuContext must be used within <MenuContext.Provider>");return e}var xe=N.Provider;function Re({placement:e,isFullWidth:t=false,isAutoalignmentEnabled:o=true,isOpen:n,defaultIsOpen:u=false,onOpen:s,onClose:r,offset:i,renderOnlyWhenOpen:y=true,usePortal:M=true,useTypeahead:f=false,closeOnEsc:P=true,closeOnBlur:m=true,closeOnSelect:I=true,autoFocus:b=true}){let T=g__namespace.default.useRef([]),l=g__namespace.default.useRef([]),p=react.useFloatingTree(),x=react.useFloatingNodeId(),E=react.useFloatingParentNodeId(),ie=react.useListItem(),ae=g__namespace.default.useContext(N),C=E!=null,_=n!==void 0,[Oe,Ae]=g__namespace.default.useState(u),h=_?n:Oe,ue=g__namespace.default.useRef(h);g__namespace.default.useEffect(()=>{ue.current=h;},[h]);let X=g__namespace.default.useCallback((S,k,G)=>{if(_&&!s&&G==="click")return;let Ge=ue.current;S!==Ge&&(_||Ae(S),S?s==null||s():r==null||r());},[_,s,r]),[pe,Be]=g__namespace.default.useState(false),[$,Y]=g__namespace.default.useState(0),z=[react.offset(i||(C?{mainAxis:4,alignmentAxis:-4}:5))],q;e!=="auto"&&o?(q=e,z.push(react.flip({padding:5}),react.shift({padding:5}))):e==="auto"?z.push(react.autoPlacement()):q=e,t&&z.push(react.size({apply({rects:S,elements:k}){Object.assign(k.floating.style,{minWidth:`${S.reference.width}px`});}}));let{floatingStyles:me,refs:le,context:v}=react.useFloating({nodeId:x,open:h,onOpenChange:X,whileElementsMounted:react.autoUpdate,placement:q,middleware:z}),We=react.useHover(v,{enabled:C,delay:{open:75},handleClose:react.safePolygon({blockPointerEvents:true})}),Ue=react.useClick(v,{event:"mousedown",toggle:!C,ignoreMouse:C}),_e=react.useRole(v,{role:"menu"}),Xe=react.useDismiss(v,{escapeKey:P,outsidePress:m,bubbles:true}),$e=react.useListNavigation(v,{listRef:T,activeIndex:$,nested:C,onNavigate:Y,loop:true}),ze=react.useTypeahead(v,{enabled:f,listRef:l,onMatch:h?Y:void 0,activeIndex:$}),{getReferenceProps:ce,getFloatingProps:de,getItemProps:fe}=react.useInteractions([We,Ue,_e,Xe,$e,ze]);return g__namespace.default.useEffect(()=>{if(!p)return;function S(){I&&X(false);}function k(G){G.nodeId!==x&&G.parentId===E&&X(false);}return p.events.on("click",S),p.events.on("menuopen",k),()=>{p.events.off("click",S),p.events.off("menuopen",k);}},[p,x,E,X,I]),g__namespace.default.useEffect(()=>{h&&p&&p.events.emit("menuopen",{parentId:E,nodeId:x});},[p,h,x,E]),g__namespace.default.useMemo(()=>({isOpen:h,hasFocusInside:pe,activeIndex:$,isNested:C,refs:le,elementsRef:T,labelsRef:l,floatingStyles:me,context:v,renderOnlyWhenOpen:y,usePortal:M,autoFocus:b,getReferenceProps:ce,getFloatingProps:de,getItemProps:fe,setHasFocusInside:Be,setActiveIndex:Y,nodeId:x,item:ie,parent:ae}),[$,v,me,de,fe,ce,pe,C,h,ie,x,ae,le,y,M,b])}var Ie=o=>{var n=o,{children:e}=n,t=c(n,["children"]);let u=Re(a({},t));return g__namespace.createElement(xe,{value:u},g__namespace.createElement(react.FloatingNode,{id:u.nodeId},e))};var w=e=>{let i=e,{children:t,placement:o}=i,n=c(i,["children","placement"]),u=react.useFloatingParentNodeId(),s=o!=null?o:u===null?"bottom-start":"right-start",r=g__namespace.default.createElement(Ie,a({placement:s},n),t);return u===null?g__namespace.default.createElement(react.FloatingTree,null,r):r};w.displayName="Menu";var Te=()=>css.css({position:"sticky",top:0,left:0,backgroundColor:d__default.default.colorWhite,borderBottom:`1px solid ${d__default.default.gray300}`,marginBottom:d__default.default.spacing2Xs,padding:`${d__default.default.spacing2Xs} 0`,zIndex:1001}),he=()=>css.css({position:"sticky",bottom:0,left:0,backgroundColor:d__default.default.colorWhite,borderTop:`1px solid ${d__default.default.gray300}`,marginTop:d__default.default.spacing2Xs,padding:`${d__default.default.spacing2Xs} 0`,zIndex:1001}),Ee=e=>({container:css.css({display:e.isOpen?"initial":"none",borderRadius:"8px",overflowY:"auto",position:"absolute",top:0,left:0,padding:0,background:d__default.default.colorWhite,paddingTop:e.hasStickyHeader?0:d__default.default.spacing2Xs,paddingBottom:e.hasStickyFooter?0:d__default.default.spacing2Xs,boxShadow:d__default.default.boxShadowDefault,zIndex:d__default.default.zIndexDropdown,"&:focus":{boxShadow:d__default.default.glowPrimary,outline:"none"},"&:focus:not(:focus-visible)":{boxShadow:d__default.default.boxShadowDefault}})});var D=e=>{let r=e,{children:t,testId:o="cf-ui-menu-list-header",className:n}=r,u=c(r,["children","testId","className"]),s=Te();return g__namespace.default.createElement("div",a({"data-test-id":o,className:css.cx(s,n)},u),t)};D.displayName="MenuListHeader";var O=e=>{let r=e,{children:t,testId:o="cf-ui-menu-list-footer",className:n}=r,u=c(r,["children","testId","className"]),s=he();return g__namespace.default.createElement("div",a({"data-test-id":o,className:css.cx(s,n)},u),t)};O.displayName="MenuListFooter";function vt(e){return !g__namespace.default.isValidElement(e)||typeof e.type=="string"?false:typeof e.type.displayName=="string"}var ve=(e,t)=>{let T=e,{children:o,testId:n="cf-ui-menu-list",className:u,style:s}=T,r=c(T,["children","testId","className","style"]),i=H(),y=null,M=null,f=[],P=react.useMergeRefs([i.refs.setFloating,t]);g__namespace.default.Children.forEach(o,l=>{let p=true;vt(l)&&(l.type.displayName===D.displayName?(y=l,p=false):l.type.displayName===O.displayName&&(M=l,p=false)),p&&f.push(l);});let m=Ee({hasStickyHeader:!!y,hasStickyFooter:!!M,isOpen:i.isOpen});if(i.renderOnlyWhenOpen&&!i.isOpen)return null;let I=g__namespace.default.createElement("div",a(a({role:"menu",style:a(a({},s),i.floatingStyles),className:css.cx(m.container,u),"data-test-id":n,ref:P},r),i.getFloatingProps()),y,f,M),b=l=>i.autoFocus===false?l:g__namespace.default.createElement(react.FloatingFocusManager,{context:i.context,modal:false,initialFocus:i.isNested?-1:0,returnFocus:!i.isNested},l);return g__namespace.default.createElement(react.FloatingList,{elementsRef:i.elementsRef,labelsRef:i.labelsRef},i.usePortal?g__namespace.default.createElement(react.FloatingPortal,null,b(I)):b(I))};ve.displayName="MenuList";var Z=g__namespace.default.forwardRef(ve);function Ce(){let e=g__namespace.default.useContext(N),t=react.useListItem(),o=react.useFloatingTree(),n=t.index===e.activeIndex,u=g__namespace.default.useCallback((s={})=>e.getItemProps(F(a({},s),{onClick(r){var i;(i=s.onClick)==null||i.call(s,r),o==null||o.events.emit("click");},onFocus(r){var i;(i=s.onFocus)==null||i.call(s,r),e.setHasFocusInside(true);}})),[e,o]);return {isActive:n,item:t,menu:e,tree:o,getItemProps:u}}var Le=({isActive:e,isDisabled:t})=>css.cx(f36Core.getMenuItemStyles({isActive:e,isDisabled:t}),css.css({width:`calc(100% - 2 * ${d__default.default.spacing2Xs})`,margin:`0 ${d__default.default.spacing2Xs}`,gap:d__default.default.spacingXs}));var Dt="button";function Fe(e,t){let E=e,{testId:o,className:n,as:u,isActive:s=false,isDisabled:r,isInitiallyFocused:i,icon:y}=E,M=c(E,["testId","className","as","isActive","isDisabled","isInitiallyFocused","icon"]),f=r!=null?r:e.disabled,P=Ce(),m=f36Core.useId(void 0,"menu-item"),I=o||`cf-ui-${m}`,b=Le({isActive:s,isDisabled:r}),T=u!=null?u:Dt,{menu:l,item:p}=P,{setActiveIndex:x}=l;return g__namespace.default.useEffect(()=>{i&&x(p.index);},[i,p.index,x]),g__namespace.default.createElement(T,a(F(a({},M),{ref:react.useMergeRefs([P.item.ref,t]),role:"menuitem",className:css.cx(b,n),"data-test-id":I,tabIndex:P.isActive?0:-1,disabled:f}),P.getItemProps(M)),y,e.children)}Fe.displayName="MenuItem";var A=g__namespace.default.forwardRef(Fe);var B=g__namespace.default.forwardRef(function({children:t},o){let n=H(),{refs:u,item:s,isNested:r,isOpen:i,hasFocusInside:y,setHasFocusInside:M,parent:f}=n,P=t.ref,m=t.props,I=f==null?void 0:f.activeIndex,b=f?f.getItemProps:n.getItemProps,T=a({ref:react.useMergeRefs([u.setReference,s.ref,o,P]),tabIndex:r?I===s.index?0:-1:void 0,role:r?"menuitem":void 0,"data-open":i?"":void 0,"data-nested":r?"":void 0,"data-focus-inside":y?"":void 0},n.getReferenceProps(b({onClick:m.onClick,onMouseDown:m.onMouseDown,onKeyDown:m.onKeyDown,onMouseEnter:m.onMouseEnter,onMouseLeave:m.onMouseLeave,onPointerDown:m.onPointerDown,onPointerEnter:m.onPointerEnter,onPointerLeave:m.onPointerLeave,onFocus(l){var p;(p=m.onFocus)==null||p.call(m,l),M(false),f&&f.setHasFocusInside(true);}})));return g__namespace.default.cloneElement(t,T)});var ke=()=>css.css({border:"none",width:"100%",height:"1px",backgroundColor:d__default.default.gray200,margin:`${d__default.default.spacing2Xs} 0`});var K=e=>{let r=e,{children:t,testId:o="cf-ui-menu-divider",className:n}=r,u=c(r,["children","testId","className"]),s=ke();return g__namespace.default.createElement("hr",a({"aria-orientation":"horizontal","data-test-id":o,className:css.cx(s,n)},u))};K.displayName="MenuDivider";var we=()=>css.css({color:d__default.default.gray500,textAlign:"left",padding:`${d__default.default.spacingXs} ${d__default.default.spacingS} ${d__default.default.spacing2Xs}`,lineHeight:d__default.default.lineHeightM});var oe=e=>{let r=e,{children:t,testId:o="cf-ui-menu-section-title",className:n}=r,u=c(r,["children","testId","className"]),s=we();return g__namespace.default.createElement(f36Typography.Caption,a({"aria-hidden":"true",as:"div",testId:o,className:css.cx(s,n),marginBottom:"none"},u),t)};var V=e=>g__namespace.default.createElement(w,a({},e));V.displayName="Submenu";var De=()=>({root:({isActive:e})=>css.css(a({display:"flex",alignItems:"center",paddingRight:d__default.default.spacingXs},e?{backgroundColor:d__default.default.gray100}:{})),content:css.css({marginRight:d__default.default.spacingM}),icon:css.css({marginLeft:"auto",fill:"currentColor"})});var Kt=(e,t)=>{let{className:o,children:n}=e,u=De(),{isOpen:s}=H();return g__namespace.default.createElement(B,null,g__namespace.default.createElement(A,F(a({},e),{ref:t,className:css.cx(u.root({isActive:s}),o)}),g__namespace.default.createElement("span",{className:u.content},n),g__namespace.default.createElement(f36Icons.CaretRightIcon,{className:u.icon})))},se=g__namespace.default.forwardRef(Kt);var R=w;R.List=Z;R.ListHeader=D;R.ListFooter=O;R.Item=A;R.Trigger=B;R.Divider=K;R.SectionTitle=oe;R.Submenu=V;R.SubmenuTrigger=se;exports.Menu=R;exports.MenuDivider=K;exports.MenuItem=A;exports.MenuList=Z;exports.MenuSectionTitle=oe;exports.MenuTrigger=B;exports.Submenu=V;exports.SubmenuTrigger=se;//# sourceMappingURL=index.js.map
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/MenuContext.ts","../src/useMenu.ts","../src/MenuComponent.tsx","../src/Menu.tsx","../src/MenuList/MenuList.styles.ts","../src/MenuList/MenuListHeader.tsx","../src/MenuList/MenuListFooter.tsx","../src/MenuList/MenuList.tsx","../src/MenuItem/useMenuItem.tsx","../src/MenuItem/MenuItem.styles.ts","../src/MenuItem/MenuItem.tsx","../src/MenuTrigger/MenuTrigger.tsx","../src/MenuDivider/MenuDivider.styles.ts","../src/MenuDivider/MenuDivider.tsx","../src/MenuSectionTitle/MenuSectionTitle.styles.ts","../src/MenuSectionTitle/MenuSectionTitle.tsx","../src/Submenu/Submenu.tsx","../src/SubmenuTrigger/SubmenuTrigger.styles.ts","../src/SubmenuTrigger/SubmenuTrigger.tsx","../src/CompoundMenu.tsx"],"names":["MenuContext","React","useMenuContext","ctx","MenuContextProvider","useMenu","placement","isFullWidth","isAutoalignmentEnabled","controlledIsOpen","defaultIsOpen","onOpen","onClose","offsetProp","renderOnlyWhenOpen","usePortal","closeOnEsc","closeOnBlur","closeOnSelect","autoFocus","elementsRef","labelsRef","tree","useFloatingTree","nodeId","useFloatingNodeId","parentId","useFloatingParentNodeId","item","useListItem","parent","isNested","isControlled","uncontrolledIsOpen","setUncontrolledIsOpen","isOpen","prevOpenRef","handleOpenChange","nextOpen","_event","reason","wasOpen","hasFocusInside","setHasFocusInside","activeIndex","setActiveIndex","middleware","offset","sanitizedPlacement","flip","shift","autoPlacement","size","rects","elements","floatingStyles","refs","context","useFloating","autoUpdate","hover","useHover","safePolygon","click","useClick","role","useRole","dismiss","useDismiss","listNavigation","useListNavigation","typeahead","useTypeahead","getReferenceProps","getFloatingProps","getItemProps","useInteractions","handleTreeClick","onSubMenuOpen","event","MenuComponent","_a","_b","children","otherProps","__objRest","menuContext","__spreadValues","J","FloatingNode","Menu","props","resolvedPlacement","content","FloatingTree","getMenuHeaderStyles","css","tokens","getMenuFooterStyles","getMenuListStyles","MenuListHeader","testId","className","styles","cx","MenuListFooter","assertChild","child","MenuListBase","forwardedRef","style","menu","header","footer","items","useMergeRefs","appendChild","maybeWrapWithFocusManager","node","FloatingFocusManager","FloatingList","FloatingPortal","MenuList","useMenuItem","isActive","userProps","__spreadProps","getMenuItemStyles","isDisabled","globalGetMenuItemStyles","MENU_ITEM_DEFAULT_TAG","MenuItemBase","as","isInitiallyFocused","icon","propDisabled","menuItem","id","useId","itemTestId","Element","MenuItem","MenuTrigger","childRef","childProps","parentActiveIndex","triggerProps","getMenuDividerStyles","MenuDivider","getMenuSectionTitleStyles","MenuSectionTitle","Caption","Submenu","getSubmenuTriggerStyles","SubmenuTriggerBase","ref","CaretRightIcon","SubmenuTrigger"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react';\nimport type { UseMenuReturn } from './useMenu';\n\nexport const MenuContext = React.createContext<UseMenuReturn | null>(null);\n\nexport function useMenuContext() {\n const ctx = React.useContext(MenuContext);\n if (!ctx) {\n throw new Error(\n 'useMenuContext must be used within <MenuContext.Provider>',\n );\n }\n return ctx;\n}\nexport const MenuContextProvider = MenuContext.Provider;\n","import React from 'react';\nimport {\n autoUpdate,\n flip,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useRole,\n useTypeahead,\n autoPlacement,\n size,\n} from '@floating-ui/react';\nimport type { Placement, UseFloatingOptions } from '@floating-ui/react';\nimport type { MenuProps } from './Menu';\nimport { MenuContext } from './MenuContext';\n\nexport interface UseMenuReturn {\n // State\n isOpen: boolean;\n hasFocusInside: boolean;\n activeIndex: number | null;\n isNested: boolean;\n\n // Refs\n refs: {\n setReference: (node: HTMLButtonElement | null) => void;\n setFloating: (node: HTMLElement | null) => void;\n };\n elementsRef: React.RefObject<Array<HTMLButtonElement | null>>;\n labelsRef: React.RefObject<Array<string | null>>;\n\n // Floating UI\n floatingStyles: React.CSSProperties;\n context: ReturnType<typeof useFloating>['context'];\n renderOnlyWhenOpen: boolean;\n usePortal: boolean;\n autoFocus: boolean;\n\n // Props getters\n getReferenceProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n getFloatingProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n getItemProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n\n // State setters\n setHasFocusInside: React.Dispatch<React.SetStateAction<boolean>>;\n setActiveIndex: React.Dispatch<React.SetStateAction<number | null>>;\n\n // Tree and item info\n nodeId: string;\n item: ReturnType<typeof useListItem>;\n parent: React.ContextType<typeof MenuContext>;\n}\n\nexport function useMenu({\n placement,\n isFullWidth = false,\n isAutoalignmentEnabled = true,\n isOpen: controlledIsOpen,\n defaultIsOpen = false,\n onOpen,\n onClose,\n offset: offsetProp,\n renderOnlyWhenOpen = true,\n usePortal = true,\n closeOnEsc = true,\n closeOnBlur = true,\n closeOnSelect = true,\n autoFocus = true,\n}: MenuProps): UseMenuReturn {\n const elementsRef = React.useRef<Array<HTMLButtonElement | null>>([]);\n const labelsRef = React.useRef<Array<string | null>>([]);\n\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const item = useListItem();\n const parent = React.useContext(MenuContext);\n\n const isNested = parentId != null;\n\n /**\n * Handle open and closed state\n * supports controlled and uncontrolled behavior\n * */\n const isControlled = controlledIsOpen !== undefined;\n const [uncontrolledIsOpen, setUncontrolledIsOpen] =\n React.useState(defaultIsOpen);\n const isOpen = isControlled ? controlledIsOpen : uncontrolledIsOpen;\n\n // Track previous open for transition detection\n const prevOpenRef = React.useRef(isOpen);\n React.useEffect(() => {\n prevOpenRef.current = isOpen;\n }, [isOpen]);\n\n const handleOpenChange = React.useCallback<\n UseFloatingOptions['onOpenChange']\n >(\n (nextOpen, _event, reason) => {\n // if the user made component controlled by providing isOpen prop\n // but onOpen callback is not provided, we won't add toggle logic\n // to the trigger component. So they can make any toggle logic on their own.\n const isFullyControlled = isControlled && !onOpen;\n if (isFullyControlled && reason === 'click') {\n return;\n }\n\n const wasOpen = prevOpenRef.current;\n if (nextOpen === wasOpen) {\n return;\n }\n\n if (!isControlled) {\n setUncontrolledIsOpen(nextOpen);\n }\n\n if (nextOpen) {\n onOpen?.();\n } else {\n onClose?.();\n }\n },\n [isControlled, onOpen, onClose],\n );\n\n // Focus Handling\n const [hasFocusInside, setHasFocusInside] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState<number>(0);\n\n /** Configure middleware based on placement with offset\n * and isAutoalignmentEnabled\n * If placement is \"auto\" it will use autoPlacement() in the middleware and not make use of flip and switch.\n * If isAutoalignmentEnabled is false, it will also not use flip and switch but only use the placement variable.\n */\n\n const offsetOption = offsetProp\n ? offsetProp\n : isNested\n ? { mainAxis: 4, alignmentAxis: -4 }\n : 5;\n\n const middleware = [offset(offsetOption)];\n\n // sanitize the placement to allow auto setting alongside with isAutoalignmentEnabled\n\n let sanitizedPlacement: Placement;\n\n if (placement !== 'auto' && isAutoalignmentEnabled) {\n sanitizedPlacement = placement;\n middleware.push(flip({ padding: 5 }), shift({ padding: 5 }));\n } else if (placement === 'auto') {\n middleware.push(autoPlacement());\n } else {\n sanitizedPlacement = placement;\n }\n\n /**\n * Set to same size as trigger reference element\n */\n if (isFullWidth) {\n middleware.push(\n size({\n apply({ rects, elements }) {\n Object.assign(elements.floating.style, {\n minWidth: `${rects.reference.width}px`,\n });\n },\n }),\n );\n }\n\n const { floatingStyles, refs, context } = useFloating<HTMLButtonElement>({\n nodeId,\n open: isOpen,\n onOpenChange: handleOpenChange,\n whileElementsMounted: autoUpdate,\n placement: sanitizedPlacement,\n middleware,\n });\n\n const hover = useHover(context, {\n enabled: isNested,\n delay: { open: 75 },\n handleClose: safePolygon({ blockPointerEvents: true }),\n });\n const click = useClick(context, {\n event: 'mousedown',\n toggle: !isNested,\n ignoreMouse: isNested,\n });\n const role = useRole(context, { role: 'menu' });\n\n const dismiss = useDismiss(context, {\n escapeKey: closeOnEsc,\n outsidePress: closeOnBlur,\n bubbles: true,\n });\n\n const listNavigation = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: isNested,\n onNavigate: setActiveIndex,\n loop: true,\n });\n\n const typeahead = useTypeahead(context, {\n listRef: labelsRef,\n onMatch: isOpen ? setActiveIndex : undefined,\n activeIndex,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNavigation, typeahead],\n );\n\n // Event emitter allows you to communicate across tree components.\n // This effect closes all menus when an item gets clicked anywhere\n // in the tree.\n React.useEffect(() => {\n if (!tree) return;\n\n function handleTreeClick() {\n // Only close menus on item click if the consumer opted in via closeOnSelect\n if (closeOnSelect) {\n handleOpenChange(false);\n }\n }\n\n function onSubMenuOpen(event: { nodeId: string; parentId: string }) {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n handleOpenChange(false);\n }\n }\n\n tree.events.on('click', handleTreeClick);\n tree.events.on('menuopen', onSubMenuOpen);\n\n return () => {\n tree.events.off('click', handleTreeClick);\n tree.events.off('menuopen', onSubMenuOpen);\n };\n }, [tree, nodeId, parentId, handleOpenChange, closeOnSelect]);\n\n React.useEffect(() => {\n if (isOpen && tree) {\n tree.events.emit('menuopen', { parentId, nodeId });\n }\n }, [tree, isOpen, nodeId, parentId]);\n\n return React.useMemo(\n () => ({\n // State\n isOpen,\n hasFocusInside,\n activeIndex,\n isNested,\n\n // Refs\n refs,\n elementsRef,\n labelsRef,\n\n // Floating UI\n floatingStyles,\n context,\n renderOnlyWhenOpen,\n usePortal,\n autoFocus,\n\n // Props getters\n getReferenceProps,\n getFloatingProps,\n getItemProps,\n\n // State setters\n setHasFocusInside,\n setActiveIndex,\n\n // Tree and item info\n nodeId,\n item,\n parent,\n }),\n [\n activeIndex,\n context,\n floatingStyles,\n getFloatingProps,\n getItemProps,\n getReferenceProps,\n hasFocusInside,\n isNested,\n isOpen,\n item,\n nodeId,\n parent,\n refs,\n renderOnlyWhenOpen,\n usePortal,\n autoFocus,\n ],\n );\n}\n","import * as React from 'react';\nimport { FloatingNode } from '@floating-ui/react';\nimport type { ExpandProps } from '@contentful/f36-core';\nimport { useMenu } from './useMenu';\nimport { MenuContextProvider } from './MenuContext';\nimport type { MenuProps } from './Menu';\n\nexport const MenuComponent = ({\n children,\n ...otherProps\n}: ExpandProps<MenuProps>) => {\n const menuContext = useMenu({ ...otherProps });\n return (\n <MenuContextProvider value={menuContext}>\n <FloatingNode id={menuContext.nodeId}>{children}</FloatingNode>\n </MenuContextProvider>\n );\n};\n","import React from 'react';\nimport {\n useFloatingParentNodeId,\n FloatingTree,\n type Placement,\n type OffsetOptions,\n} from '@floating-ui/react';\nimport { MenuComponent } from './MenuComponent';\nimport type { ExpandProps } from '@contentful/f36-core';\n\ntype BaseMenuProps = {\n /**\n * Boolean to determine if the Popover should be the same width as\n * the trigger element\n *\n * @default false\n */\n isFullWidth?: boolean;\n\n /**\n * If `true`, the Menu will be initially opened. This property has no influence on the uncontrolled status of the Menu\n */\n defaultIsOpen?: boolean;\n\n /**\n * Callback fired when the Menu opens\n */\n onOpen?: () => void;\n\n /**\n * Callback fired when the Menu closes\n */\n onClose?: () => void;\n\n /**\n * Determines the preferred position of where the MenuList opens. This position is not\n * guaranteed, as the MenuList might be moved to fit the viewport.\n *\n * @default bottom-start OR right-start\n */\n placement?: Placement | 'auto';\n\n /**\n * Boolean to control if popover is allowed to change its placement automatically\n * based on available space in the viewport.\n *\n * For example:\n * If you set placement prop to bottom, but there isn't enough space to position the popover in that direction,\n * it will change the popper placement to top. As soon as enough space is detected, the placement will be reverted to the defined one.\n *\n * If you want the popover to strictly follow the placement prop you should set this prop to false.\n *\n * @default true\n */\n isAutoalignmentEnabled?: boolean;\n\n /**\n * Single number as short hand for `mainAxis`\n * Or object which can contain `mainAxis`, `crossAxis` or `alignmentAxis`\n *\n * @default 0\n */\n offset?: OffsetOptions;\n\n /**\n * Defines if the menu list content should be rendered in the DOM only when it's open\n * or all the time (after the component has been mounted)\n *\n * @default true\n */\n renderOnlyWhenOpen?: boolean;\n\n /**\n * If `true`, the Menu will close when a menu item is\n * clicked\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnSelect?: boolean;\n\n /**\n * If true, the menu will close when you blur out it by clicking outside\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnBlur?: boolean;\n\n /**\n * If true, the menu will close when you hit the Esc key\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnEsc?: boolean;\n\n /**\n * Boolean to control whether or not to render the Menu in a React Portal.\n * Rendering content inside a Portal allows the Menu to escape the bounds\n * of its parent while still being positioned correctly. Using a Portal is\n * necessary if an ancestor of the Menu hides overflow.\n *\n * @default true\n */\n usePortal?: boolean;\n\n /**\n * If true, the Menu will be focused after opening\n *\n * @default true\n */\n autoFocus?: boolean;\n\n /**\n * Menu compound children (Trigger, List, Item, etc.)\n */\n children?: React.ReactNode;\n};\n\n// Uncontrolled: no isOpen prop\ninterface UncontrolledMenuProps extends BaseMenuProps {\n isOpen?: undefined;\n}\n\n// Controlled: isOpen present AND at least one of onOpen/onClose must be provided.\n// We encode this by creating two branches and unioning them; supplying neither will error.\ntype ControlledProps = BaseMenuProps & {\n isOpen: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n} & (\n | { onOpen: () => void }\n | { onClose: () => void }\n | { onOpen: () => void; onClose: () => void }\n );\n\nexport type MenuProps = UncontrolledMenuProps | ControlledProps;\n\nexport const Menu = (props: ExpandProps<MenuProps>) => {\n const { children, placement, ...otherProps } = props;\n const parentId = useFloatingParentNodeId();\n\n // Set default placement based on nesting: root menus open down, nested menus open right\n const resolvedPlacement =\n placement ?? (parentId === null ? 'bottom-start' : 'right-start');\n\n const content = (\n <MenuComponent placement={resolvedPlacement} {...otherProps}>\n {children}\n </MenuComponent>\n );\n\n if (parentId === null) {\n return <FloatingTree>{content}</FloatingTree>;\n }\n\n return content;\n};\n\nMenu.displayName = 'Menu';\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuHeaderStyles = () => {\n return css({\n position: 'sticky',\n top: 0,\n left: 0,\n backgroundColor: tokens.colorWhite,\n borderBottom: `1px solid ${tokens.gray300}`,\n marginBottom: tokens.spacing2Xs,\n padding: `${tokens.spacing2Xs} 0`,\n zIndex: 1001,\n });\n};\n\nexport const getMenuFooterStyles = () => {\n return css({\n position: 'sticky',\n bottom: 0,\n left: 0,\n backgroundColor: tokens.colorWhite,\n borderTop: `1px solid ${tokens.gray300}`,\n marginTop: tokens.spacing2Xs,\n padding: `${tokens.spacing2Xs} 0`,\n zIndex: 1001,\n });\n};\n\nexport const getMenuListStyles = (props: {\n hasStickyFooter?: boolean;\n hasStickyHeader?: boolean;\n isOpen?: boolean;\n}) => ({\n container: css({\n display: props.isOpen ? 'initial' : 'none',\n // To get to our regular border radius for the inner menu items (6px),\n // we need to use 8px on the outer container\n borderRadius: '8px',\n overflowY: 'auto',\n position: 'absolute',\n top: 0,\n left: 0,\n padding: 0,\n background: tokens.colorWhite,\n paddingTop: props.hasStickyHeader ? 0 : tokens.spacing2Xs,\n paddingBottom: props.hasStickyFooter ? 0 : tokens.spacing2Xs,\n boxShadow: tokens.boxShadowDefault,\n zIndex: tokens.zIndexDropdown,\n '&:focus': {\n boxShadow: tokens.glowPrimary,\n outline: 'none',\n },\n '&:focus:not(:focus-visible)': {\n boxShadow: tokens.boxShadowDefault,\n },\n }),\n});\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\n\nimport { getMenuHeaderStyles } from './MenuList.styles';\n\nexport type MenuListHeaderProps = PropsWithHTMLElement<CommonProps, 'div'>;\n\nexport const MenuListHeader: React.FC<ExpandProps<MenuListHeaderProps>> = (\n props,\n) => {\n const {\n children,\n testId = 'cf-ui-menu-list-header',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuHeaderStyles();\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n >\n {children}\n </div>\n );\n};\n\nMenuListHeader.displayName = 'MenuListHeader';\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\n\nimport { getMenuFooterStyles } from './MenuList.styles';\n\nexport type MenuListFooterProps = PropsWithHTMLElement<CommonProps, 'div'>;\n\nexport const MenuListFooter: React.FC<ExpandProps<MenuListFooterProps>> = (\n props,\n) => {\n const {\n children,\n testId = 'cf-ui-menu-list-footer',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuFooterStyles();\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n >\n {children}\n </div>\n );\n};\n\nMenuListFooter.displayName = 'MenuListFooter';\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { useMenuContext } from '../MenuContext';\n\nimport { cx } from '@emotion/css';\nimport { getMenuListStyles } from './MenuList.styles';\nimport { MenuListHeader } from './MenuListHeader';\nimport { MenuListFooter } from './MenuListFooter';\nimport {\n FloatingList,\n FloatingPortal,\n FloatingFocusManager,\n useMergeRefs,\n} from '@floating-ui/react';\n\ninterface MenuListInternalProps extends CommonProps {\n children?: React.ReactNode;\n}\n\ntype ComponentWithDisplayName = React.ComponentType<unknown> & {\n displayName?: string;\n};\n\nfunction assertChild(\n child: React.ReactNode,\n): child is React.ReactElement<unknown, ComponentWithDisplayName> {\n if (!React.isValidElement(child)) return false;\n // Exclude intrinsic elements (strings like 'div')\n if (typeof child.type === 'string') return false;\n const type = child.type as ComponentWithDisplayName;\n return typeof type.displayName === 'string';\n}\n\nexport type MenuListProps = PropsWithHTMLElement<MenuListInternalProps, 'div'>;\n\nconst MenuListBase = (props: ExpandProps<MenuListProps>, forwardedRef) => {\n const {\n children,\n testId = 'cf-ui-menu-list',\n className,\n style,\n ...otherProps\n } = props;\n\n const menu = useMenuContext();\n let header: React.ReactElement | null = null;\n let footer: React.ReactElement | null = null;\n const items: React.ReactElement[] = [];\n\n const refs = useMergeRefs([menu.refs.setFloating, forwardedRef]);\n\n React.Children.forEach(children, (child) => {\n let appendChild = true;\n if (assertChild(child)) {\n if (child.type.displayName === MenuListHeader.displayName) {\n header = child as unknown as React.ReactElement;\n appendChild = false;\n } else if (child.type.displayName === MenuListFooter.displayName) {\n footer = child as unknown as React.ReactElement;\n appendChild = false;\n }\n }\n if (appendChild) {\n items.push(child as unknown as React.ReactElement);\n }\n });\n\n const styles = getMenuListStyles({\n hasStickyHeader: Boolean(header),\n hasStickyFooter: Boolean(footer),\n isOpen: menu.isOpen,\n });\n\n if (menu.renderOnlyWhenOpen && !menu.isOpen) {\n return null;\n }\n\n const content = (\n <div\n role=\"menu\"\n style={{ ...style, ...menu.floatingStyles }}\n className={cx(styles.container, className)}\n data-test-id={testId}\n ref={refs}\n {...otherProps}\n {...menu.getFloatingProps()}\n >\n {header}\n {items}\n {footer}\n </div>\n );\n\n const maybeWrapWithFocusManager = (node: React.ReactElement) =>\n menu.autoFocus === false ? (\n node\n ) : (\n <FloatingFocusManager\n context={menu.context}\n modal={false}\n initialFocus={menu.isNested ? -1 : 0}\n returnFocus={!menu.isNested}\n >\n {node}\n </FloatingFocusManager>\n );\n\n return (\n <FloatingList elementsRef={menu.elementsRef} labelsRef={menu.labelsRef}>\n {menu.usePortal ? (\n <FloatingPortal>\n {maybeWrapWithFocusManager(content as React.ReactElement)}\n </FloatingPortal>\n ) : (\n maybeWrapWithFocusManager(content as React.ReactElement)\n )}\n </FloatingList>\n );\n};\n\nMenuListBase.displayName = 'MenuList';\nexport const MenuList = React.forwardRef(MenuListBase);\n","import React from 'react';\nimport {\n useListItem,\n useFloatingTree,\n type FloatingTreeType,\n} from '@floating-ui/react';\nimport { MenuContext } from '../MenuContext';\n\ninterface UseMenuItemReturn {\n // State\n isActive: boolean;\n\n // Tree and context\n item: ReturnType<typeof useListItem>;\n menu: React.ContextType<typeof MenuContext>;\n tree: FloatingTreeType | null;\n\n // Props getters\n getItemProps: (\n userProps?: React.ButtonHTMLAttributes<HTMLButtonElement>,\n ) => Record<string, unknown>;\n}\n\nexport function useMenuItem(): UseMenuItemReturn {\n const menu = React.useContext(MenuContext);\n const item = useListItem();\n const tree = useFloatingTree();\n const isActive = item.index === menu.activeIndex;\n\n const getItemProps = React.useCallback(\n (userProps: React.ButtonHTMLAttributes<HTMLButtonElement> = {}) => {\n return menu.getItemProps({\n ...userProps,\n onClick(event: React.MouseEvent<HTMLButtonElement>) {\n userProps.onClick?.(event);\n tree?.events.emit('click');\n },\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n userProps.onFocus?.(event);\n menu.setHasFocusInside(true);\n },\n });\n },\n [menu, tree],\n );\n\n return {\n isActive,\n item,\n menu,\n tree,\n getItemProps,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { getMenuItemStyles as globalGetMenuItemStyles } from '@contentful/f36-core';\nimport type { MenuItemProps } from './MenuItem';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuItemStyles = ({\n isActive,\n isDisabled,\n}: {\n isActive: MenuItemProps['isActive'];\n isDisabled: MenuItemProps['isDisabled'];\n}) =>\n cx(\n globalGetMenuItemStyles({ isActive, isDisabled }),\n css({\n width: `calc(100% - 2 * ${tokens.spacing2Xs})`,\n margin: `0 ${tokens.spacing2Xs}`,\n gap: tokens.spacingXs,\n }),\n );\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport {\n useId,\n type CommonProps,\n type PolymorphicComponent,\n type PolymorphicProps,\n type ExpandProps,\n} from '@contentful/f36-core';\n\nimport { useMergeRefs } from '@floating-ui/react';\n\nimport { useMenuItem } from './useMenuItem';\nimport { getMenuItemStyles } from './MenuItem.styles';\n\nconst MENU_ITEM_DEFAULT_TAG = 'button';\n\ninterface MenuItemInternalProps extends CommonProps {\n children?: React.ReactNode;\n as?: 'a' | 'button';\n\n /**\n * Marks item as active\n */\n isActive?: boolean;\n /**\n * Marks item as disabled\n */\n isDisabled?: boolean;\n /**\n * Sets focus on item\n */\n isInitiallyFocused?: boolean;\n /**\n * Expects any of the icon components. Renders the icon aligned to the start\n */\n icon?: React.ReactElement;\n}\n\nexport type MenuItemProps<\n E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG,\n> = PolymorphicProps<MenuItemInternalProps, E>;\n\nfunction MenuItemBase<\n E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG,\n>(props: MenuItemProps<E>, forwardedRef: React.Ref<Element>) {\n const {\n testId,\n className,\n as,\n isActive = false,\n isDisabled,\n isInitiallyFocused,\n icon,\n ...otherProps\n } = props;\n const propDisabled = isDisabled ?? props.disabled;\n const menuItem = useMenuItem();\n const id = useId(undefined, 'menu-item');\n const itemTestId = testId || `cf-ui-${id}`;\n const styles = getMenuItemStyles({ isActive, isDisabled });\n\n const Element = (as ?? MENU_ITEM_DEFAULT_TAG) as React.ElementType;\n\n // If this item requests initial focus, set active index\n const { menu, item } = menuItem;\n const { setActiveIndex } = menu;\n\n React.useEffect(() => {\n if (isInitiallyFocused) {\n setActiveIndex(item.index);\n }\n }, [isInitiallyFocused, item.index, setActiveIndex]);\n\n return (\n <Element\n {...otherProps}\n ref={useMergeRefs([menuItem.item.ref, forwardedRef])}\n role=\"menuitem\"\n className={cx(styles, className)}\n data-test-id={itemTestId}\n tabIndex={menuItem.isActive ? 0 : -1}\n disabled={propDisabled}\n {...menuItem.getItemProps(otherProps)}\n >\n {icon}\n {props.children}\n </Element>\n );\n}\n\nMenuItemBase.displayName = 'MenuItem';\n\nexport const MenuItem = React.forwardRef(MenuItemBase) as PolymorphicComponent<\n ExpandProps<MenuItemInternalProps>,\n typeof MENU_ITEM_DEFAULT_TAG\n>;\n","import React from 'react';\nimport { useMergeRefs } from '@floating-ui/react';\nimport { useMenuContext } from '../MenuContext';\n\nexport interface MenuTriggerProps {\n children: React.ReactElement;\n}\nexport const MenuTrigger = React.forwardRef<HTMLElement, MenuTriggerProps>(\n function MenuTrigger({ children }, forwardedRef) {\n const menu = useMenuContext();\n const {\n refs,\n item,\n isNested,\n isOpen,\n hasFocusInside,\n setHasFocusInside,\n parent,\n } = menu;\n\n // Existing ref on the child (if any) so we can merge it.\n const childRef: React.Ref<HTMLElement> | undefined = (\n children as unknown as { ref?: React.Ref<HTMLElement> }\n ).ref;\n\n // Get children's existing props to merge event handlers\n const childProps = children.props as React.ComponentPropsWithRef<'button'>;\n\n const parentActiveIndex = parent?.activeIndex;\n const getItemProps = parent ? parent.getItemProps : menu.getItemProps;\n\n const triggerProps = {\n ref: useMergeRefs([refs.setReference, item.ref, forwardedRef, childRef]),\n tabIndex: !isNested\n ? undefined\n : parentActiveIndex === item.index\n ? 0\n : -1,\n role: isNested ? 'menuitem' : undefined,\n 'data-open': isOpen ? '' : undefined,\n 'data-nested': isNested ? '' : undefined,\n 'data-focus-inside': hasFocusInside ? '' : undefined,\n ...menu.getReferenceProps(\n getItemProps({\n onClick: childProps.onClick,\n onMouseDown: childProps.onMouseDown,\n onKeyDown: childProps.onKeyDown,\n onMouseEnter: childProps.onMouseEnter,\n onMouseLeave: childProps.onMouseLeave,\n onPointerDown: childProps.onPointerDown,\n onPointerEnter: childProps.onPointerEnter,\n onPointerLeave: childProps.onPointerLeave,\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n childProps.onFocus?.(event);\n setHasFocusInside(false);\n if (parent) parent.setHasFocusInside(true);\n },\n }),\n ),\n };\n\n return React.cloneElement(children, triggerProps);\n },\n);\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuDividerStyles = () =>\n css({\n border: 'none',\n width: '100%',\n height: '1px',\n backgroundColor: tokens.gray200,\n margin: `${tokens.spacing2Xs} 0`,\n });\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { cx } from '@emotion/css';\nimport { getMenuDividerStyles } from './MenuDivider.styles';\n\nexport type MenuDividerProps = PropsWithHTMLElement<CommonProps, 'hr'>;\n\nexport const MenuDivider = (props: ExpandProps<MenuDividerProps>) => {\n const {\n children,\n testId = 'cf-ui-menu-divider',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuDividerStyles();\n\n return (\n <hr\n aria-orientation=\"horizontal\"\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n />\n );\n};\n\nMenuDivider.displayName = 'MenuDivider';\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuSectionTitleStyles = () =>\n css({\n color: tokens.gray500,\n textAlign: 'left',\n padding: `${tokens.spacingXs} ${tokens.spacingS} ${tokens.spacing2Xs}`,\n lineHeight: tokens.lineHeightM,\n });\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport { Caption, type CaptionProps } from '@contentful/f36-typography';\nimport type { ExpandProps } from '@contentful/f36-core';\n\nimport { getMenuSectionTitleStyles } from './MenuSectionTitle.styles';\n\nexport type MenuSectionTitleProps = CaptionProps;\n\nexport const MenuSectionTitle = (props: ExpandProps<MenuSectionTitleProps>) => {\n const {\n children,\n testId = 'cf-ui-menu-section-title',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuSectionTitleStyles();\n\n return (\n <Caption\n // Techincally, menus cannot contain headings according to ARIA.\n // We hide the heading from assistive technology, and only use it\n // as a label\n aria-hidden=\"true\"\n as=\"div\"\n testId={testId}\n className={cx(styles, className)}\n marginBottom=\"none\"\n {...otherProps}\n >\n {children}\n </Caption>\n );\n};\n","import React from 'react';\nimport { Menu, type MenuProps } from '../Menu';\n\n/**\n * @deprecated Submenu is deprecated. Use Menu component instead.\n * This component will be removed in a future version.\n *\n * Migration guide:\n * Replace `<Submenu>` with `<Menu>` - the API is identical.\n */\nexport const Submenu = (props: MenuProps) => {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.warn(\n '[Submenu] This component is deprecated. Use Menu component instead. ' +\n 'Replace <Submenu> with <Menu> - the API is identical.',\n );\n }\n\n return <Menu {...props} />;\n};\n\nSubmenu.displayName = 'Submenu';\n\n/**\n * @deprecated Use MenuProps instead.\n */\nexport type SubmenuProps = MenuProps;\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getSubmenuTriggerStyles = () => {\n return {\n root: ({ isActive }) =>\n css({\n display: 'flex',\n alignItems: 'center',\n paddingRight: tokens.spacingXs,\n ...(isActive\n ? {\n backgroundColor: tokens.gray100,\n }\n : {}),\n }),\n content: css({\n marginRight: tokens.spacingM,\n }),\n icon: css({\n marginLeft: 'auto',\n fill: 'currentColor',\n }),\n };\n};\n","import React from 'react';\nimport { MenuTrigger } from '../MenuTrigger/MenuTrigger';\nimport { MenuItem, MenuItemProps } from '../MenuItem/MenuItem';\nimport { useMenuContext } from '../MenuContext';\nimport { CaretRightIcon } from '@contentful/f36-icons';\nimport type { ExpandProps } from '@contentful/f36-core';\nimport { cx } from '@emotion/css';\nimport { getSubmenuTriggerStyles } from './SubmenuTrigger.styles';\n\nexport type SubmenuTriggerProps = Omit<\n MenuItemProps<'button'>,\n 'isInitiallyFocused' | 'as'\n>;\n\nconst SubmenuTriggerBase = (\n props: ExpandProps<SubmenuTriggerProps>,\n ref: React.Ref<HTMLButtonElement>,\n) => {\n const { className, children } = props;\n\n const styles = getSubmenuTriggerStyles();\n const { isOpen } = useMenuContext();\n\n return (\n <MenuTrigger>\n <MenuItem\n {...props}\n ref={ref}\n className={cx(styles.root({ isActive: isOpen }), className)}\n >\n <span className={styles.content}>{children}</span>\n <CaretRightIcon className={styles.icon} />\n </MenuItem>\n </MenuTrigger>\n );\n};\n\nexport const SubmenuTrigger = React.forwardRef(SubmenuTriggerBase);\n","import { Menu as OriginalMenu } from './Menu';\nimport { MenuList } from './MenuList/MenuList';\nimport { MenuListHeader } from './MenuList/MenuListHeader';\nimport { MenuListFooter } from './MenuList/MenuListFooter';\nimport { MenuItem } from './MenuItem/MenuItem';\nimport { MenuTrigger } from './MenuTrigger/MenuTrigger';\nimport { MenuDivider } from './MenuDivider/MenuDivider';\nimport { MenuSectionTitle } from './MenuSectionTitle/MenuSectionTitle';\nimport { Submenu } from './Submenu/Submenu';\nimport { SubmenuTrigger } from './SubmenuTrigger/SubmenuTrigger';\n\ntype CompoundMenu = typeof OriginalMenu & {\n List: typeof MenuList;\n ListHeader: typeof MenuListHeader;\n ListFooter: typeof MenuListFooter;\n Item: typeof MenuItem;\n Trigger: typeof MenuTrigger;\n Divider: typeof MenuDivider;\n SectionTitle: typeof MenuSectionTitle;\n Submenu: typeof Submenu;\n SubmenuTrigger: typeof SubmenuTrigger;\n};\n\nexport const Menu = OriginalMenu as CompoundMenu;\nMenu.List = MenuList;\nMenu.ListHeader = MenuListHeader;\nMenu.ListFooter = MenuListFooter;\nMenu.Item = MenuItem;\nMenu.Trigger = MenuTrigger;\nMenu.Divider = MenuDivider;\nMenu.SectionTitle = MenuSectionTitle;\nMenu.Submenu = Submenu;\nMenu.SubmenuTrigger = SubmenuTrigger;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/MenuContext.ts","../src/useMenu.ts","../src/MenuComponent.tsx","../src/Menu.tsx","../src/MenuList/MenuList.styles.ts","../src/MenuList/MenuListHeader.tsx","../src/MenuList/MenuListFooter.tsx","../src/MenuList/MenuList.tsx","../src/MenuItem/useMenuItem.tsx","../src/MenuItem/MenuItem.styles.ts","../src/MenuItem/MenuItem.tsx","../src/MenuTrigger/MenuTrigger.tsx","../src/MenuDivider/MenuDivider.styles.ts","../src/MenuDivider/MenuDivider.tsx","../src/MenuSectionTitle/MenuSectionTitle.styles.ts","../src/MenuSectionTitle/MenuSectionTitle.tsx","../src/Submenu/Submenu.tsx","../src/SubmenuTrigger/SubmenuTrigger.styles.ts","../src/SubmenuTrigger/SubmenuTrigger.tsx","../src/CompoundMenu.tsx"],"names":["MenuContext","React","useMenuContext","ctx","MenuContextProvider","useMenu","placement","isFullWidth","isAutoalignmentEnabled","controlledIsOpen","defaultIsOpen","onOpen","onClose","offsetProp","renderOnlyWhenOpen","usePortal","useTypeaheadProp","closeOnEsc","closeOnBlur","closeOnSelect","autoFocus","elementsRef","labelsRef","tree","useFloatingTree","nodeId","useFloatingNodeId","parentId","useFloatingParentNodeId","item","useListItem","parent","isNested","isControlled","uncontrolledIsOpen","setUncontrolledIsOpen","isOpen","prevOpenRef","handleOpenChange","nextOpen","_event","reason","wasOpen","hasFocusInside","setHasFocusInside","activeIndex","setActiveIndex","middleware","offset","sanitizedPlacement","flip","shift","autoPlacement","size","rects","elements","floatingStyles","refs","context","useFloating","autoUpdate","hover","useHover","safePolygon","click","useClick","role","useRole","dismiss","useDismiss","listNavigation","useListNavigation","typeahead","useTypeahead","getReferenceProps","getFloatingProps","getItemProps","useInteractions","handleTreeClick","onSubMenuOpen","event","MenuComponent","_a","_b","children","otherProps","__objRest","menuContext","__spreadValues","J","FloatingNode","Menu","props","resolvedPlacement","content","FloatingTree","getMenuHeaderStyles","css","tokens","getMenuFooterStyles","getMenuListStyles","MenuListHeader","testId","className","styles","cx","MenuListFooter","assertChild","child","MenuListBase","forwardedRef","style","menu","header","footer","items","useMergeRefs","appendChild","maybeWrapWithFocusManager","node","FloatingFocusManager","FloatingList","FloatingPortal","MenuList","useMenuItem","isActive","userProps","__spreadProps","getMenuItemStyles","isDisabled","globalGetMenuItemStyles","MENU_ITEM_DEFAULT_TAG","MenuItemBase","as","isInitiallyFocused","icon","propDisabled","menuItem","id","useId","itemTestId","Element","MenuItem","MenuTrigger","childRef","childProps","parentActiveIndex","triggerProps","getMenuDividerStyles","MenuDivider","getMenuSectionTitleStyles","MenuSectionTitle","Caption","Submenu","getSubmenuTriggerStyles","SubmenuTriggerBase","ref","CaretRightIcon","SubmenuTrigger"],"mappings":"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","file":"index.js","sourcesContent":["import React from 'react';\nimport type { UseMenuReturn } from './useMenu';\n\nexport const MenuContext = React.createContext<UseMenuReturn | null>(null);\n\nexport function useMenuContext() {\n const ctx = React.useContext(MenuContext);\n if (!ctx) {\n throw new Error(\n 'useMenuContext must be used within <MenuContext.Provider>',\n );\n }\n return ctx;\n}\nexport const MenuContextProvider = MenuContext.Provider;\n","import React from 'react';\nimport {\n autoUpdate,\n flip,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useRole,\n useTypeahead,\n autoPlacement,\n size,\n} from '@floating-ui/react';\nimport type { Placement, UseFloatingOptions } from '@floating-ui/react';\nimport type { MenuProps } from './Menu';\nimport { MenuContext } from './MenuContext';\n\nexport interface UseMenuReturn {\n // State\n isOpen: boolean;\n hasFocusInside: boolean;\n activeIndex: number | null;\n isNested: boolean;\n\n // Refs\n refs: {\n setReference: (node: HTMLButtonElement | null) => void;\n setFloating: (node: HTMLElement | null) => void;\n };\n elementsRef: React.RefObject<Array<HTMLButtonElement | null>>;\n labelsRef: React.RefObject<Array<string | null>>;\n\n // Floating UI\n floatingStyles: React.CSSProperties;\n context: ReturnType<typeof useFloating>['context'];\n renderOnlyWhenOpen: boolean;\n usePortal: boolean;\n autoFocus: boolean;\n\n // Props getters\n getReferenceProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n getFloatingProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n getItemProps: (\n userProps?: Record<string, unknown>,\n ) => Record<string, unknown>;\n\n // State setters\n setHasFocusInside: React.Dispatch<React.SetStateAction<boolean>>;\n setActiveIndex: React.Dispatch<React.SetStateAction<number | null>>;\n\n // Tree and item info\n nodeId: string;\n item: ReturnType<typeof useListItem>;\n parent: React.ContextType<typeof MenuContext>;\n}\n\nexport function useMenu({\n placement,\n isFullWidth = false,\n isAutoalignmentEnabled = true,\n isOpen: controlledIsOpen,\n defaultIsOpen = false,\n onOpen,\n onClose,\n offset: offsetProp,\n renderOnlyWhenOpen = true,\n usePortal = true,\n useTypeahead: useTypeaheadProp = false,\n closeOnEsc = true,\n closeOnBlur = true,\n closeOnSelect = true,\n autoFocus = true,\n}: MenuProps): UseMenuReturn {\n const elementsRef = React.useRef<Array<HTMLButtonElement | null>>([]);\n const labelsRef = React.useRef<Array<string | null>>([]);\n\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const item = useListItem();\n const parent = React.useContext(MenuContext);\n\n const isNested = parentId != null;\n\n /**\n * Handle open and closed state\n * supports controlled and uncontrolled behavior\n * */\n const isControlled = controlledIsOpen !== undefined;\n const [uncontrolledIsOpen, setUncontrolledIsOpen] =\n React.useState(defaultIsOpen);\n const isOpen = isControlled ? controlledIsOpen : uncontrolledIsOpen;\n\n // Track previous open for transition detection\n const prevOpenRef = React.useRef(isOpen);\n React.useEffect(() => {\n prevOpenRef.current = isOpen;\n }, [isOpen]);\n\n const handleOpenChange = React.useCallback<\n UseFloatingOptions['onOpenChange']\n >(\n (nextOpen, _event, reason) => {\n // if the user made component controlled by providing isOpen prop\n // but onOpen callback is not provided, we won't add toggle logic\n // to the trigger component. So they can make any toggle logic on their own.\n const isFullyControlled = isControlled && !onOpen;\n if (isFullyControlled && reason === 'click') {\n return;\n }\n\n const wasOpen = prevOpenRef.current;\n if (nextOpen === wasOpen) {\n return;\n }\n\n if (!isControlled) {\n setUncontrolledIsOpen(nextOpen);\n }\n\n if (nextOpen) {\n onOpen?.();\n } else {\n onClose?.();\n }\n },\n [isControlled, onOpen, onClose],\n );\n\n // Focus Handling\n const [hasFocusInside, setHasFocusInside] = React.useState(false);\n const [activeIndex, setActiveIndex] = React.useState<number>(0);\n\n /** Configure middleware based on placement with offset\n * and isAutoalignmentEnabled\n * If placement is \"auto\" it will use autoPlacement() in the middleware and not make use of flip and switch.\n * If isAutoalignmentEnabled is false, it will also not use flip and switch but only use the placement variable.\n */\n\n const offsetOption = offsetProp\n ? offsetProp\n : isNested\n ? { mainAxis: 4, alignmentAxis: -4 }\n : 5;\n\n const middleware = [offset(offsetOption)];\n\n // sanitize the placement to allow auto setting alongside with isAutoalignmentEnabled\n\n let sanitizedPlacement: Placement;\n\n if (placement !== 'auto' && isAutoalignmentEnabled) {\n sanitizedPlacement = placement;\n middleware.push(flip({ padding: 5 }), shift({ padding: 5 }));\n } else if (placement === 'auto') {\n middleware.push(autoPlacement());\n } else {\n sanitizedPlacement = placement;\n }\n\n /**\n * Set to same size as trigger reference element\n */\n if (isFullWidth) {\n middleware.push(\n size({\n apply({ rects, elements }) {\n Object.assign(elements.floating.style, {\n minWidth: `${rects.reference.width}px`,\n });\n },\n }),\n );\n }\n\n const { floatingStyles, refs, context } = useFloating<HTMLButtonElement>({\n nodeId,\n open: isOpen,\n onOpenChange: handleOpenChange,\n whileElementsMounted: autoUpdate,\n placement: sanitizedPlacement,\n middleware,\n });\n\n const hover = useHover(context, {\n enabled: isNested,\n delay: { open: 75 },\n handleClose: safePolygon({ blockPointerEvents: true }),\n });\n const click = useClick(context, {\n event: 'mousedown',\n toggle: !isNested,\n ignoreMouse: isNested,\n });\n const role = useRole(context, { role: 'menu' });\n\n const dismiss = useDismiss(context, {\n escapeKey: closeOnEsc,\n outsidePress: closeOnBlur,\n bubbles: true,\n });\n\n const listNavigation = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: isNested,\n onNavigate: setActiveIndex,\n loop: true,\n });\n\n const typeahead = useTypeahead(context, {\n enabled: useTypeaheadProp,\n listRef: labelsRef,\n onMatch: isOpen ? setActiveIndex : undefined,\n activeIndex,\n });\n\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNavigation, typeahead],\n );\n\n // Event emitter allows you to communicate across tree components.\n // This effect closes all menus when an item gets clicked anywhere\n // in the tree.\n React.useEffect(() => {\n if (!tree) return;\n\n function handleTreeClick() {\n // Only close menus on item click if the consumer opted in via closeOnSelect\n if (closeOnSelect) {\n handleOpenChange(false);\n }\n }\n\n function onSubMenuOpen(event: { nodeId: string; parentId: string }) {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n handleOpenChange(false);\n }\n }\n\n tree.events.on('click', handleTreeClick);\n tree.events.on('menuopen', onSubMenuOpen);\n\n return () => {\n tree.events.off('click', handleTreeClick);\n tree.events.off('menuopen', onSubMenuOpen);\n };\n }, [tree, nodeId, parentId, handleOpenChange, closeOnSelect]);\n\n React.useEffect(() => {\n if (isOpen && tree) {\n tree.events.emit('menuopen', { parentId, nodeId });\n }\n }, [tree, isOpen, nodeId, parentId]);\n\n return React.useMemo(\n () => ({\n // State\n isOpen,\n hasFocusInside,\n activeIndex,\n isNested,\n\n // Refs\n refs,\n elementsRef,\n labelsRef,\n\n // Floating UI\n floatingStyles,\n context,\n renderOnlyWhenOpen,\n usePortal,\n autoFocus,\n\n // Props getters\n getReferenceProps,\n getFloatingProps,\n getItemProps,\n\n // State setters\n setHasFocusInside,\n setActiveIndex,\n\n // Tree and item info\n nodeId,\n item,\n parent,\n }),\n [\n activeIndex,\n context,\n floatingStyles,\n getFloatingProps,\n getItemProps,\n getReferenceProps,\n hasFocusInside,\n isNested,\n isOpen,\n item,\n nodeId,\n parent,\n refs,\n renderOnlyWhenOpen,\n usePortal,\n autoFocus,\n ],\n );\n}\n","import * as React from 'react';\nimport { FloatingNode } from '@floating-ui/react';\nimport type { ExpandProps } from '@contentful/f36-core';\nimport { useMenu } from './useMenu';\nimport { MenuContextProvider } from './MenuContext';\nimport type { MenuProps } from './Menu';\n\nexport const MenuComponent = ({\n children,\n ...otherProps\n}: ExpandProps<MenuProps>) => {\n const menuContext = useMenu({ ...otherProps });\n return (\n <MenuContextProvider value={menuContext}>\n <FloatingNode id={menuContext.nodeId}>{children}</FloatingNode>\n </MenuContextProvider>\n );\n};\n","import React from 'react';\nimport {\n useFloatingParentNodeId,\n FloatingTree,\n type Placement,\n type OffsetOptions,\n} from '@floating-ui/react';\nimport { MenuComponent } from './MenuComponent';\nimport type { ExpandProps } from '@contentful/f36-core';\n\ntype BaseMenuProps = {\n /**\n * Boolean to determine if the Popover should be the same width as\n * the trigger element\n *\n * @default false\n */\n isFullWidth?: boolean;\n\n /**\n * If `true`, the Menu will be initially opened. This property has no influence on the uncontrolled status of the Menu\n */\n defaultIsOpen?: boolean;\n\n /**\n * Callback fired when the Menu opens\n */\n onOpen?: () => void;\n\n /**\n * Callback fired when the Menu closes\n */\n onClose?: () => void;\n\n /**\n * Determines the preferred position of where the MenuList opens. This position is not\n * guaranteed, as the MenuList might be moved to fit the viewport.\n *\n * @default bottom-start OR right-start\n */\n placement?: Placement | 'auto';\n\n /**\n * Boolean to control if popover is allowed to change its placement automatically\n * based on available space in the viewport.\n *\n * For example:\n * If you set placement prop to bottom, but there isn't enough space to position the popover in that direction,\n * it will change the popper placement to top. As soon as enough space is detected, the placement will be reverted to the defined one.\n *\n * If you want the popover to strictly follow the placement prop you should set this prop to false.\n *\n * @default true\n */\n isAutoalignmentEnabled?: boolean;\n\n /**\n * Single number as short hand for `mainAxis`\n * Or object which can contain `mainAxis`, `crossAxis` or `alignmentAxis`\n *\n * @default 0\n */\n offset?: OffsetOptions;\n\n /**\n * Defines if the menu list content should be rendered in the DOM only when it's open\n * or all the time (after the component has been mounted)\n *\n * @default true\n */\n renderOnlyWhenOpen?: boolean;\n\n /**\n * If `true`, the Menu will close when a menu item is\n * clicked\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnSelect?: boolean;\n\n /**\n * If true, the menu will close when you blur out it by clicking outside\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnBlur?: boolean;\n\n /**\n * If true, the menu will close when you hit the Esc key\n *\n * Note: This prop will be propagated to all submenus,\n * unless you will override it with props on submenu itself\n *\n * @default true\n */\n closeOnEsc?: boolean;\n\n /**\n * Boolean to control whether or not to render the Menu in a React Portal.\n * Rendering content inside a Portal allows the Menu to escape the bounds\n * of its parent while still being positioned correctly. Using a Portal is\n * necessary if an ancestor of the Menu hides overflow.\n *\n * @default true\n */\n usePortal?: boolean;\n\n /**\n * Boolean to control wether or not to enable Typeahead functionality\n * which enables focus an item as the user types\n */\n useTypeahead?: boolean;\n\n /**\n * If true, the Menu will be focused after opening\n *\n * @default true\n */\n autoFocus?: boolean;\n\n /**\n * Menu compound children (Trigger, List, Item, etc.)\n */\n children?: React.ReactNode;\n};\n\n// Uncontrolled: no isOpen prop\ninterface UncontrolledMenuProps extends BaseMenuProps {\n isOpen?: undefined;\n}\n\n// Controlled: isOpen present AND at least one of onOpen/onClose must be provided.\n// We encode this by creating two branches and unioning them; supplying neither will error.\ntype ControlledProps = BaseMenuProps & {\n isOpen: boolean;\n onOpen?: () => void;\n onClose?: () => void;\n} & (\n | { onOpen: () => void }\n | { onClose: () => void }\n | { onOpen: () => void; onClose: () => void }\n );\n\nexport type MenuProps = UncontrolledMenuProps | ControlledProps;\n\nexport const Menu = (props: ExpandProps<MenuProps>) => {\n const { children, placement, ...otherProps } = props;\n const parentId = useFloatingParentNodeId();\n\n // Set default placement based on nesting: root menus open down, nested menus open right\n const resolvedPlacement =\n placement ?? (parentId === null ? 'bottom-start' : 'right-start');\n\n const content = (\n <MenuComponent placement={resolvedPlacement} {...otherProps}>\n {children}\n </MenuComponent>\n );\n\n if (parentId === null) {\n return <FloatingTree>{content}</FloatingTree>;\n }\n\n return content;\n};\n\nMenu.displayName = 'Menu';\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuHeaderStyles = () => {\n return css({\n position: 'sticky',\n top: 0,\n left: 0,\n backgroundColor: tokens.colorWhite,\n borderBottom: `1px solid ${tokens.gray300}`,\n marginBottom: tokens.spacing2Xs,\n padding: `${tokens.spacing2Xs} 0`,\n zIndex: 1001,\n });\n};\n\nexport const getMenuFooterStyles = () => {\n return css({\n position: 'sticky',\n bottom: 0,\n left: 0,\n backgroundColor: tokens.colorWhite,\n borderTop: `1px solid ${tokens.gray300}`,\n marginTop: tokens.spacing2Xs,\n padding: `${tokens.spacing2Xs} 0`,\n zIndex: 1001,\n });\n};\n\nexport const getMenuListStyles = (props: {\n hasStickyFooter?: boolean;\n hasStickyHeader?: boolean;\n isOpen?: boolean;\n}) => ({\n container: css({\n display: props.isOpen ? 'initial' : 'none',\n // To get to our regular border radius for the inner menu items (6px),\n // we need to use 8px on the outer container\n borderRadius: '8px',\n overflowY: 'auto',\n position: 'absolute',\n top: 0,\n left: 0,\n padding: 0,\n background: tokens.colorWhite,\n paddingTop: props.hasStickyHeader ? 0 : tokens.spacing2Xs,\n paddingBottom: props.hasStickyFooter ? 0 : tokens.spacing2Xs,\n boxShadow: tokens.boxShadowDefault,\n zIndex: tokens.zIndexDropdown,\n '&:focus': {\n boxShadow: tokens.glowPrimary,\n outline: 'none',\n },\n '&:focus:not(:focus-visible)': {\n boxShadow: tokens.boxShadowDefault,\n },\n }),\n});\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\n\nimport { getMenuHeaderStyles } from './MenuList.styles';\n\nexport type MenuListHeaderProps = PropsWithHTMLElement<CommonProps, 'div'>;\n\nexport const MenuListHeader: React.FC<ExpandProps<MenuListHeaderProps>> = (\n props,\n) => {\n const {\n children,\n testId = 'cf-ui-menu-list-header',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuHeaderStyles();\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n >\n {children}\n </div>\n );\n};\n\nMenuListHeader.displayName = 'MenuListHeader';\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\n\nimport { getMenuFooterStyles } from './MenuList.styles';\n\nexport type MenuListFooterProps = PropsWithHTMLElement<CommonProps, 'div'>;\n\nexport const MenuListFooter: React.FC<ExpandProps<MenuListFooterProps>> = (\n props,\n) => {\n const {\n children,\n testId = 'cf-ui-menu-list-footer',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuFooterStyles();\n\n return (\n <div\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n >\n {children}\n </div>\n );\n};\n\nMenuListFooter.displayName = 'MenuListFooter';\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { useMenuContext } from '../MenuContext';\n\nimport { cx } from '@emotion/css';\nimport { getMenuListStyles } from './MenuList.styles';\nimport { MenuListHeader } from './MenuListHeader';\nimport { MenuListFooter } from './MenuListFooter';\nimport {\n FloatingList,\n FloatingPortal,\n FloatingFocusManager,\n useMergeRefs,\n} from '@floating-ui/react';\n\ninterface MenuListInternalProps extends CommonProps {\n children?: React.ReactNode;\n}\n\ntype ComponentWithDisplayName = React.ComponentType<unknown> & {\n displayName?: string;\n};\n\nfunction assertChild(\n child: React.ReactNode,\n): child is React.ReactElement<unknown, ComponentWithDisplayName> {\n if (!React.isValidElement(child)) return false;\n // Exclude intrinsic elements (strings like 'div')\n if (typeof child.type === 'string') return false;\n const type = child.type as ComponentWithDisplayName;\n return typeof type.displayName === 'string';\n}\n\nexport type MenuListProps = PropsWithHTMLElement<MenuListInternalProps, 'div'>;\n\nconst MenuListBase = (props: ExpandProps<MenuListProps>, forwardedRef) => {\n const {\n children,\n testId = 'cf-ui-menu-list',\n className,\n style,\n ...otherProps\n } = props;\n\n const menu = useMenuContext();\n let header: React.ReactElement | null = null;\n let footer: React.ReactElement | null = null;\n const items: React.ReactElement[] = [];\n\n const refs = useMergeRefs([menu.refs.setFloating, forwardedRef]);\n\n React.Children.forEach(children, (child) => {\n let appendChild = true;\n if (assertChild(child)) {\n if (child.type.displayName === MenuListHeader.displayName) {\n header = child as unknown as React.ReactElement;\n appendChild = false;\n } else if (child.type.displayName === MenuListFooter.displayName) {\n footer = child as unknown as React.ReactElement;\n appendChild = false;\n }\n }\n if (appendChild) {\n items.push(child as unknown as React.ReactElement);\n }\n });\n\n const styles = getMenuListStyles({\n hasStickyHeader: Boolean(header),\n hasStickyFooter: Boolean(footer),\n isOpen: menu.isOpen,\n });\n\n if (menu.renderOnlyWhenOpen && !menu.isOpen) {\n return null;\n }\n\n const content = (\n <div\n role=\"menu\"\n style={{ ...style, ...menu.floatingStyles }}\n className={cx(styles.container, className)}\n data-test-id={testId}\n ref={refs}\n {...otherProps}\n {...menu.getFloatingProps()}\n >\n {header}\n {items}\n {footer}\n </div>\n );\n\n const maybeWrapWithFocusManager = (node: React.ReactElement) =>\n menu.autoFocus === false ? (\n node\n ) : (\n <FloatingFocusManager\n context={menu.context}\n modal={false}\n initialFocus={menu.isNested ? -1 : 0}\n returnFocus={!menu.isNested}\n >\n {node}\n </FloatingFocusManager>\n );\n\n return (\n <FloatingList elementsRef={menu.elementsRef} labelsRef={menu.labelsRef}>\n {menu.usePortal ? (\n <FloatingPortal>\n {maybeWrapWithFocusManager(content as React.ReactElement)}\n </FloatingPortal>\n ) : (\n maybeWrapWithFocusManager(content as React.ReactElement)\n )}\n </FloatingList>\n );\n};\n\nMenuListBase.displayName = 'MenuList';\nexport const MenuList = React.forwardRef(MenuListBase);\n","import React from 'react';\nimport {\n useListItem,\n useFloatingTree,\n type FloatingTreeType,\n} from '@floating-ui/react';\nimport { MenuContext } from '../MenuContext';\n\ninterface UseMenuItemReturn {\n // State\n isActive: boolean;\n\n // Tree and context\n item: ReturnType<typeof useListItem>;\n menu: React.ContextType<typeof MenuContext>;\n tree: FloatingTreeType | null;\n\n // Props getters\n getItemProps: (\n userProps?: React.ButtonHTMLAttributes<HTMLButtonElement>,\n ) => Record<string, unknown>;\n}\n\nexport function useMenuItem(): UseMenuItemReturn {\n const menu = React.useContext(MenuContext);\n const item = useListItem();\n const tree = useFloatingTree();\n const isActive = item.index === menu.activeIndex;\n\n const getItemProps = React.useCallback(\n (userProps: React.ButtonHTMLAttributes<HTMLButtonElement> = {}) => {\n return menu.getItemProps({\n ...userProps,\n onClick(event: React.MouseEvent<HTMLButtonElement>) {\n userProps.onClick?.(event);\n tree?.events.emit('click');\n },\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n userProps.onFocus?.(event);\n menu.setHasFocusInside(true);\n },\n });\n },\n [menu, tree],\n );\n\n return {\n isActive,\n item,\n menu,\n tree,\n getItemProps,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { getMenuItemStyles as globalGetMenuItemStyles } from '@contentful/f36-core';\nimport type { MenuItemProps } from './MenuItem';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuItemStyles = ({\n isActive,\n isDisabled,\n}: {\n isActive: MenuItemProps['isActive'];\n isDisabled: MenuItemProps['isDisabled'];\n}) =>\n cx(\n globalGetMenuItemStyles({ isActive, isDisabled }),\n css({\n width: `calc(100% - 2 * ${tokens.spacing2Xs})`,\n margin: `0 ${tokens.spacing2Xs}`,\n gap: tokens.spacingXs,\n }),\n );\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport {\n useId,\n type CommonProps,\n type PolymorphicComponent,\n type PolymorphicProps,\n type ExpandProps,\n} from '@contentful/f36-core';\n\nimport { useMergeRefs } from '@floating-ui/react';\n\nimport { useMenuItem } from './useMenuItem';\nimport { getMenuItemStyles } from './MenuItem.styles';\n\nconst MENU_ITEM_DEFAULT_TAG = 'button';\n\ninterface MenuItemInternalProps extends CommonProps {\n children?: React.ReactNode;\n as?: 'a' | 'button';\n\n /**\n * Marks item as active\n */\n isActive?: boolean;\n /**\n * Marks item as disabled\n */\n isDisabled?: boolean;\n /**\n * Sets focus on item\n */\n isInitiallyFocused?: boolean;\n /**\n * Expects any of the icon components. Renders the icon aligned to the start\n */\n icon?: React.ReactElement;\n}\n\nexport type MenuItemProps<\n E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG,\n> = PolymorphicProps<MenuItemInternalProps, E>;\n\nfunction MenuItemBase<\n E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG,\n>(props: MenuItemProps<E>, forwardedRef: React.Ref<Element>) {\n const {\n testId,\n className,\n as,\n isActive = false,\n isDisabled,\n isInitiallyFocused,\n icon,\n ...otherProps\n } = props;\n const propDisabled = isDisabled ?? props.disabled;\n const menuItem = useMenuItem();\n const id = useId(undefined, 'menu-item');\n const itemTestId = testId || `cf-ui-${id}`;\n const styles = getMenuItemStyles({ isActive, isDisabled });\n\n const Element = (as ?? MENU_ITEM_DEFAULT_TAG) as React.ElementType;\n\n // If this item requests initial focus, set active index\n const { menu, item } = menuItem;\n const { setActiveIndex } = menu;\n\n React.useEffect(() => {\n if (isInitiallyFocused) {\n setActiveIndex(item.index);\n }\n }, [isInitiallyFocused, item.index, setActiveIndex]);\n\n return (\n <Element\n {...otherProps}\n ref={useMergeRefs([menuItem.item.ref, forwardedRef])}\n role=\"menuitem\"\n className={cx(styles, className)}\n data-test-id={itemTestId}\n tabIndex={menuItem.isActive ? 0 : -1}\n disabled={propDisabled}\n {...menuItem.getItemProps(otherProps)}\n >\n {icon}\n {props.children}\n </Element>\n );\n}\n\nMenuItemBase.displayName = 'MenuItem';\n\nexport const MenuItem = React.forwardRef(MenuItemBase) as PolymorphicComponent<\n ExpandProps<MenuItemInternalProps>,\n typeof MENU_ITEM_DEFAULT_TAG\n>;\n","import React from 'react';\nimport { useMergeRefs } from '@floating-ui/react';\nimport { useMenuContext } from '../MenuContext';\n\nexport interface MenuTriggerProps {\n children: React.ReactElement;\n}\nexport const MenuTrigger = React.forwardRef<HTMLElement, MenuTriggerProps>(\n function MenuTrigger({ children }, forwardedRef) {\n const menu = useMenuContext();\n const {\n refs,\n item,\n isNested,\n isOpen,\n hasFocusInside,\n setHasFocusInside,\n parent,\n } = menu;\n\n // Existing ref on the child (if any) so we can merge it.\n const childRef: React.Ref<HTMLElement> | undefined = (\n children as unknown as { ref?: React.Ref<HTMLElement> }\n ).ref;\n\n // Get children's existing props to merge event handlers\n const childProps = children.props as React.ComponentPropsWithRef<'button'>;\n\n const parentActiveIndex = parent?.activeIndex;\n const getItemProps = parent ? parent.getItemProps : menu.getItemProps;\n\n const triggerProps = {\n ref: useMergeRefs([refs.setReference, item.ref, forwardedRef, childRef]),\n tabIndex: !isNested\n ? undefined\n : parentActiveIndex === item.index\n ? 0\n : -1,\n role: isNested ? 'menuitem' : undefined,\n 'data-open': isOpen ? '' : undefined,\n 'data-nested': isNested ? '' : undefined,\n 'data-focus-inside': hasFocusInside ? '' : undefined,\n ...menu.getReferenceProps(\n getItemProps({\n onClick: childProps.onClick,\n onMouseDown: childProps.onMouseDown,\n onKeyDown: childProps.onKeyDown,\n onMouseEnter: childProps.onMouseEnter,\n onMouseLeave: childProps.onMouseLeave,\n onPointerDown: childProps.onPointerDown,\n onPointerEnter: childProps.onPointerEnter,\n onPointerLeave: childProps.onPointerLeave,\n onFocus(event: React.FocusEvent<HTMLButtonElement>) {\n childProps.onFocus?.(event);\n setHasFocusInside(false);\n if (parent) parent.setHasFocusInside(true);\n },\n }),\n ),\n };\n\n return React.cloneElement(children, triggerProps);\n },\n);\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuDividerStyles = () =>\n css({\n border: 'none',\n width: '100%',\n height: '1px',\n backgroundColor: tokens.gray200,\n margin: `${tokens.spacing2Xs} 0`,\n });\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { cx } from '@emotion/css';\nimport { getMenuDividerStyles } from './MenuDivider.styles';\n\nexport type MenuDividerProps = PropsWithHTMLElement<CommonProps, 'hr'>;\n\nexport const MenuDivider = (props: ExpandProps<MenuDividerProps>) => {\n const {\n children,\n testId = 'cf-ui-menu-divider',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuDividerStyles();\n\n return (\n <hr\n aria-orientation=\"horizontal\"\n data-test-id={testId}\n className={cx(styles, className)}\n {...otherProps}\n />\n );\n};\n\nMenuDivider.displayName = 'MenuDivider';\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getMenuSectionTitleStyles = () =>\n css({\n color: tokens.gray500,\n textAlign: 'left',\n padding: `${tokens.spacingXs} ${tokens.spacingS} ${tokens.spacing2Xs}`,\n lineHeight: tokens.lineHeightM,\n });\n","import React from 'react';\nimport { cx } from '@emotion/css';\nimport { Caption, type CaptionProps } from '@contentful/f36-typography';\nimport type { ExpandProps } from '@contentful/f36-core';\n\nimport { getMenuSectionTitleStyles } from './MenuSectionTitle.styles';\n\nexport type MenuSectionTitleProps = CaptionProps;\n\nexport const MenuSectionTitle = (props: ExpandProps<MenuSectionTitleProps>) => {\n const {\n children,\n testId = 'cf-ui-menu-section-title',\n className,\n ...otherProps\n } = props;\n\n const styles = getMenuSectionTitleStyles();\n\n return (\n <Caption\n // Techincally, menus cannot contain headings according to ARIA.\n // We hide the heading from assistive technology, and only use it\n // as a label\n aria-hidden=\"true\"\n as=\"div\"\n testId={testId}\n className={cx(styles, className)}\n marginBottom=\"none\"\n {...otherProps}\n >\n {children}\n </Caption>\n );\n};\n","import React from 'react';\nimport { Menu, type MenuProps } from '../Menu';\n\n/**\n * @deprecated Submenu is deprecated. Use Menu component instead.\n * This component will be removed in a future version.\n *\n * Migration guide:\n * Replace `<Submenu>` with `<Menu>` - the API is identical.\n */\nexport const Submenu = (props: MenuProps) => {\n if (process.env.NODE_ENV !== 'production') {\n // eslint-disable-next-line no-console\n console.warn(\n '[Submenu] This component is deprecated. Use Menu component instead. ' +\n 'Replace <Submenu> with <Menu> - the API is identical.',\n );\n }\n\n return <Menu {...props} />;\n};\n\nSubmenu.displayName = 'Submenu';\n\n/**\n * @deprecated Use MenuProps instead.\n */\nexport type SubmenuProps = MenuProps;\n","import { css } from '@emotion/css';\nimport tokens from '@contentful/f36-tokens';\n\nexport const getSubmenuTriggerStyles = () => {\n return {\n root: ({ isActive }) =>\n css({\n display: 'flex',\n alignItems: 'center',\n paddingRight: tokens.spacingXs,\n ...(isActive\n ? {\n backgroundColor: tokens.gray100,\n }\n : {}),\n }),\n content: css({\n marginRight: tokens.spacingM,\n }),\n icon: css({\n marginLeft: 'auto',\n fill: 'currentColor',\n }),\n };\n};\n","import React from 'react';\nimport { MenuTrigger } from '../MenuTrigger/MenuTrigger';\nimport { MenuItem, MenuItemProps } from '../MenuItem/MenuItem';\nimport { useMenuContext } from '../MenuContext';\nimport { CaretRightIcon } from '@contentful/f36-icons';\nimport type { ExpandProps } from '@contentful/f36-core';\nimport { cx } from '@emotion/css';\nimport { getSubmenuTriggerStyles } from './SubmenuTrigger.styles';\n\nexport type SubmenuTriggerProps = Omit<\n MenuItemProps<'button'>,\n 'isInitiallyFocused' | 'as'\n>;\n\nconst SubmenuTriggerBase = (\n props: ExpandProps<SubmenuTriggerProps>,\n ref: React.Ref<HTMLButtonElement>,\n) => {\n const { className, children } = props;\n\n const styles = getSubmenuTriggerStyles();\n const { isOpen } = useMenuContext();\n\n return (\n <MenuTrigger>\n <MenuItem\n {...props}\n ref={ref}\n className={cx(styles.root({ isActive: isOpen }), className)}\n >\n <span className={styles.content}>{children}</span>\n <CaretRightIcon className={styles.icon} />\n </MenuItem>\n </MenuTrigger>\n );\n};\n\nexport const SubmenuTrigger = React.forwardRef(SubmenuTriggerBase);\n","import { Menu as OriginalMenu } from './Menu';\nimport { MenuList } from './MenuList/MenuList';\nimport { MenuListHeader } from './MenuList/MenuListHeader';\nimport { MenuListFooter } from './MenuList/MenuListFooter';\nimport { MenuItem } from './MenuItem/MenuItem';\nimport { MenuTrigger } from './MenuTrigger/MenuTrigger';\nimport { MenuDivider } from './MenuDivider/MenuDivider';\nimport { MenuSectionTitle } from './MenuSectionTitle/MenuSectionTitle';\nimport { Submenu } from './Submenu/Submenu';\nimport { SubmenuTrigger } from './SubmenuTrigger/SubmenuTrigger';\n\ntype CompoundMenu = typeof OriginalMenu & {\n List: typeof MenuList;\n ListHeader: typeof MenuListHeader;\n ListFooter: typeof MenuListFooter;\n Item: typeof MenuItem;\n Trigger: typeof MenuTrigger;\n Divider: typeof MenuDivider;\n SectionTitle: typeof MenuSectionTitle;\n Submenu: typeof Submenu;\n SubmenuTrigger: typeof SubmenuTrigger;\n};\n\nexport const Menu = OriginalMenu as CompoundMenu;\nMenu.List = MenuList;\nMenu.ListHeader = MenuListHeader;\nMenu.ListFooter = MenuListFooter;\nMenu.Item = MenuItem;\nMenu.Trigger = MenuTrigger;\nMenu.Divider = MenuDivider;\nMenu.SectionTitle = MenuSectionTitle;\nMenu.Submenu = Submenu;\nMenu.SubmenuTrigger = SubmenuTrigger;\n"]}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contentful/f36-menu",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.3.1",
|
|
4
4
|
"description": "Forma 36: Menu component",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "tsup"
|
|
7
7
|
},
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@contentful/f36-core": "^6.
|
|
10
|
-
"@contentful/f36-icons": "^6.
|
|
11
|
-
"@contentful/f36-popover": "^6.
|
|
9
|
+
"@contentful/f36-core": "^6.3.1",
|
|
10
|
+
"@contentful/f36-icons": "^6.3.1",
|
|
11
|
+
"@contentful/f36-popover": "^6.3.1",
|
|
12
12
|
"@contentful/f36-tokens": "^6.1.0",
|
|
13
|
-
"@contentful/f36-typography": "^6.
|
|
13
|
+
"@contentful/f36-typography": "^6.3.1",
|
|
14
14
|
"@contentful/f36-utils": "^6.1.0",
|
|
15
15
|
"@emotion/css": "^11.13.5",
|
|
16
16
|
"@floating-ui/dom": "^1.7.4",
|