@contentful/f36-menu 5.5.0 → 6.0.0-alpha.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 CHANGED
@@ -1,13 +1,2 @@
1
- import W, { useRef, useEffect, useState, useCallback, useMemo } from 'react';
2
- import { useId, mergeRefs, useControllableState, getMenuItemStyles } from '@contentful/f36-core';
3
- import { Popover } from '@contentful/f36-popover';
4
- import { cx, css } from 'emotion';
5
- import v from '@contentful/f36-tokens';
6
- import { Caption } from '@contentful/f36-typography';
7
- import { CaretRightIcon } from '@contentful/f36-icons';
8
-
9
- var Fe=Object.defineProperty,ke=Object.defineProperties;var We=Object.getOwnPropertyDescriptors;var B=Object.getOwnPropertySymbols;var ae=Object.prototype.hasOwnProperty,ce=Object.prototype.propertyIsEnumerable;var me=(e,t,o)=>t in e?Fe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,i=(e,t)=>{for(var o in t||(t={}))ae.call(t,o)&&me(e,o,t[o]);if(B)for(var o of B(t))ce.call(t,o)&&me(e,o,t[o]);return e},C=(e,t)=>ke(e,We(t));var x=(e,t)=>{var o={};for(var n in e)ae.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(e!=null&&B)for(var n of B(e))t.indexOf(n)<0&&ce.call(e,n)&&(o[n]=e[n]);return o};var pe={vertical:{prev:"ArrowUp",next:"ArrowDown"},horizontal:{prev:"ArrowLeft",next:"ArrowRight"}},le=({itemsContainerRef:e,itemsSelector:t,keyType:o="vertical"})=>{let[n,u]=useState(0),a=useCallback(s=>{let l=e.current;if(!l)return;let b=l.querySelectorAll(t);if(b.length===0)return;let c=b.length-1,S=()=>u(0),T=()=>u(c),p=()=>{n===c?S():u(n+1);},d=()=>{n===0?T():u(n-1);},g={[pe[o].next]:p,[pe[o].prev]:d}[s.key];g&&(s.preventDefault(),g());},[n,t,e,o]);return {focusedIndex:n,handleArrowsKeyDown:a,setFocusedIndex:u}};var de=W.createContext(void 0),w=()=>{let e=W.useContext(de);if(e===void 0)throw new Error("useMenuContext must be used within a MenuContextProvider");return e},ge=de.Provider;var z='[role="menuitem"]:not(:disabled)';function U(e){let ne=e,{closeOnSelect:t=!0,closeOnBlur:o=!0,closeOnEsc:n=!0,children:u,onOpen:a}=ne,s=x(ne,["closeOnSelect","closeOnBlur","closeOnEsc","children","onOpen"]),{isOpen:l,handleOpen:b,handleClose:c,isControlled:S}=useControllableState({isOpen:e.isOpen,defaultIsOpen:e.defaultIsOpen,onOpen:a,onClose:e.onClose}),T=useRef(null),p=useRef(null),d=useId(null,"menu"),{focusedIndex:f,handleArrowsKeyDown:g,setFocusedIndex:N}=le({itemsContainerRef:p,itemsSelector:z});useEffect(()=>{if(l&&p.current){let r=p.current.querySelectorAll(z);r.length>0&&f<r.length?setTimeout(()=>{r[f].focus({preventScroll:!1});},0):setTimeout(()=>{var E;(E=p.current)==null||E.focus({preventScroll:!1});},0);}},[l,f]);let R=useCallback(r=>{let P=[...p.current.querySelectorAll(z)].findIndex(y=>r===y);P!==-1&&N(P);},[N]),m=useCallback(()=>{var r;c(),(r=T.current)==null||r.focus({preventScroll:!0});},[c]),O=useCallback(r=>{if(r.key==="Tab"){r.preventDefault(),m();return}if(r.stopPropagation(),r.key==="ArrowLeft"){r.preventDefault(),m();return}g(r);},[m,g]),M=useRef(!1),h=useMemo(()=>({isOpen:l,menuId:d,focusMenuItem:R,getTriggerProps:(r={},E=null)=>({onMouseDown:P=>{var y;M.current=!0,(y=r.onMouseDown)==null||y.call(r,P);},onMouseUp:P=>{var y;M.current=!1,(y=r.onMouseUp)==null||y.call(r,P);},onClick:P=>{var I;S&&!a||(l?c():b()),(I=r.onClick)==null||I.call(r,P);},ref:mergeRefs(T,E)}),getMenuListProps:(r={},E=null)=>({ref:mergeRefs(p,E),onKeyDown:P=>{var y;O(P),(y=r.onKeyDown)==null||y.call(r,P);},onBlur:P=>{var re,se,ie,ue;if((re=r.onBlur)==null||re.call(r,P),!o)return;let y=document.activeElement,I=P.relatedTarget||y,He=p.current===I||((se=p.current)==null?void 0:se.contains(I)),Ae=T.current===I||((ie=T.current)==null?void 0:ie.contains(I))||M.current,De=((ue=I==null?void 0:I.parentElement)==null?void 0:ue.dataset.parentMenu)===d;if(He||Ae||De){P.stopPropagation();return}c();}}),getMenuItemProps:(r={})=>({onClick:E=>{var y;(y=r.onClick)==null||y.call(r,E);let P=!!E.target.getAttribute("aria-haspopup");t&&!P&&m();}}),propsToPropagateToSubmenus:{closeOnSelect:t,closeOnBlur:o,closeOnEsc:n}}),[d,l,O,t,c,b,R,o,n,m,S,a]);return W.createElement(ge,{value:h},W.createElement(Popover,C(i({},s),{isOpen:l,onClose:c,id:d,closeOnEsc:n,autoFocus:!1,closeOnBlur:!1}),u))}var xe=W.createContext(void 0),K=()=>W.useContext(xe),Te=xe.Provider;var be=()=>css({position:"sticky",top:0,left:0,backgroundColor:v.colorWhite,borderBottom:`1px solid ${v.gray300}`,marginBottom:v.spacing2Xs,padding:`${v.spacing2Xs} 0`,zIndex:1001}),Se=()=>css({position:"sticky",bottom:0,left:0,backgroundColor:v.colorWhite,borderTop:`1px solid ${v.gray300}`,marginTop:v.spacing2Xs,padding:`${v.spacing2Xs} 0`,zIndex:1001}),Ce=e=>({container:css({borderRadius:"8px",overflowY:"auto",position:"relative",padding:0,paddingTop:e.hasStickyHeader?0:v.spacing2Xs,paddingBottom:e.hasStickyFooter?0:v.spacing2Xs})});var H=e=>{let s=e,{children:t,testId:o="cf-ui-menu-list-header",className:n}=s,u=x(s,["children","testId","className"]),a=be();return W.createElement("div",i({"data-test-id":o,className:cx(a,n)},u),t)};H.displayName="MenuListHeader";var A=e=>{let s=e,{children:t,testId:o="cf-ui-menu-list-footer",className:n}=s,u=x(s,["children","testId","className"]),a=Se();return W.createElement("div",i({"data-test-id":o,className:cx(a,n)},u),t)};A.displayName="MenuListFooter";function Ze(e){var t;return !!((t=e==null?void 0:e.type)!=null&&t.displayName)}var _e=(e,t)=>{let d=e,{children:o,testId:n="cf-ui-menu-list",className:u}=d,a=x(d,["children","testId","className"]),{getMenuListProps:s}=w(),l=K(),b=null,c=null,S=[];W.Children.forEach(o,f=>{let g=!0;Ze(f)&&(f.type.displayName===H.displayName?(b=f,g=!1):f.type.displayName===A.displayName&&(c=f,g=!1)),g&&S.push(f);});let T=Ce({hasStickyHeader:!!b,hasStickyFooter:!!c}),p=l?l.getSubmenuListProps(a):a;return W.createElement(Popover.Content,C(i(i({role:"menu"},p),s(p,t)),{className:cx(T.container,u),testId:n}),b,S,c)},Y=W.forwardRef(_e);var he=({isActive:e,isDisabled:t})=>cx(getMenuItemStyles({isActive:e,isDisabled:t}),css({width:`calc(100% - 2 * ${v.spacing2Xs})`,margin:`0 ${v.spacing2Xs}`,gap:v.spacingXs}));var mt="button";function Ie(e,t){let R=e,{testId:o,className:n,as:u,isActive:a=!1,isDisabled:s,isInitiallyFocused:l,icon:b}=R,c=x(R,["testId","className","as","isActive","isDisabled","isInitiallyFocused","icon"]),S=useId(void 0,"menu-item"),T=o||`cf-ui-${S}`,p=he({isActive:a,isDisabled:s}),{getMenuItemProps:d,focusMenuItem:f}=w(),g=useRef(null);useEffect(()=>{l&&g.current&&f(g.current);},[l,f]);let N=u!=null?u:mt;return W.createElement(N,C(i(i({role:"menuitem"},c),d(c)),{disabled:s!=null?s:e.disabled,className:cx(p,n),"data-test-id":T,ref:mergeRefs(g,t),tabIndex:-1}),b,e.children)}Ie.displayName="MenuItem";var D=W.forwardRef(Ie);var F=e=>{let t=W.Children.only(e.children),{getTriggerProps:o}=w();return W.createElement(Popover.Trigger,null,W.cloneElement(t,C(i({},o(t.props,t.ref)),{"aria-haspopup":"menu"})))};var Le=()=>css({border:"none",width:"100%",height:"1px",backgroundColor:v.gray200,margin:`${v.spacing2Xs} 0`});var J=e=>{let s=e,{children:t,testId:o="cf-ui-menu-divider",className:n}=s,u=x(s,["children","testId","className"]),a=Le();return W.createElement("hr",i({"aria-orientation":"horizontal","data-test-id":o,className:cx(a,n)},u))};var Re=()=>css({color:v.gray500,textAlign:"left",padding:`${v.spacingXs} ${v.spacingS} ${v.spacing2Xs}`,lineHeight:v.lineHeightM});var Q=e=>{let s=e,{children:t,testId:o="cf-ui-menu-section-title",className:n}=s,u=x(s,["children","testId","className"]),a=Re();return W.createElement(Caption,i({"aria-hidden":"true",as:"div",testId:o,className:cx(a,n),marginBottom:"none"},u),t)};var bt=[-8,2],_=e=>{let R=e,{onClose:t,onOpen:o,placement:n="right-start",isAutoalignmentEnabled:u=!1}=R,a=x(R,["onClose","onOpen","placement","isAutoalignmentEnabled"]),{isOpen:s,menuId:l,propsToPropagateToSubmenus:b}=w(),c=useRef(null),S=useRef(null),[T,p]=useState(!1),d=useCallback(()=>{p(!0),window.clearTimeout(S.current),o==null||o();},[o]),f=useCallback(()=>{p(!1),window.clearTimeout(S.current),t==null||t();},[t]),g=useCallback(()=>{var m;f(),(m=c.current)==null||m.focus({preventScroll:!0});},[f]);useEffect(()=>{s===!1&&p(!1);},[s]);let N=useMemo(()=>({isOpen:T,getSubmenuListProps:m=>({"data-parent-menu":l,onMouseOver:O=>{var M;d(),(M=m.onMouseOver)==null||M.call(m,O);},onMouseLeave:O=>{var M;g(),(M=m.onMouseLeave)==null||M.call(m,O);}}),getSubmenuTriggerProps:(m,O)=>({ref:mergeRefs(c,O),onKeyDown:M=>{var h;M.key==="ArrowRight"&&(M.preventDefault(),d()),(h=m.onKeyDown)==null||h.call(m,M);},onMouseOver:M=>{var h;d(),(h=m.onMouseOver)==null||h.call(m,M);},onMouseLeave:M=>{var h;S.current=window.setTimeout(g,300),(h=m.onMouseLeave)==null||h.call(m,M);}})}),[T,l,d,g]);return W.createElement(Te,{value:N},W.createElement(U,C(i(i({},b),a),{isOpen:T,onClose:f,onOpen:d,placement:n,isAutoalignmentEnabled:u,offset:bt})))};var Ne=()=>({root:({isActive:e})=>css(i({display:"flex",alignItems:"center",paddingRight:v.spacingXs},e?{backgroundColor:v.gray100}:{})),content:css({marginRight:v.spacingM}),icon:css({marginLeft:"auto",fill:"currentColor"})});var ht=(e,t)=>{let{className:o,children:n}=e,{getSubmenuTriggerProps:u,isOpen:a}=K(),s=Ne();return W.createElement(F,null,W.createElement(D,C(i(i({},e),u(e,t)),{className:cx(s.root({isActive:a}),o)}),W.createElement("span",{className:s.content},n),W.createElement(CaretRightIcon,{className:s.icon})))},oe=W.forwardRef(ht);var L=U;L.List=Y;L.ListHeader=H;L.ListFooter=A;L.Item=D;L.Trigger=F;L.Divider=J;L.SectionTitle=Q;L.Submenu=_;L.SubmenuTrigger=oe;
10
-
11
- export { L as Menu, J as MenuDivider, D as MenuItem, Y as MenuList, Q as MenuSectionTitle, F as MenuTrigger, _ as Submenu, oe as SubmenuTrigger };
12
- //# sourceMappingURL=out.js.map
1
+ import*as M from'react';import M__default from'react';import {FloatingNode,useFloatingParentNodeId,FloatingTree,useMergeRefs,useFloatingTree,useFloatingNodeId,useListItem,offset,flip,shift,autoPlacement,size,useFloating,autoUpdate,useHover,safePolygon,useClick,useRole,useDismiss,useListNavigation,useTypeahead,useInteractions,FloatingList,FloatingPortal,FloatingFocusManager}from'@floating-ui/react';import {css,cx}from'@emotion/css';import f from'@contentful/f36-tokens';import {useId,getMenuItemStyles}from'@contentful/f36-core';import {Caption}from'@contentful/f36-typography';import {CaretRightIcon}from'@contentful/f36-icons';var ze=Object.defineProperty,Ge=Object.defineProperties;var je=Object.getOwnPropertyDescriptors;var G=Object.getOwnPropertySymbols;var Me=Object.prototype.hasOwnProperty,ye=Object.prototype.propertyIsEnumerable;var ge=(e,o,t)=>o in e?ze(e,o,{enumerable:true,configurable:true,writable:true,value:t}):e[o]=t,i=(e,o)=>{for(var t in o||(o={}))Me.call(o,t)&&ge(e,t,o[t]);if(G)for(var t of G(o))ye.call(o,t)&&ge(e,t,o[t]);return e},P=(e,o)=>Ge(e,je(o));var m=(e,o)=>{var t={};for(var r in e)Me.call(e,r)&&o.indexOf(r)<0&&(t[r]=e[r]);if(e!=null&&G)for(var r of G(e))o.indexOf(r)<0&&ye.call(e,r)&&(t[r]=e[r]);return t};var H=M__default.createContext(null);function k(){let e=M__default.useContext(H);if(!e)throw new Error("useMenuContext must be used within <MenuContext.Provider>");return e}var Pe=H.Provider;function Re({placement:e,isFullWidth:o=false,isAutoalignmentEnabled:t=true,isOpen:r,defaultIsOpen:u=false,onOpen:s,onClose:n,offset:a,renderOnlyWhenOpen:g=true,usePortal:c=true,closeOnEsc:E=true,closeOnBlur:y=true,closeOnSelect:v=true,autoFocus:d=true}){let I=M__default.useRef([]),T=M__default.useRef([]),p=useFloatingTree(),l=useFloatingNodeId(),x=useFloatingParentNodeId(),S=useListItem(),ie=M__default.useContext(H),C=x!=null,K=!!r,[Ae,Oe]=M__default.useState(u),b=K?!!r:Ae,ae=M__default.useRef(b);M__default.useEffect(()=>{ae.current=b;},[b]);let _=M__default.useCallback(h=>{let F=ae.current;h!==F&&(K||Oe(h),h&&!F?s==null||s():!h&&F&&(n==null||n()));},[K,s,n]),[ue,De]=M__default.useState(false),[$,Y]=M__default.useState(0),z=[offset(a||(C?{mainAxis:4,alignmentAxis:-4}:5))],q;e!=="auto"&&t?(q=e,z.push(flip({padding:5}),shift({padding:5}))):e==="auto"?z.push(autoPlacement()):q=e,o&&z.push(size({apply({rects:h,elements:F}){Object.assign(F.floating.style,{minWidth:`${h.reference.width}px`});}}));let{floatingStyles:pe,refs:me,context:L}=useFloating({nodeId:l,open:b,onOpenChange:_,whileElementsMounted:autoUpdate,placement:q,middleware:z}),Be=useHover(L,{enabled:C,delay:{open:75},handleClose:safePolygon({blockPointerEvents:true})}),We=useClick(L,{event:"mousedown",toggle:!C,ignoreMouse:C}),Ue=useRole(L,{role:"menu"}),Xe=useDismiss(L,{escapeKey:E,outsidePress:y,ancestorScroll:true,bubbles:true}),_e=useListNavigation(L,{listRef:I,activeIndex:$,nested:C,onNavigate:Y,loop:true}),$e=useTypeahead(L,{listRef:T,onMatch:b?Y:void 0,activeIndex:$}),{getReferenceProps:ce,getFloatingProps:le,getItemProps:de}=useInteractions([Be,We,Ue,Xe,_e,$e]);return M__default.useEffect(()=>{if(!p)return;function h(){v&&_(false);}function F(fe){fe.nodeId!==l&&fe.parentId===x&&_(false);}return p.events.on("click",h),p.events.on("menuopen",F),()=>{p.events.off("click",h),p.events.off("menuopen",F);}},[p,l,x,_,v]),M__default.useEffect(()=>{b&&p&&p.events.emit("menuopen",{parentId:x,nodeId:l});},[p,b,l,x]),M__default.useMemo(()=>({isOpen:b,hasFocusInside:ue,activeIndex:$,isNested:C,refs:me,elementsRef:I,labelsRef:T,floatingStyles:pe,context:L,renderOnlyWhenOpen:g,usePortal:c,autoFocus:d,getReferenceProps:ce,getFloatingProps:le,getItemProps:de,setHasFocusInside:De,setActiveIndex:Y,nodeId:l,item:S,parent:ie}),[$,L,pe,le,de,ce,ue,C,b,S,l,ie,me,g,c,d])}var Ie=M.forwardRef(function(u,r){var s=u,{children:o}=s,t=m(s,["children"]);let n=Re(i({},t));return M.createElement(Pe,{value:n},M.createElement(FloatingNode,{id:n.nodeId},M.createElement("div",{ref:r},o)))});var A=M__default.forwardRef(function(o,t){let c=o,{children:r,placement:u}=c,s=m(c,["children","placement"]),n=useFloatingParentNodeId(),a=u!=null?u:n===null?"bottom-start":"right-start",g=M__default.createElement(Ie,P(i({placement:a},s),{ref:t}),r);return n===null?M__default.createElement(FloatingTree,null,g):g});A.displayName="Menu";var Te=()=>css({position:"sticky",top:0,left:0,backgroundColor:f.colorWhite,borderBottom:`1px solid ${f.gray300}`,marginBottom:f.spacing2Xs,padding:`${f.spacing2Xs} 0`,zIndex:1001}),be=()=>css({position:"sticky",bottom:0,left:0,backgroundColor:f.colorWhite,borderTop:`1px solid ${f.gray300}`,marginTop:f.spacing2Xs,padding:`${f.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:f.colorWhite,paddingTop:e.hasStickyHeader?0:f.spacing2Xs,paddingBottom:e.hasStickyFooter?0:f.spacing2Xs,boxShadow:f.boxShadowDefault,zIndex:f.zIndexDropdown,"&:focus":{boxShadow:f.glowPrimary,outline:"none"},"&:focus:not(:focus-visible)":{boxShadow:f.boxShadowDefault}})});var O=e=>{let n=e,{children:o,testId:t="cf-ui-menu-list-header",className:r}=n,u=m(n,["children","testId","className"]),s=Te();return M__default.createElement("div",i({"data-test-id":t,className:cx(s,r)},u),o)};O.displayName="MenuListHeader";var D=e=>{let n=e,{children:o,testId:t="cf-ui-menu-list-footer",className:r}=n,u=m(n,["children","testId","className"]),s=be();return M__default.createElement("div",i({"data-test-id":t,className:cx(s,r)},u),o)};D.displayName="MenuListFooter";function ht(e){return !M__default.isValidElement(e)||typeof e.type=="string"?false:typeof e.type.displayName=="string"}var Ee=(e,o)=>{let T=e,{children:t,testId:r="cf-ui-menu-list",className:u,style:s}=T,n=m(T,["children","testId","className","style"]),a=k(),g=null,c=null,E=[],y=useMergeRefs([a.refs.setFloating,o]);M__default.Children.forEach(t,p=>{let l=true;ht(p)&&(p.type.displayName===O.displayName?(g=p,l=false):p.type.displayName===D.displayName&&(c=p,l=false)),l&&E.push(p);});let v=he({hasStickyHeader:!!g,hasStickyFooter:!!c,isOpen:a.isOpen});if(a.renderOnlyWhenOpen&&!a.isOpen)return null;let d=M__default.createElement("div",i(i({role:"menu",style:i(i({},s),a.floatingStyles),className:cx(v.container,u),"data-test-id":r,ref:y},n),a.getFloatingProps()),g,E,c),I=p=>a.autoFocus===false?p:M__default.createElement(FloatingFocusManager,{context:a.context,modal:false,initialFocus:a.isNested?-1:0,returnFocus:!a.isNested},p);return M__default.createElement(FloatingList,{elementsRef:a.elementsRef,labelsRef:a.labelsRef},a.usePortal?M__default.createElement(FloatingPortal,null,I(d)):I(d))};Ee.displayName="MenuList";var Z=M__default.forwardRef(Ee);function Se(){let e=M__default.useContext(H),o=useListItem(),t=useFloatingTree(),r=o.index===e.activeIndex,u=M__default.useCallback((s={})=>e.getItemProps(P(i({},s),{onClick(n){var a;(a=s.onClick)==null||a.call(s,n),t==null||t.events.emit("click");},onFocus(n){var a;(a=s.onFocus)==null||a.call(s,n),e.setHasFocusInside(true);}})),[e,t]);return {isActive:r,item:o,menu:e,tree:t,getItemProps:u}}var Le=({isActive:e,isDisabled:o})=>cx(getMenuItemStyles({isActive:e,isDisabled:o}),css({width:`calc(100% - 2 * ${f.spacing2Xs})`,margin:`0 ${f.spacing2Xs}`,gap:f.spacingXs}));var kt="button";function Fe(e,o){let S=e,{testId:t,className:r,as:u,isActive:s=false,isDisabled:n,isInitiallyFocused:a,icon:g}=S,c=m(S,["testId","className","as","isActive","isDisabled","isInitiallyFocused","icon"]),E=n!=null?n:e.disabled,y=Se(),v=useId(void 0,"menu-item"),d=t||`cf-ui-${v}`,I=Le({isActive:s,isDisabled:n}),T=u!=null?u:kt,{menu:p,item:l}=y,{setActiveIndex:x}=p;return M__default.useEffect(()=>{a&&x(l.index);},[a,l.index,x]),M__default.createElement(T,i(P(i({},c),{ref:useMergeRefs([y.item.ref,o]),role:"menuitem",className:cx(I,r),"data-test-id":d,tabIndex:y.isActive?0:-1,disabled:E}),y.getItemProps(c)),g,e.children)}Fe.displayName="MenuItem";var B=M__default.forwardRef(Fe);var W=M__default.forwardRef(function(u,r){var s=u,{children:o}=s,t=m(s,["children"]);let n=k(),{refs:a,item:g,isNested:c,isOpen:E,hasFocusInside:y,setHasFocusInside:v,parent:d}=n,I=o.ref,T=d==null?void 0:d.activeIndex,p=d?d.getItemProps:n.getItemProps,l=i({ref:useMergeRefs([a.setReference,g.ref,r,I]),tabIndex:c?T===g.index?0:-1:void 0,role:c?"menuitem":void 0,"data-open":E?"":void 0,"data-nested":c?"":void 0,"data-focus-inside":y?"":void 0},n.getReferenceProps(p(P(i({},t),{onFocus(x){var S;(S=t.onFocus)==null||S.call(t,x),v(false),d&&d.setHasFocusInside(true);}}))));return M__default.cloneElement(o,l)});var He=()=>css({border:"none",width:"100%",height:"1px",backgroundColor:f.gray200,margin:`${f.spacing2Xs} 0`});var j=e=>{let n=e,{children:o,testId:t="cf-ui-menu-divider",className:r}=n,u=m(n,["children","testId","className"]),s=He();return M__default.createElement("hr",i({"aria-orientation":"horizontal","data-test-id":t,className:cx(s,r)},u))};j.displayName="MenuDivider";var ke=()=>css({color:f.gray500,textAlign:"left",padding:`${f.spacingXs} ${f.spacingS} ${f.spacing2Xs}`,lineHeight:f.lineHeightM});var oe=e=>{let n=e,{children:o,testId:t="cf-ui-menu-section-title",className:r}=n,u=m(n,["children","testId","className"]),s=ke();return M__default.createElement(Caption,i({"aria-hidden":"true",as:"div",testId:t,className:cx(s,r),marginBottom:"none"},u),o)};var V=e=>M__default.createElement(A,i({},e));V.displayName="Submenu";var we=()=>({root:({isActive:e})=>css(i({display:"flex",alignItems:"center",paddingRight:f.spacingXs},e?{backgroundColor:f.gray100}:{})),content:css({marginRight:f.spacingM}),icon:css({marginLeft:"auto",fill:"currentColor"})});var Gt=(e,o)=>{let{className:t,children:r}=e,u=we(),{isOpen:s}=k();return M__default.createElement(W,null,M__default.createElement(B,P(i({},e),{ref:o,className:cx(u.root({isActive:s}),t)}),M__default.createElement("span",{className:u.content},r),M__default.createElement(CaretRightIcon,{className:u.icon})))},se=M__default.forwardRef(Gt);var R=A;R.List=Z;R.ListHeader=O;R.ListFooter=D;R.Item=B;R.Trigger=W;R.Divider=j;R.SectionTitle=oe;R.Submenu=V;R.SubmenuTrigger=se;export{R as Menu,j as MenuDivider,B as MenuItem,Z as MenuList,oe as MenuSectionTitle,W as MenuTrigger,V as Submenu,se as SubmenuTrigger};//# sourceMappingURL=index.js.map
13
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Menu.tsx","../../src/useArrowKeyNavigation.ts","../../src/MenuContext.ts","../../src/MenuList/MenuList.tsx","../../src/SubmenuContext.ts","../../src/MenuList/MenuList.styles.ts","../../src/MenuList/MenuListHeader.tsx","../../src/MenuList/MenuListFooter.tsx","../../src/MenuItem/MenuItem.tsx","../../src/MenuItem/MenuItem.styles.ts","../../src/MenuTrigger/MenuTrigger.tsx","../../src/MenuDivider/MenuDivider.tsx","../../src/MenuDivider/MenuDivider.styles.ts","../../src/MenuSectionTitle/MenuSectionTitle.tsx","../../src/MenuSectionTitle/MenuSectionTitle.styles.ts","../../src/Submenu/Submenu.tsx","../../src/SubmenuTrigger/SubmenuTrigger.tsx","../../src/SubmenuTrigger/SubmenuTrigger.styles.ts","../../src/CompoundMenu.tsx"],"names":["React","useCallback","useMemo","useRef","useEffect","mergeRefs","useId","useControllableState","Popover","useState","ARROW_KEY_TYPES","useArrowKeyNavigation","itemsContainerRef","itemsSelector","keyType","focusedIndex","setFocusedIndex","handleArrowsKeyDown","event","container","items","lastItemIndex","focusFirstItem","focusLastItem","focusNextItem","focusPrevItem","fn","MenuContext","useMenuContext","context","MenuContextProvider","MENU_ITEMS_SELECTOR","Menu","props","_a","closeOnSelect","closeOnBlur","closeOnEsc","children","onOpen","otherProps","__objRest","isOpen","handleOpen","handleClose","isControlled","triggerRef","menuListRef","menuId","menuItems","focusMenuItem","item","itemIndex","menuItem","closeAndFocusTrigger","handleMenuListKeyDown","isMouseDown","contextValue","_props","_ref","_b","_c","_d","activeElement","relatedTarget","targetIsMenu","targetIsTrigger","targetIsSubmenu","isSubmenuTrigger","__spreadProps","__spreadValues","SubmenuContext","useSubmenuContext","SubmenuContextProvider","cx","css","tokens","getMenuHeaderStyles","getMenuFooterStyles","getMenuListStyles","MenuListHeader","testId","className","styles","MenuListFooter","assertChild","child","_MenuList","ref","getMenuListProps","submenuContext","header","footer","appendChild","extendedOtherProps","MenuList","globalGetMenuItemStyles","getMenuItemStyles","isActive","isDisabled","MENU_ITEM_DEFAULT_TAG","_MenuItem","as","isInitiallyFocused","icon","id","itemTestId","getMenuItemProps","itemRef","Element","MenuItem","MenuTrigger","getTriggerProps","getMenuDividerStyles","MenuDivider","Caption","getMenuSectionTitleStyles","MenuSectionTitle","SUBMENU_OFFSET","Submenu","onClose","placement","isAutoalignmentEnabled","isParentMenuOpen","propsToPropagateToSubmenus","mouseLeaveTimerRef","setIsOpen","CaretRightIcon","getSubmenuTriggerStyles","_SubmenuTrigger","getSubmenuTriggerProps","SubmenuTrigger"],"mappings":"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","sourcesContent":["import React, { useCallback, useMemo, useRef, useEffect } from 'react';\nimport { mergeRefs, useId, useControllableState } from '@contentful/f36-core';\nimport { Popover, type PopoverProps } from '@contentful/f36-popover';\n\nimport { useArrowKeyNavigation } from './useArrowKeyNavigation';\nimport { MenuContextProvider, MenuContextType } from './MenuContext';\n\nconst MENU_ITEMS_SELECTOR = '[role=\"menuitem\"]:not(:disabled)';\n\nexport interface MenuProps\n extends Omit<PopoverProps, 'autoFocus' | 'id' | 'closeOnBlur'> {\n /**\n * By default, the Menu is uncontrolled (manage it's expanded state by itself)\n * But you can make it controlled by providing boolean (true/false)\n */\n isOpen?: boolean;\n\n /**\n * If `true`, the Menu will be initially opened.\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 * 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\nexport function Menu(props: MenuProps) {\n const {\n closeOnSelect = true,\n closeOnBlur = true,\n closeOnEsc = true,\n children,\n onOpen,\n ...otherProps\n } = props;\n const { isOpen, handleOpen, handleClose, isControlled } =\n useControllableState({\n isOpen: props.isOpen,\n defaultIsOpen: props.defaultIsOpen,\n onOpen,\n onClose: props.onClose,\n });\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuListRef = useRef<HTMLDivElement>(null);\n\n const menuId = useId(null, 'menu');\n\n const { focusedIndex, handleArrowsKeyDown, setFocusedIndex } =\n useArrowKeyNavigation({\n itemsContainerRef: menuListRef,\n itemsSelector: MENU_ITEMS_SELECTOR,\n });\n\n useEffect(() => {\n if (isOpen && menuListRef.current) {\n const menuItems =\n menuListRef.current.querySelectorAll<HTMLElement>(MENU_ITEMS_SELECTOR);\n\n if (menuItems.length > 0 && focusedIndex < menuItems.length) {\n // timeout trick to prevent scroll from jumping\n // when the popover is not positioned correctly yet in the opening phase\n setTimeout(() => {\n menuItems[focusedIndex].focus({ preventScroll: false });\n }, 0);\n } else {\n setTimeout(() => {\n menuListRef.current?.focus({ preventScroll: false });\n }, 0);\n }\n }\n }, [isOpen, focusedIndex]);\n\n const focusMenuItem = useCallback(\n (item: HTMLElement) => {\n const menuItems =\n menuListRef.current.querySelectorAll(MENU_ITEMS_SELECTOR);\n\n const itemIndex = [...menuItems].findIndex(\n (menuItem) => item === menuItem,\n );\n\n if (itemIndex !== -1) {\n setFocusedIndex(itemIndex);\n }\n },\n [setFocusedIndex],\n );\n\n const closeAndFocusTrigger = useCallback(() => {\n handleClose();\n triggerRef.current?.focus({ preventScroll: true });\n }, [handleClose]);\n\n const handleMenuListKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Tab') {\n event.preventDefault();\n closeAndFocusTrigger();\n return;\n }\n\n // we don't want to propagate other keydown events except `Tab`\n event.stopPropagation();\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n closeAndFocusTrigger();\n return;\n }\n\n handleArrowsKeyDown(event);\n },\n [closeAndFocusTrigger, handleArrowsKeyDown],\n );\n\n // Safari has an issue with the relatedTarget that we use on the onBlur for menuListProps,\n // which was causing the menu to close and reopen when clicking on the trigger.\n // We will use the isMouseDown to prevent triggering blur in the cases where the user clicks on the trigger.\n const isMouseDown = useRef<Boolean>(false);\n\n const contextValue: MenuContextType = useMemo(\n () => ({\n isOpen,\n menuId,\n focusMenuItem,\n getTriggerProps: (_props = {}, _ref = null) => ({\n onMouseDown: (event) => {\n isMouseDown.current = true;\n _props.onMouseDown?.(event);\n },\n onMouseUp: (event) => {\n isMouseDown.current = false;\n _props.onMouseUp?.(event);\n },\n onClick: (event) => {\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\n if (!isFullyControlled) {\n if (isOpen) {\n handleClose();\n } else {\n handleOpen();\n }\n }\n\n _props.onClick?.(event);\n },\n ref: mergeRefs(triggerRef, _ref),\n }),\n getMenuListProps: (_props = {}, _ref = null) => ({\n ref: mergeRefs(menuListRef, _ref),\n onKeyDown: (event) => {\n handleMenuListKeyDown(event);\n _props.onKeyDown?.(event);\n },\n onBlur: (event) => {\n _props.onBlur?.(event);\n\n if (!closeOnBlur) {\n return;\n }\n\n const activeElement = document.activeElement;\n const relatedTarget = event.relatedTarget || activeElement;\n\n const targetIsMenu =\n menuListRef.current === relatedTarget ||\n menuListRef.current?.contains(relatedTarget);\n const targetIsTrigger =\n triggerRef.current === relatedTarget ||\n triggerRef.current?.contains(relatedTarget) ||\n isMouseDown.current;\n const targetIsSubmenu =\n relatedTarget?.parentElement?.dataset.parentMenu === menuId;\n\n if (targetIsMenu || targetIsTrigger || targetIsSubmenu) {\n event.stopPropagation();\n return;\n }\n\n handleClose();\n },\n }),\n getMenuItemProps: (_props = {}) => ({\n onClick: (event) => {\n _props.onClick?.(event);\n\n const isSubmenuTrigger = Boolean(\n (event.target as HTMLElement).getAttribute('aria-haspopup'),\n );\n if (closeOnSelect && !isSubmenuTrigger) {\n closeAndFocusTrigger();\n }\n },\n }),\n propsToPropagateToSubmenus: {\n closeOnSelect,\n closeOnBlur,\n closeOnEsc,\n },\n }),\n [\n menuId,\n isOpen,\n handleMenuListKeyDown,\n closeOnSelect,\n handleClose,\n handleOpen,\n focusMenuItem,\n closeOnBlur,\n closeOnEsc,\n closeAndFocusTrigger,\n isControlled,\n onOpen,\n ],\n );\n\n return (\n <MenuContextProvider value={contextValue}>\n <Popover\n {...otherProps}\n isOpen={isOpen}\n onClose={handleClose}\n id={menuId}\n closeOnEsc={closeOnEsc}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={false}\n closeOnBlur={false}\n >\n {children}\n </Popover>\n </MenuContextProvider>\n );\n}\n","import { useState, useCallback } from 'react';\n\ninterface UseArrowKeyNavigationProps {\n itemsContainerRef: React.MutableRefObject<HTMLElement>;\n itemsSelector: string;\n keyType?: 'vertical' | 'horizontal';\n initialFocusedIndex?: number;\n}\n\nconst ARROW_KEY_TYPES = {\n vertical: {\n prev: 'ArrowUp',\n next: 'ArrowDown',\n },\n horizontal: {\n prev: 'ArrowLeft',\n next: 'ArrowRight',\n },\n};\n\nexport const useArrowKeyNavigation = ({\n itemsContainerRef,\n itemsSelector,\n keyType = 'vertical',\n}: UseArrowKeyNavigationProps) => {\n const [focusedIndex, setFocusedIndex] = useState<number>(0);\n\n const handleArrowsKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n const container = itemsContainerRef.current;\n if (!container) return;\n\n const items = container.querySelectorAll(itemsSelector);\n if (items.length === 0) return;\n\n const lastItemIndex = items.length - 1;\n\n const focusFirstItem = () => setFocusedIndex(0);\n const focusLastItem = () => setFocusedIndex(lastItemIndex);\n const focusNextItem = () => {\n if (focusedIndex === lastItemIndex) {\n focusFirstItem();\n } else {\n setFocusedIndex(focusedIndex + 1);\n }\n };\n const focusPrevItem = () => {\n if (focusedIndex === 0) {\n focusLastItem();\n } else {\n setFocusedIndex(focusedIndex - 1);\n }\n };\n\n const keyToFnMap = {\n [ARROW_KEY_TYPES[keyType].next]: focusNextItem,\n [ARROW_KEY_TYPES[keyType].prev]: focusPrevItem,\n };\n\n const fn = keyToFnMap[event.key];\n if (fn) {\n event.preventDefault();\n fn();\n }\n },\n [focusedIndex, itemsSelector, itemsContainerRef, keyType],\n );\n\n return { focusedIndex, handleArrowsKeyDown, setFocusedIndex };\n};\n","import React, { ComponentPropsWithRef } from 'react';\nimport { MenuProps } from '.';\n\nexport type MenuContextType = {\n isOpen: boolean;\n menuId: string;\n focusMenuItem: (item: HTMLElement) => void;\n getTriggerProps: (\n _props: ComponentPropsWithRef<'button'>,\n _ref: React.Ref<HTMLButtonElement>,\n ) => ComponentPropsWithRef<'button'>;\n getMenuListProps: (\n _props: ComponentPropsWithRef<'div'>,\n _ref: React.Ref<HTMLDivElement>,\n ) => ComponentPropsWithRef<'div'>;\n getMenuItemProps: (\n _props: ComponentPropsWithRef<'button'>,\n ) => ComponentPropsWithRef<'button'>;\n propsToPropagateToSubmenus: Pick<\n MenuProps,\n 'closeOnBlur' | 'closeOnEsc' | 'closeOnSelect'\n >;\n};\n\nconst MenuContext = React.createContext<MenuContextType | undefined>(undefined);\n\nexport const useMenuContext = () => {\n const context = React.useContext(MenuContext);\n\n if (context === undefined) {\n throw new Error('useMenuContext must be used within a MenuContextProvider');\n }\n\n return context;\n};\n\nexport const MenuContextProvider = MenuContext.Provider;\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { useMenuContext } from '../MenuContext';\nimport { useSubmenuContext } from '../SubmenuContext';\nimport { Popover } from '@contentful/f36-popover';\nimport { cx } from 'emotion';\nimport { getMenuListStyles } from './MenuList.styles';\nimport { MenuListHeader } from './MenuListHeader';\nimport { MenuListFooter } from './MenuListFooter';\n\ninterface MenuListInternalProps extends CommonProps {\n children?: React.ReactNode;\n}\n\nfunction assertChild(child: any): child is { type: { displayName: string } } {\n return Boolean(child?.type?.displayName);\n}\n\nexport type MenuListProps = PropsWithHTMLElement<MenuListInternalProps, 'div'>;\n\nconst _MenuList = (\n props: ExpandProps<MenuListProps>,\n ref: React.Ref<HTMLDivElement>,\n) => {\n const {\n children,\n testId = 'cf-ui-menu-list',\n className,\n ...otherProps\n } = props;\n\n const { getMenuListProps } = useMenuContext();\n const submenuContext = useSubmenuContext();\n\n let header: React.ReactElement | null = null;\n let footer: React.ReactElement | null = null;\n const items: React.ReactElement[] = [];\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 });\n\n const extendedOtherProps = submenuContext\n ? submenuContext.getSubmenuListProps(otherProps)\n : otherProps;\n\n return (\n <Popover.Content\n role=\"menu\"\n {...extendedOtherProps}\n {...getMenuListProps(extendedOtherProps, ref)}\n className={cx(styles.container, className)}\n testId={testId}\n >\n {header}\n {items}\n {footer}\n </Popover.Content>\n );\n};\n\nexport const MenuList = React.forwardRef(_MenuList);\n","import React, { ComponentPropsWithRef, ComponentPropsWithoutRef } from 'react';\n\nexport type SubmenuContextType = {\n isOpen: boolean;\n getSubmenuListProps: (\n _props: ComponentPropsWithRef<'div'>,\n ) => { 'data-parent-menu': string } & ComponentPropsWithoutRef<'div'>;\n getSubmenuTriggerProps: (\n _props: ComponentPropsWithRef<'button'>,\n _ref: React.Ref<HTMLButtonElement>,\n ) => ComponentPropsWithRef<'button'>;\n};\n\nconst SubmenuContext = React.createContext<SubmenuContextType | undefined>(\n undefined,\n);\n\nexport const useSubmenuContext = () => {\n const context = React.useContext(SubmenuContext);\n return context;\n};\n\nexport const SubmenuContextProvider = SubmenuContext.Provider;\n","import { css } from 'emotion';\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}) => ({\n container: css({\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: 'relative',\n padding: 0,\n paddingTop: props.hasStickyHeader ? 0 : tokens.spacing2Xs,\n paddingBottom: props.hasStickyFooter ? 0 : tokens.spacing2Xs,\n }),\n});\n","import React from 'react';\nimport { cx } from 'emotion';\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';\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, { useEffect, useRef } from 'react';\nimport { cx } from 'emotion';\nimport {\n mergeRefs,\n useId,\n type CommonProps,\n type PolymorphicComponent,\n type PolymorphicProps,\n type ExpandProps,\n} from '@contentful/f36-core';\n\nimport { useMenuContext } from '../MenuContext';\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 _MenuItem<E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG>(\n props: MenuItemProps<E>,\n ref: React.Ref<any>,\n) {\n const {\n testId,\n className,\n as,\n isActive = false,\n isDisabled,\n isInitiallyFocused,\n icon,\n ...otherProps\n } = props;\n\n const id = useId(undefined, 'menu-item');\n const itemTestId = testId || `cf-ui-${id}`;\n const styles = getMenuItemStyles({ isActive, isDisabled });\n\n const { getMenuItemProps, focusMenuItem } = useMenuContext();\n\n const itemRef = useRef<HTMLElement>(null);\n useEffect(() => {\n if (isInitiallyFocused && itemRef.current) {\n focusMenuItem(itemRef.current);\n }\n }, [isInitiallyFocused, focusMenuItem]);\n\n const Element = (as ?? MENU_ITEM_DEFAULT_TAG) as React.ElementType;\n\n return (\n <Element\n role=\"menuitem\"\n {...otherProps}\n {...getMenuItemProps(otherProps)}\n disabled={isDisabled ?? props.disabled}\n className={cx(styles, className)}\n data-test-id={itemTestId}\n ref={mergeRefs(itemRef, ref)}\n tabIndex={-1}\n >\n {icon}\n {props.children}\n </Element>\n );\n}\n\n_MenuItem.displayName = 'MenuItem';\n\nexport const MenuItem: PolymorphicComponent<\n ExpandProps<MenuItemInternalProps>,\n typeof MENU_ITEM_DEFAULT_TAG\n> = React.forwardRef(_MenuItem);\n","import { css, cx } from 'emotion';\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 { Popover } from '@contentful/f36-popover';\nimport { useMenuContext } from '../MenuContext';\nimport type { ExpandProps } from '@contentful/f36-core';\n\nexport interface MenuTriggerProps {\n children: React.ReactNode;\n}\n\nexport const MenuTrigger = (props: ExpandProps<MenuTriggerProps>) => {\n const child = React.Children.only(props.children) as any;\n const { getTriggerProps } = useMenuContext();\n\n return (\n <Popover.Trigger>\n {React.cloneElement(child, {\n ...getTriggerProps(child.props, child.ref),\n ['aria-haspopup']: 'menu',\n })}\n </Popover.Trigger>\n );\n};\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { cx } from 'emotion';\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","import { css } from 'emotion';\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 { cx } from 'emotion';\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 { css } from 'emotion';\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, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Menu, type MenuProps } from '../Menu';\nimport { useMenuContext } from '../MenuContext';\nimport {\n SubmenuContextProvider,\n type SubmenuContextType,\n} from '../SubmenuContext';\nimport { mergeRefs } from '@contentful/f36-core';\n\nconst SUBMENU_OFFSET: [number, number] = [-8, 2];\n\nexport type SubmenuProps = Omit<\n MenuProps,\n 'offset' | 'usePortal' | 'isOpen' | 'defaultIsOpen'\n>;\n\nexport const Submenu = (props: SubmenuProps) => {\n const {\n onClose,\n onOpen,\n placement = 'right-start',\n isAutoalignmentEnabled = false,\n ...otherProps\n } = props;\n\n const {\n isOpen: isParentMenuOpen,\n menuId,\n propsToPropagateToSubmenus,\n } = useMenuContext();\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const mouseLeaveTimerRef = useRef(null);\n\n const [isOpen, setIsOpen] = useState(false);\n const handleOpen = useCallback(() => {\n setIsOpen(true);\n window.clearTimeout(mouseLeaveTimerRef.current);\n\n onOpen?.();\n }, [onOpen]);\n const handleClose = useCallback(() => {\n setIsOpen(false);\n window.clearTimeout(mouseLeaveTimerRef.current);\n\n onClose?.();\n }, [onClose]);\n const closeAndFocusTrigger = useCallback(() => {\n handleClose();\n triggerRef.current?.focus({ preventScroll: true });\n }, [handleClose]);\n\n useEffect(() => {\n // close when parent menu closed\n if (isParentMenuOpen === false) {\n setIsOpen(false);\n }\n }, [isParentMenuOpen]);\n\n const contextValue: SubmenuContextType = useMemo(\n () => ({\n isOpen,\n getSubmenuListProps: (_props) => ({\n 'data-parent-menu': menuId,\n onMouseOver: (event) => {\n handleOpen();\n\n _props.onMouseOver?.(event);\n },\n onMouseLeave: (event) => {\n closeAndFocusTrigger();\n\n _props.onMouseLeave?.(event);\n },\n }),\n getSubmenuTriggerProps: (_props, _ref) => ({\n ref: mergeRefs(triggerRef, _ref),\n onKeyDown: (event) => {\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n handleOpen();\n }\n\n _props.onKeyDown?.(event);\n },\n onMouseOver: (event) => {\n handleOpen();\n\n _props.onMouseOver?.(event);\n },\n onMouseLeave: (event) => {\n mouseLeaveTimerRef.current = window.setTimeout(\n closeAndFocusTrigger,\n 300,\n );\n\n _props.onMouseLeave?.(event);\n },\n }),\n }),\n [isOpen, menuId, handleOpen, closeAndFocusTrigger],\n );\n\n return (\n <SubmenuContextProvider value={contextValue}>\n <Menu\n {...propsToPropagateToSubmenus}\n {...otherProps}\n isOpen={isOpen}\n onClose={handleClose}\n onOpen={handleOpen}\n placement={placement}\n isAutoalignmentEnabled={isAutoalignmentEnabled}\n offset={SUBMENU_OFFSET}\n />\n </SubmenuContextProvider>\n );\n};\n","import React from 'react';\nimport { MenuTrigger } from '../MenuTrigger/MenuTrigger';\nimport { MenuItem, MenuItemProps } from '../MenuItem/MenuItem';\nimport { useSubmenuContext } from '../SubmenuContext';\nimport { CaretRightIcon } from '@contentful/f36-icons';\nimport type { ExpandProps } from '@contentful/f36-core';\nimport { cx } from 'emotion';\nimport { getSubmenuTriggerStyles } from './SubmenuTrigger.styles';\n\nexport type SubmenuTriggerProps = Omit<\n MenuItemProps<'button'>,\n 'isInitiallyFocused' | 'as'\n>;\n\nconst _SubmenuTrigger = (\n props: ExpandProps<SubmenuTriggerProps>,\n ref: React.Ref<HTMLButtonElement>,\n) => {\n const { className, children } = props;\n const { getSubmenuTriggerProps, isOpen } = useSubmenuContext();\n\n const styles = getSubmenuTriggerStyles();\n\n return (\n <MenuTrigger>\n <MenuItem\n {...props}\n {...getSubmenuTriggerProps(props, 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(_SubmenuTrigger);\n","import { css } from 'emotion';\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 { 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","closeOnEsc","closeOnBlur","closeOnSelect","autoFocus","elementsRef","labelsRef","tree","useFloatingTree","nodeId","useFloatingNodeId","parentId","useFloatingParentNodeId","item","useListItem","parent","isNested","isControlled","uncontrolledIsOpen","setUncontrolledIsOpen","isOpen","prevOpenRef","handleOpenChange","nextOpen","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","w","_a","ref","_b","children","otherProps","__objRest","menuContext","__spreadValues","FloatingNode","Menu","props","resolvedPlacement","content","__spreadProps","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","getMenuItemStyles","isDisabled","globalGetMenuItemStyles","MENU_ITEM_DEFAULT_TAG","MenuItemBase","as","isInitiallyFocused","icon","propDisabled","menuItem","id","useId","itemTestId","Element","MenuItem","MenuTrigger","childRef","parentActiveIndex","triggerProps","getMenuDividerStyles","MenuDivider","getMenuSectionTitleStyles","MenuSectionTitle","Caption","Submenu","getSubmenuTriggerStyles","SubmenuTriggerBase","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 } 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;\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 (nextOpen: boolean) => {\n const wasOpen = prevOpenRef.current;\n\n if (nextOpen === wasOpen) {\n return;\n }\n if (!isControlled) {\n setUncontrolledIsOpen(nextOpen);\n }\n if (nextOpen && !wasOpen) {\n onOpen?.();\n } else if (!nextOpen && wasOpen) {\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 ancestorScroll: true,\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 { FloatingNode } from '@floating-ui/react';\nimport * as React from 'react';\n\nimport { useMenu } from './useMenu';\nimport { MenuContextProvider } from './MenuContext';\nimport type { MenuProps } from './Menu';\n\nexport const MenuComponent = React.forwardRef<\n HTMLDivElement,\n React.PropsWithChildren<MenuProps>\n>(function MenuComponentInner({ children, ...otherProps }, ref) {\n const menuContext = useMenu({ ...otherProps });\n return (\n <MenuContextProvider value={menuContext}>\n <FloatingNode id={menuContext.nodeId}>\n <div ref={ref}>{children}</div>\n </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';\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 = React.forwardRef<\n HTMLDivElement,\n React.PropsWithChildren<MenuProps>\n>(function Menu(props, ref) {\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} ref={ref}>\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<E extends HTMLElement = HTMLElement> {\n children: React.ReactElement<\n Record<string, unknown> & {\n ref?: React.Ref<E>;\n },\n React.ElementType\n >;\n}\n\nexport const MenuTrigger = React.forwardRef<\n HTMLElement,\n MenuTriggerProps & { onFocus?: React.FocusEventHandler<HTMLElement> }\n>(function MenuTrigger({ children, ...otherProps }, 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 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 ? undefined : parentActiveIndex === item.index ? 0 : -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 ...otherProps,\n onFocus(event: React.FocusEvent<HTMLElement>) {\n (\n otherProps as { onFocus?: React.FocusEventHandler<HTMLElement> }\n ).onFocus?.(event);\n setHasFocusInside(false);\n if (parent) parent.setHasFocusInside(true);\n },\n }),\n ),\n };\n\n return React.cloneElement(children, triggerProps);\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
@@ -1,16 +1,18 @@
1
- import { PopoverProps } from '@contentful/f36-popover';
2
1
  import React from 'react';
3
- import { PropsWithHTMLElement, CommonProps, ExpandProps, PolymorphicProps, PolymorphicComponent } from '@contentful/f36-core';
2
+ import { Placement, OffsetOptions } from '@floating-ui/react';
3
+ import { CommonProps, PropsWithHTMLElement, ExpandProps, PolymorphicComponent, PolymorphicProps } from '@contentful/f36-core';
4
4
  import { CaptionProps } from '@contentful/f36-typography';
5
5
 
6
- interface MenuProps extends Omit<PopoverProps, 'autoFocus' | 'id' | 'closeOnBlur'> {
6
+ type BaseMenuProps = {
7
7
  /**
8
- * By default, the Menu is uncontrolled (manage it's expanded state by itself)
9
- * But you can make it controlled by providing boolean (true/false)
8
+ * Boolean to determine if the Popover should be the same width as
9
+ * the trigger element
10
+ *
11
+ * @default false
10
12
  */
11
- isOpen?: boolean;
13
+ isFullWidth?: boolean;
12
14
  /**
13
- * If `true`, the Menu will be initially opened.
15
+ * If `true`, the Menu will be initially opened. This property has no influence on the uncontrolled status of the Menu
14
16
  */
15
17
  defaultIsOpen?: boolean;
16
18
  /**
@@ -21,6 +23,40 @@ interface MenuProps extends Omit<PopoverProps, 'autoFocus' | 'id' | 'closeOnBlur
21
23
  * Callback fired when the Menu closes
22
24
  */
23
25
  onClose?: () => void;
26
+ /**
27
+ * Determines the preferred position of where the MenuList opens. This position is not
28
+ * guaranteed, as the MenuList might be moved to fit the viewport.
29
+ *
30
+ * @default bottom-start OR right-start
31
+ */
32
+ placement?: Placement | 'auto';
33
+ /**
34
+ * Boolean to control if popover is allowed to change its placement automatically
35
+ * based on available space in the viewport.
36
+ *
37
+ * For example:
38
+ * If you set placement prop to bottom, but there isn't enough space to position the popover in that direction,
39
+ * it will change the popper placement to top. As soon as enough space is detected, the placement will be reverted to the defined one.
40
+ *
41
+ * If you want the popover to strictly follow the placement prop you should set this prop to false.
42
+ *
43
+ * @default true
44
+ */
45
+ isAutoalignmentEnabled?: boolean;
46
+ /**
47
+ * Single number as short hand for `mainAxis`
48
+ * Or object which can contain `mainAxis`, `crossAxis` or `alignmentAxis`
49
+ *
50
+ * @default 0
51
+ */
52
+ offset?: OffsetOptions;
53
+ /**
54
+ * Defines if the menu list content should be rendered in the DOM only when it's open
55
+ * or all the time (after the component has been mounted)
56
+ *
57
+ * @default true
58
+ */
59
+ renderOnlyWhenOpen?: boolean;
24
60
  /**
25
61
  * If `true`, the Menu will close when a menu item is
26
62
  * clicked
@@ -49,19 +85,54 @@ interface MenuProps extends Omit<PopoverProps, 'autoFocus' | 'id' | 'closeOnBlur
49
85
  * @default true
50
86
  */
51
87
  closeOnEsc?: boolean;
88
+ /**
89
+ * Boolean to control whether or not to render the Menu in a React Portal.
90
+ * Rendering content inside a Portal allows the Menu to escape the bounds
91
+ * of its parent while still being positioned correctly. Using a Portal is
92
+ * necessary if an ancestor of the Menu hides overflow.
93
+ *
94
+ * @default true
95
+ */
96
+ usePortal?: boolean;
97
+ /**
98
+ * If true, the Menu will be focused after opening
99
+ *
100
+ * @default true
101
+ */
102
+ autoFocus?: boolean;
103
+ /**
104
+ * Menu compound children (Trigger, List, Item, etc.)
105
+ */
106
+ children?: React.ReactNode;
107
+ };
108
+ interface UncontrolledMenuProps extends BaseMenuProps {
109
+ isOpen?: undefined;
52
110
  }
53
- declare function Menu$1(props: MenuProps): JSX.Element;
111
+ type ControlledProps = BaseMenuProps & {
112
+ isOpen: boolean;
113
+ onOpen?: () => void;
114
+ onClose?: () => void;
115
+ } & ({
116
+ onOpen: () => void;
117
+ } | {
118
+ onClose: () => void;
119
+ } | {
120
+ onOpen: () => void;
121
+ onClose: () => void;
122
+ });
123
+ type MenuProps = UncontrolledMenuProps | ControlledProps;
124
+ declare const Menu$1: React.ForwardRefExoticComponent<React.PropsWithChildren<MenuProps> & React.RefAttributes<HTMLDivElement>>;
54
125
 
55
126
  interface MenuListInternalProps extends CommonProps {
56
127
  children?: React.ReactNode;
57
128
  }
58
- declare type MenuListProps = PropsWithHTMLElement<MenuListInternalProps, 'div'>;
59
- declare const MenuList: React.ForwardRefExoticComponent<Omit<Omit<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>>, never>, keyof MenuListInternalProps> & MenuListInternalProps & React.RefAttributes<HTMLDivElement>>;
129
+ type MenuListProps = PropsWithHTMLElement<MenuListInternalProps, 'div'>;
130
+ declare const MenuList: React.ForwardRefExoticComponent<Omit<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, never>, keyof MenuListInternalProps> & MenuListInternalProps & React.RefAttributes<unknown>>;
60
131
 
61
- declare type MenuListHeaderProps = PropsWithHTMLElement<CommonProps, 'div'>;
132
+ type MenuListHeaderProps = PropsWithHTMLElement<CommonProps, 'div'>;
62
133
  declare const MenuListHeader: React.FC<ExpandProps<MenuListHeaderProps>>;
63
134
 
64
- declare type MenuListFooterProps = PropsWithHTMLElement<CommonProps, 'div'>;
135
+ type MenuListFooterProps = PropsWithHTMLElement<CommonProps, 'div'>;
65
136
  declare const MenuListFooter: React.FC<ExpandProps<MenuListFooterProps>>;
66
137
 
67
138
  declare const MENU_ITEM_DEFAULT_TAG = "button";
@@ -85,27 +156,47 @@ interface MenuItemInternalProps extends CommonProps {
85
156
  */
86
157
  icon?: React.ReactElement;
87
158
  }
88
- declare type MenuItemProps<E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG> = PolymorphicProps<MenuItemInternalProps, E>;
159
+ type MenuItemProps<E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG> = PolymorphicProps<MenuItemInternalProps, E>;
89
160
  declare const MenuItem: PolymorphicComponent<ExpandProps<MenuItemInternalProps>, typeof MENU_ITEM_DEFAULT_TAG>;
90
161
 
91
- interface MenuTriggerProps {
92
- children: React.ReactNode;
162
+ interface MenuTriggerProps<E extends HTMLElement = HTMLElement> {
163
+ children: React.ReactElement<Record<string, unknown> & {
164
+ ref?: React.Ref<E>;
165
+ }, React.ElementType>;
93
166
  }
94
- declare const MenuTrigger: (props: ExpandProps<MenuTriggerProps>) => JSX.Element;
167
+ declare const MenuTrigger: React.ForwardRefExoticComponent<MenuTriggerProps<HTMLElement> & {
168
+ onFocus?: React.FocusEventHandler<HTMLElement>;
169
+ } & React.RefAttributes<HTMLElement>>;
95
170
 
96
- declare type MenuDividerProps = PropsWithHTMLElement<CommonProps, 'hr'>;
97
- declare const MenuDivider: (props: ExpandProps<MenuDividerProps>) => JSX.Element;
171
+ type MenuDividerProps = PropsWithHTMLElement<CommonProps, 'hr'>;
172
+ declare const MenuDivider: {
173
+ (props: ExpandProps<MenuDividerProps>): React.JSX.Element;
174
+ displayName: string;
175
+ };
98
176
 
99
- declare type MenuSectionTitleProps = CaptionProps;
100
- declare const MenuSectionTitle: (props: ExpandProps<MenuSectionTitleProps>) => JSX.Element;
177
+ type MenuSectionTitleProps = CaptionProps;
178
+ declare const MenuSectionTitle: (props: ExpandProps<MenuSectionTitleProps>) => React.JSX.Element;
101
179
 
102
- declare type SubmenuProps = Omit<MenuProps, 'offset' | 'usePortal' | 'isOpen' | 'defaultIsOpen'>;
103
- declare const Submenu: (props: SubmenuProps) => JSX.Element;
180
+ /**
181
+ * @deprecated Submenu is deprecated. Use Menu component instead.
182
+ * This component will be removed in a future version.
183
+ *
184
+ * Migration guide:
185
+ * Replace `<Submenu>` with `<Menu>` - the API is identical.
186
+ */
187
+ declare const Submenu: {
188
+ (props: MenuProps): React.JSX.Element;
189
+ displayName: string;
190
+ };
191
+ /**
192
+ * @deprecated Use MenuProps instead.
193
+ */
194
+ type SubmenuProps = MenuProps;
104
195
 
105
- declare type SubmenuTriggerProps = Omit<MenuItemProps<'button'>, 'isInitiallyFocused' | 'as'>;
196
+ type SubmenuTriggerProps = Omit<MenuItemProps<'button'>, 'isInitiallyFocused' | 'as'>;
106
197
  declare const SubmenuTrigger: React.ForwardRefExoticComponent<SubmenuTriggerProps & React.RefAttributes<HTMLButtonElement>>;
107
198
 
108
- declare type CompoundMenu = typeof Menu$1 & {
199
+ type CompoundMenu = typeof Menu$1 & {
109
200
  List: typeof MenuList;
110
201
  ListHeader: typeof MenuListHeader;
111
202
  ListFooter: typeof MenuListFooter;
@@ -118,4 +209,4 @@ declare type CompoundMenu = typeof Menu$1 & {
118
209
  };
119
210
  declare const Menu: CompoundMenu;
120
211
 
121
- export { Menu, MenuDivider, MenuDividerProps, MenuItem, MenuItemProps, MenuList, MenuListProps, MenuProps, MenuSectionTitle, MenuSectionTitleProps, MenuTrigger, MenuTriggerProps, Submenu, SubmenuProps, SubmenuTrigger, SubmenuTriggerProps };
212
+ export { Menu, MenuDivider, type MenuDividerProps, MenuItem, type MenuItemProps, MenuList, type MenuListProps, type MenuProps, MenuSectionTitle, type MenuSectionTitleProps, MenuTrigger, type MenuTriggerProps, Submenu, type SubmenuProps, SubmenuTrigger, type SubmenuTriggerProps };
package/dist/index.d.ts CHANGED
@@ -1,16 +1,18 @@
1
- import { PopoverProps } from '@contentful/f36-popover';
2
1
  import React from 'react';
3
- import { PropsWithHTMLElement, CommonProps, ExpandProps, PolymorphicProps, PolymorphicComponent } from '@contentful/f36-core';
2
+ import { Placement, OffsetOptions } from '@floating-ui/react';
3
+ import { CommonProps, PropsWithHTMLElement, ExpandProps, PolymorphicComponent, PolymorphicProps } from '@contentful/f36-core';
4
4
  import { CaptionProps } from '@contentful/f36-typography';
5
5
 
6
- interface MenuProps extends Omit<PopoverProps, 'autoFocus' | 'id' | 'closeOnBlur'> {
6
+ type BaseMenuProps = {
7
7
  /**
8
- * By default, the Menu is uncontrolled (manage it's expanded state by itself)
9
- * But you can make it controlled by providing boolean (true/false)
8
+ * Boolean to determine if the Popover should be the same width as
9
+ * the trigger element
10
+ *
11
+ * @default false
10
12
  */
11
- isOpen?: boolean;
13
+ isFullWidth?: boolean;
12
14
  /**
13
- * If `true`, the Menu will be initially opened.
15
+ * If `true`, the Menu will be initially opened. This property has no influence on the uncontrolled status of the Menu
14
16
  */
15
17
  defaultIsOpen?: boolean;
16
18
  /**
@@ -21,6 +23,40 @@ interface MenuProps extends Omit<PopoverProps, 'autoFocus' | 'id' | 'closeOnBlur
21
23
  * Callback fired when the Menu closes
22
24
  */
23
25
  onClose?: () => void;
26
+ /**
27
+ * Determines the preferred position of where the MenuList opens. This position is not
28
+ * guaranteed, as the MenuList might be moved to fit the viewport.
29
+ *
30
+ * @default bottom-start OR right-start
31
+ */
32
+ placement?: Placement | 'auto';
33
+ /**
34
+ * Boolean to control if popover is allowed to change its placement automatically
35
+ * based on available space in the viewport.
36
+ *
37
+ * For example:
38
+ * If you set placement prop to bottom, but there isn't enough space to position the popover in that direction,
39
+ * it will change the popper placement to top. As soon as enough space is detected, the placement will be reverted to the defined one.
40
+ *
41
+ * If you want the popover to strictly follow the placement prop you should set this prop to false.
42
+ *
43
+ * @default true
44
+ */
45
+ isAutoalignmentEnabled?: boolean;
46
+ /**
47
+ * Single number as short hand for `mainAxis`
48
+ * Or object which can contain `mainAxis`, `crossAxis` or `alignmentAxis`
49
+ *
50
+ * @default 0
51
+ */
52
+ offset?: OffsetOptions;
53
+ /**
54
+ * Defines if the menu list content should be rendered in the DOM only when it's open
55
+ * or all the time (after the component has been mounted)
56
+ *
57
+ * @default true
58
+ */
59
+ renderOnlyWhenOpen?: boolean;
24
60
  /**
25
61
  * If `true`, the Menu will close when a menu item is
26
62
  * clicked
@@ -49,19 +85,54 @@ interface MenuProps extends Omit<PopoverProps, 'autoFocus' | 'id' | 'closeOnBlur
49
85
  * @default true
50
86
  */
51
87
  closeOnEsc?: boolean;
88
+ /**
89
+ * Boolean to control whether or not to render the Menu in a React Portal.
90
+ * Rendering content inside a Portal allows the Menu to escape the bounds
91
+ * of its parent while still being positioned correctly. Using a Portal is
92
+ * necessary if an ancestor of the Menu hides overflow.
93
+ *
94
+ * @default true
95
+ */
96
+ usePortal?: boolean;
97
+ /**
98
+ * If true, the Menu will be focused after opening
99
+ *
100
+ * @default true
101
+ */
102
+ autoFocus?: boolean;
103
+ /**
104
+ * Menu compound children (Trigger, List, Item, etc.)
105
+ */
106
+ children?: React.ReactNode;
107
+ };
108
+ interface UncontrolledMenuProps extends BaseMenuProps {
109
+ isOpen?: undefined;
52
110
  }
53
- declare function Menu$1(props: MenuProps): JSX.Element;
111
+ type ControlledProps = BaseMenuProps & {
112
+ isOpen: boolean;
113
+ onOpen?: () => void;
114
+ onClose?: () => void;
115
+ } & ({
116
+ onOpen: () => void;
117
+ } | {
118
+ onClose: () => void;
119
+ } | {
120
+ onOpen: () => void;
121
+ onClose: () => void;
122
+ });
123
+ type MenuProps = UncontrolledMenuProps | ControlledProps;
124
+ declare const Menu$1: React.ForwardRefExoticComponent<React.PropsWithChildren<MenuProps> & React.RefAttributes<HTMLDivElement>>;
54
125
 
55
126
  interface MenuListInternalProps extends CommonProps {
56
127
  children?: React.ReactNode;
57
128
  }
58
- declare type MenuListProps = PropsWithHTMLElement<MenuListInternalProps, 'div'>;
59
- declare const MenuList: React.ForwardRefExoticComponent<Omit<Omit<Pick<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "key" | keyof React.HTMLAttributes<HTMLDivElement>>, never>, keyof MenuListInternalProps> & MenuListInternalProps & React.RefAttributes<HTMLDivElement>>;
129
+ type MenuListProps = PropsWithHTMLElement<MenuListInternalProps, 'div'>;
130
+ declare const MenuList: React.ForwardRefExoticComponent<Omit<Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, never>, keyof MenuListInternalProps> & MenuListInternalProps & React.RefAttributes<unknown>>;
60
131
 
61
- declare type MenuListHeaderProps = PropsWithHTMLElement<CommonProps, 'div'>;
132
+ type MenuListHeaderProps = PropsWithHTMLElement<CommonProps, 'div'>;
62
133
  declare const MenuListHeader: React.FC<ExpandProps<MenuListHeaderProps>>;
63
134
 
64
- declare type MenuListFooterProps = PropsWithHTMLElement<CommonProps, 'div'>;
135
+ type MenuListFooterProps = PropsWithHTMLElement<CommonProps, 'div'>;
65
136
  declare const MenuListFooter: React.FC<ExpandProps<MenuListFooterProps>>;
66
137
 
67
138
  declare const MENU_ITEM_DEFAULT_TAG = "button";
@@ -85,27 +156,47 @@ interface MenuItemInternalProps extends CommonProps {
85
156
  */
86
157
  icon?: React.ReactElement;
87
158
  }
88
- declare type MenuItemProps<E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG> = PolymorphicProps<MenuItemInternalProps, E>;
159
+ type MenuItemProps<E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG> = PolymorphicProps<MenuItemInternalProps, E>;
89
160
  declare const MenuItem: PolymorphicComponent<ExpandProps<MenuItemInternalProps>, typeof MENU_ITEM_DEFAULT_TAG>;
90
161
 
91
- interface MenuTriggerProps {
92
- children: React.ReactNode;
162
+ interface MenuTriggerProps<E extends HTMLElement = HTMLElement> {
163
+ children: React.ReactElement<Record<string, unknown> & {
164
+ ref?: React.Ref<E>;
165
+ }, React.ElementType>;
93
166
  }
94
- declare const MenuTrigger: (props: ExpandProps<MenuTriggerProps>) => JSX.Element;
167
+ declare const MenuTrigger: React.ForwardRefExoticComponent<MenuTriggerProps<HTMLElement> & {
168
+ onFocus?: React.FocusEventHandler<HTMLElement>;
169
+ } & React.RefAttributes<HTMLElement>>;
95
170
 
96
- declare type MenuDividerProps = PropsWithHTMLElement<CommonProps, 'hr'>;
97
- declare const MenuDivider: (props: ExpandProps<MenuDividerProps>) => JSX.Element;
171
+ type MenuDividerProps = PropsWithHTMLElement<CommonProps, 'hr'>;
172
+ declare const MenuDivider: {
173
+ (props: ExpandProps<MenuDividerProps>): React.JSX.Element;
174
+ displayName: string;
175
+ };
98
176
 
99
- declare type MenuSectionTitleProps = CaptionProps;
100
- declare const MenuSectionTitle: (props: ExpandProps<MenuSectionTitleProps>) => JSX.Element;
177
+ type MenuSectionTitleProps = CaptionProps;
178
+ declare const MenuSectionTitle: (props: ExpandProps<MenuSectionTitleProps>) => React.JSX.Element;
101
179
 
102
- declare type SubmenuProps = Omit<MenuProps, 'offset' | 'usePortal' | 'isOpen' | 'defaultIsOpen'>;
103
- declare const Submenu: (props: SubmenuProps) => JSX.Element;
180
+ /**
181
+ * @deprecated Submenu is deprecated. Use Menu component instead.
182
+ * This component will be removed in a future version.
183
+ *
184
+ * Migration guide:
185
+ * Replace `<Submenu>` with `<Menu>` - the API is identical.
186
+ */
187
+ declare const Submenu: {
188
+ (props: MenuProps): React.JSX.Element;
189
+ displayName: string;
190
+ };
191
+ /**
192
+ * @deprecated Use MenuProps instead.
193
+ */
194
+ type SubmenuProps = MenuProps;
104
195
 
105
- declare type SubmenuTriggerProps = Omit<MenuItemProps<'button'>, 'isInitiallyFocused' | 'as'>;
196
+ type SubmenuTriggerProps = Omit<MenuItemProps<'button'>, 'isInitiallyFocused' | 'as'>;
106
197
  declare const SubmenuTrigger: React.ForwardRefExoticComponent<SubmenuTriggerProps & React.RefAttributes<HTMLButtonElement>>;
107
198
 
108
- declare type CompoundMenu = typeof Menu$1 & {
199
+ type CompoundMenu = typeof Menu$1 & {
109
200
  List: typeof MenuList;
110
201
  ListHeader: typeof MenuListHeader;
111
202
  ListFooter: typeof MenuListFooter;
@@ -118,4 +209,4 @@ declare type CompoundMenu = typeof Menu$1 & {
118
209
  };
119
210
  declare const Menu: CompoundMenu;
120
211
 
121
- export { Menu, MenuDivider, MenuDividerProps, MenuItem, MenuItemProps, MenuList, MenuListProps, MenuProps, MenuSectionTitle, MenuSectionTitleProps, MenuTrigger, MenuTriggerProps, Submenu, SubmenuProps, SubmenuTrigger, SubmenuTriggerProps };
212
+ export { Menu, MenuDivider, type MenuDividerProps, MenuItem, type MenuItemProps, MenuList, type MenuListProps, type MenuProps, MenuSectionTitle, type MenuSectionTitleProps, MenuTrigger, type MenuTriggerProps, Submenu, type SubmenuProps, SubmenuTrigger, type SubmenuTriggerProps };
package/dist/index.js CHANGED
@@ -1,27 +1,2 @@
1
- 'use strict';
2
-
3
- var W = require('react');
4
- var f36Core = require('@contentful/f36-core');
5
- var f36Popover = require('@contentful/f36-popover');
6
- var emotion = require('emotion');
7
- var v = require('@contentful/f36-tokens');
8
- var f36Typography = require('@contentful/f36-typography');
9
- var f36Icons = require('@contentful/f36-icons');
10
-
11
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
-
13
- var W__default = /*#__PURE__*/_interopDefault(W);
14
- var v__default = /*#__PURE__*/_interopDefault(v);
15
-
16
- var Fe=Object.defineProperty,ke=Object.defineProperties;var We=Object.getOwnPropertyDescriptors;var B=Object.getOwnPropertySymbols;var ae=Object.prototype.hasOwnProperty,ce=Object.prototype.propertyIsEnumerable;var me=(e,t,o)=>t in e?Fe(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o,i=(e,t)=>{for(var o in t||(t={}))ae.call(t,o)&&me(e,o,t[o]);if(B)for(var o of B(t))ce.call(t,o)&&me(e,o,t[o]);return e},C=(e,t)=>ke(e,We(t));var x=(e,t)=>{var o={};for(var n in e)ae.call(e,n)&&t.indexOf(n)<0&&(o[n]=e[n]);if(e!=null&&B)for(var n of B(e))t.indexOf(n)<0&&ce.call(e,n)&&(o[n]=e[n]);return o};var pe={vertical:{prev:"ArrowUp",next:"ArrowDown"},horizontal:{prev:"ArrowLeft",next:"ArrowRight"}},le=({itemsContainerRef:e,itemsSelector:t,keyType:o="vertical"})=>{let[n,u]=W.useState(0),a=W.useCallback(s=>{let l=e.current;if(!l)return;let b=l.querySelectorAll(t);if(b.length===0)return;let c=b.length-1,S=()=>u(0),T=()=>u(c),p=()=>{n===c?S():u(n+1);},d=()=>{n===0?T():u(n-1);},g={[pe[o].next]:p,[pe[o].prev]:d}[s.key];g&&(s.preventDefault(),g());},[n,t,e,o]);return {focusedIndex:n,handleArrowsKeyDown:a,setFocusedIndex:u}};var de=W__default.default.createContext(void 0),w=()=>{let e=W__default.default.useContext(de);if(e===void 0)throw new Error("useMenuContext must be used within a MenuContextProvider");return e},ge=de.Provider;var z='[role="menuitem"]:not(:disabled)';function U(e){let ne=e,{closeOnSelect:t=!0,closeOnBlur:o=!0,closeOnEsc:n=!0,children:u,onOpen:a}=ne,s=x(ne,["closeOnSelect","closeOnBlur","closeOnEsc","children","onOpen"]),{isOpen:l,handleOpen:b,handleClose:c,isControlled:S}=f36Core.useControllableState({isOpen:e.isOpen,defaultIsOpen:e.defaultIsOpen,onOpen:a,onClose:e.onClose}),T=W.useRef(null),p=W.useRef(null),d=f36Core.useId(null,"menu"),{focusedIndex:f,handleArrowsKeyDown:g,setFocusedIndex:N}=le({itemsContainerRef:p,itemsSelector:z});W.useEffect(()=>{if(l&&p.current){let r=p.current.querySelectorAll(z);r.length>0&&f<r.length?setTimeout(()=>{r[f].focus({preventScroll:!1});},0):setTimeout(()=>{var E;(E=p.current)==null||E.focus({preventScroll:!1});},0);}},[l,f]);let R=W.useCallback(r=>{let P=[...p.current.querySelectorAll(z)].findIndex(y=>r===y);P!==-1&&N(P);},[N]),m=W.useCallback(()=>{var r;c(),(r=T.current)==null||r.focus({preventScroll:!0});},[c]),O=W.useCallback(r=>{if(r.key==="Tab"){r.preventDefault(),m();return}if(r.stopPropagation(),r.key==="ArrowLeft"){r.preventDefault(),m();return}g(r);},[m,g]),M=W.useRef(!1),h=W.useMemo(()=>({isOpen:l,menuId:d,focusMenuItem:R,getTriggerProps:(r={},E=null)=>({onMouseDown:P=>{var y;M.current=!0,(y=r.onMouseDown)==null||y.call(r,P);},onMouseUp:P=>{var y;M.current=!1,(y=r.onMouseUp)==null||y.call(r,P);},onClick:P=>{var I;S&&!a||(l?c():b()),(I=r.onClick)==null||I.call(r,P);},ref:f36Core.mergeRefs(T,E)}),getMenuListProps:(r={},E=null)=>({ref:f36Core.mergeRefs(p,E),onKeyDown:P=>{var y;O(P),(y=r.onKeyDown)==null||y.call(r,P);},onBlur:P=>{var re,se,ie,ue;if((re=r.onBlur)==null||re.call(r,P),!o)return;let y=document.activeElement,I=P.relatedTarget||y,He=p.current===I||((se=p.current)==null?void 0:se.contains(I)),Ae=T.current===I||((ie=T.current)==null?void 0:ie.contains(I))||M.current,De=((ue=I==null?void 0:I.parentElement)==null?void 0:ue.dataset.parentMenu)===d;if(He||Ae||De){P.stopPropagation();return}c();}}),getMenuItemProps:(r={})=>({onClick:E=>{var y;(y=r.onClick)==null||y.call(r,E);let P=!!E.target.getAttribute("aria-haspopup");t&&!P&&m();}}),propsToPropagateToSubmenus:{closeOnSelect:t,closeOnBlur:o,closeOnEsc:n}}),[d,l,O,t,c,b,R,o,n,m,S,a]);return W__default.default.createElement(ge,{value:h},W__default.default.createElement(f36Popover.Popover,C(i({},s),{isOpen:l,onClose:c,id:d,closeOnEsc:n,autoFocus:!1,closeOnBlur:!1}),u))}var xe=W__default.default.createContext(void 0),K=()=>W__default.default.useContext(xe),Te=xe.Provider;var be=()=>emotion.css({position:"sticky",top:0,left:0,backgroundColor:v__default.default.colorWhite,borderBottom:`1px solid ${v__default.default.gray300}`,marginBottom:v__default.default.spacing2Xs,padding:`${v__default.default.spacing2Xs} 0`,zIndex:1001}),Se=()=>emotion.css({position:"sticky",bottom:0,left:0,backgroundColor:v__default.default.colorWhite,borderTop:`1px solid ${v__default.default.gray300}`,marginTop:v__default.default.spacing2Xs,padding:`${v__default.default.spacing2Xs} 0`,zIndex:1001}),Ce=e=>({container:emotion.css({borderRadius:"8px",overflowY:"auto",position:"relative",padding:0,paddingTop:e.hasStickyHeader?0:v__default.default.spacing2Xs,paddingBottom:e.hasStickyFooter?0:v__default.default.spacing2Xs})});var H=e=>{let s=e,{children:t,testId:o="cf-ui-menu-list-header",className:n}=s,u=x(s,["children","testId","className"]),a=be();return W__default.default.createElement("div",i({"data-test-id":o,className:emotion.cx(a,n)},u),t)};H.displayName="MenuListHeader";var A=e=>{let s=e,{children:t,testId:o="cf-ui-menu-list-footer",className:n}=s,u=x(s,["children","testId","className"]),a=Se();return W__default.default.createElement("div",i({"data-test-id":o,className:emotion.cx(a,n)},u),t)};A.displayName="MenuListFooter";function Ze(e){var t;return !!((t=e==null?void 0:e.type)!=null&&t.displayName)}var _e=(e,t)=>{let d=e,{children:o,testId:n="cf-ui-menu-list",className:u}=d,a=x(d,["children","testId","className"]),{getMenuListProps:s}=w(),l=K(),b=null,c=null,S=[];W__default.default.Children.forEach(o,f=>{let g=!0;Ze(f)&&(f.type.displayName===H.displayName?(b=f,g=!1):f.type.displayName===A.displayName&&(c=f,g=!1)),g&&S.push(f);});let T=Ce({hasStickyHeader:!!b,hasStickyFooter:!!c}),p=l?l.getSubmenuListProps(a):a;return W__default.default.createElement(f36Popover.Popover.Content,C(i(i({role:"menu"},p),s(p,t)),{className:emotion.cx(T.container,u),testId:n}),b,S,c)},Y=W__default.default.forwardRef(_e);var he=({isActive:e,isDisabled:t})=>emotion.cx(f36Core.getMenuItemStyles({isActive:e,isDisabled:t}),emotion.css({width:`calc(100% - 2 * ${v__default.default.spacing2Xs})`,margin:`0 ${v__default.default.spacing2Xs}`,gap:v__default.default.spacingXs}));var mt="button";function Ie(e,t){let R=e,{testId:o,className:n,as:u,isActive:a=!1,isDisabled:s,isInitiallyFocused:l,icon:b}=R,c=x(R,["testId","className","as","isActive","isDisabled","isInitiallyFocused","icon"]),S=f36Core.useId(void 0,"menu-item"),T=o||`cf-ui-${S}`,p=he({isActive:a,isDisabled:s}),{getMenuItemProps:d,focusMenuItem:f}=w(),g=W.useRef(null);W.useEffect(()=>{l&&g.current&&f(g.current);},[l,f]);let N=u!=null?u:mt;return W__default.default.createElement(N,C(i(i({role:"menuitem"},c),d(c)),{disabled:s!=null?s:e.disabled,className:emotion.cx(p,n),"data-test-id":T,ref:f36Core.mergeRefs(g,t),tabIndex:-1}),b,e.children)}Ie.displayName="MenuItem";var D=W__default.default.forwardRef(Ie);var F=e=>{let t=W__default.default.Children.only(e.children),{getTriggerProps:o}=w();return W__default.default.createElement(f36Popover.Popover.Trigger,null,W__default.default.cloneElement(t,C(i({},o(t.props,t.ref)),{"aria-haspopup":"menu"})))};var Le=()=>emotion.css({border:"none",width:"100%",height:"1px",backgroundColor:v__default.default.gray200,margin:`${v__default.default.spacing2Xs} 0`});var J=e=>{let s=e,{children:t,testId:o="cf-ui-menu-divider",className:n}=s,u=x(s,["children","testId","className"]),a=Le();return W__default.default.createElement("hr",i({"aria-orientation":"horizontal","data-test-id":o,className:emotion.cx(a,n)},u))};var Re=()=>emotion.css({color:v__default.default.gray500,textAlign:"left",padding:`${v__default.default.spacingXs} ${v__default.default.spacingS} ${v__default.default.spacing2Xs}`,lineHeight:v__default.default.lineHeightM});var Q=e=>{let s=e,{children:t,testId:o="cf-ui-menu-section-title",className:n}=s,u=x(s,["children","testId","className"]),a=Re();return W__default.default.createElement(f36Typography.Caption,i({"aria-hidden":"true",as:"div",testId:o,className:emotion.cx(a,n),marginBottom:"none"},u),t)};var bt=[-8,2],_=e=>{let R=e,{onClose:t,onOpen:o,placement:n="right-start",isAutoalignmentEnabled:u=!1}=R,a=x(R,["onClose","onOpen","placement","isAutoalignmentEnabled"]),{isOpen:s,menuId:l,propsToPropagateToSubmenus:b}=w(),c=W.useRef(null),S=W.useRef(null),[T,p]=W.useState(!1),d=W.useCallback(()=>{p(!0),window.clearTimeout(S.current),o==null||o();},[o]),f=W.useCallback(()=>{p(!1),window.clearTimeout(S.current),t==null||t();},[t]),g=W.useCallback(()=>{var m;f(),(m=c.current)==null||m.focus({preventScroll:!0});},[f]);W.useEffect(()=>{s===!1&&p(!1);},[s]);let N=W.useMemo(()=>({isOpen:T,getSubmenuListProps:m=>({"data-parent-menu":l,onMouseOver:O=>{var M;d(),(M=m.onMouseOver)==null||M.call(m,O);},onMouseLeave:O=>{var M;g(),(M=m.onMouseLeave)==null||M.call(m,O);}}),getSubmenuTriggerProps:(m,O)=>({ref:f36Core.mergeRefs(c,O),onKeyDown:M=>{var h;M.key==="ArrowRight"&&(M.preventDefault(),d()),(h=m.onKeyDown)==null||h.call(m,M);},onMouseOver:M=>{var h;d(),(h=m.onMouseOver)==null||h.call(m,M);},onMouseLeave:M=>{var h;S.current=window.setTimeout(g,300),(h=m.onMouseLeave)==null||h.call(m,M);}})}),[T,l,d,g]);return W__default.default.createElement(Te,{value:N},W__default.default.createElement(U,C(i(i({},b),a),{isOpen:T,onClose:f,onOpen:d,placement:n,isAutoalignmentEnabled:u,offset:bt})))};var Ne=()=>({root:({isActive:e})=>emotion.css(i({display:"flex",alignItems:"center",paddingRight:v__default.default.spacingXs},e?{backgroundColor:v__default.default.gray100}:{})),content:emotion.css({marginRight:v__default.default.spacingM}),icon:emotion.css({marginLeft:"auto",fill:"currentColor"})});var ht=(e,t)=>{let{className:o,children:n}=e,{getSubmenuTriggerProps:u,isOpen:a}=K(),s=Ne();return W__default.default.createElement(F,null,W__default.default.createElement(D,C(i(i({},e),u(e,t)),{className:emotion.cx(s.root({isActive:a}),o)}),W__default.default.createElement("span",{className:s.content},n),W__default.default.createElement(f36Icons.CaretRightIcon,{className:s.icon})))},oe=W__default.default.forwardRef(ht);var L=U;L.List=Y;L.ListHeader=H;L.ListFooter=A;L.Item=D;L.Trigger=F;L.Divider=J;L.SectionTitle=Q;L.Submenu=_;L.SubmenuTrigger=oe;
17
-
18
- exports.Menu = L;
19
- exports.MenuDivider = J;
20
- exports.MenuItem = D;
21
- exports.MenuList = Y;
22
- exports.MenuSectionTitle = Q;
23
- exports.MenuTrigger = F;
24
- exports.Submenu = _;
25
- exports.SubmenuTrigger = oe;
26
- //# sourceMappingURL=out.js.map
1
+ 'use strict';var M=require('react'),react=require('@floating-ui/react'),css=require('@emotion/css'),f=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 M__namespace=/*#__PURE__*/_interopNamespace(M);var f__default=/*#__PURE__*/_interopDefault(f);var ze=Object.defineProperty,Ge=Object.defineProperties;var je=Object.getOwnPropertyDescriptors;var G=Object.getOwnPropertySymbols;var Me=Object.prototype.hasOwnProperty,ye=Object.prototype.propertyIsEnumerable;var ge=(e,o,t)=>o in e?ze(e,o,{enumerable:true,configurable:true,writable:true,value:t}):e[o]=t,i=(e,o)=>{for(var t in o||(o={}))Me.call(o,t)&&ge(e,t,o[t]);if(G)for(var t of G(o))ye.call(o,t)&&ge(e,t,o[t]);return e},P=(e,o)=>Ge(e,je(o));var m=(e,o)=>{var t={};for(var r in e)Me.call(e,r)&&o.indexOf(r)<0&&(t[r]=e[r]);if(e!=null&&G)for(var r of G(e))o.indexOf(r)<0&&ye.call(e,r)&&(t[r]=e[r]);return t};var H=M__namespace.default.createContext(null);function k(){let e=M__namespace.default.useContext(H);if(!e)throw new Error("useMenuContext must be used within <MenuContext.Provider>");return e}var Pe=H.Provider;function Re({placement:e,isFullWidth:o=false,isAutoalignmentEnabled:t=true,isOpen:r,defaultIsOpen:u=false,onOpen:s,onClose:n,offset:a,renderOnlyWhenOpen:g=true,usePortal:c=true,closeOnEsc:E=true,closeOnBlur:y=true,closeOnSelect:v=true,autoFocus:d=true}){let I=M__namespace.default.useRef([]),T=M__namespace.default.useRef([]),p=react.useFloatingTree(),l=react.useFloatingNodeId(),x=react.useFloatingParentNodeId(),S=react.useListItem(),ie=M__namespace.default.useContext(H),C=x!=null,K=!!r,[Ae,Oe]=M__namespace.default.useState(u),b=K?!!r:Ae,ae=M__namespace.default.useRef(b);M__namespace.default.useEffect(()=>{ae.current=b;},[b]);let _=M__namespace.default.useCallback(h=>{let F=ae.current;h!==F&&(K||Oe(h),h&&!F?s==null||s():!h&&F&&(n==null||n()));},[K,s,n]),[ue,De]=M__namespace.default.useState(false),[$,Y]=M__namespace.default.useState(0),z=[react.offset(a||(C?{mainAxis:4,alignmentAxis:-4}:5))],q;e!=="auto"&&t?(q=e,z.push(react.flip({padding:5}),react.shift({padding:5}))):e==="auto"?z.push(react.autoPlacement()):q=e,o&&z.push(react.size({apply({rects:h,elements:F}){Object.assign(F.floating.style,{minWidth:`${h.reference.width}px`});}}));let{floatingStyles:pe,refs:me,context:L}=react.useFloating({nodeId:l,open:b,onOpenChange:_,whileElementsMounted:react.autoUpdate,placement:q,middleware:z}),Be=react.useHover(L,{enabled:C,delay:{open:75},handleClose:react.safePolygon({blockPointerEvents:true})}),We=react.useClick(L,{event:"mousedown",toggle:!C,ignoreMouse:C}),Ue=react.useRole(L,{role:"menu"}),Xe=react.useDismiss(L,{escapeKey:E,outsidePress:y,ancestorScroll:true,bubbles:true}),_e=react.useListNavigation(L,{listRef:I,activeIndex:$,nested:C,onNavigate:Y,loop:true}),$e=react.useTypeahead(L,{listRef:T,onMatch:b?Y:void 0,activeIndex:$}),{getReferenceProps:ce,getFloatingProps:le,getItemProps:de}=react.useInteractions([Be,We,Ue,Xe,_e,$e]);return M__namespace.default.useEffect(()=>{if(!p)return;function h(){v&&_(false);}function F(fe){fe.nodeId!==l&&fe.parentId===x&&_(false);}return p.events.on("click",h),p.events.on("menuopen",F),()=>{p.events.off("click",h),p.events.off("menuopen",F);}},[p,l,x,_,v]),M__namespace.default.useEffect(()=>{b&&p&&p.events.emit("menuopen",{parentId:x,nodeId:l});},[p,b,l,x]),M__namespace.default.useMemo(()=>({isOpen:b,hasFocusInside:ue,activeIndex:$,isNested:C,refs:me,elementsRef:I,labelsRef:T,floatingStyles:pe,context:L,renderOnlyWhenOpen:g,usePortal:c,autoFocus:d,getReferenceProps:ce,getFloatingProps:le,getItemProps:de,setHasFocusInside:De,setActiveIndex:Y,nodeId:l,item:S,parent:ie}),[$,L,pe,le,de,ce,ue,C,b,S,l,ie,me,g,c,d])}var Ie=M__namespace.forwardRef(function(u,r){var s=u,{children:o}=s,t=m(s,["children"]);let n=Re(i({},t));return M__namespace.createElement(Pe,{value:n},M__namespace.createElement(react.FloatingNode,{id:n.nodeId},M__namespace.createElement("div",{ref:r},o)))});var A=M__namespace.default.forwardRef(function(o,t){let c=o,{children:r,placement:u}=c,s=m(c,["children","placement"]),n=react.useFloatingParentNodeId(),a=u!=null?u:n===null?"bottom-start":"right-start",g=M__namespace.default.createElement(Ie,P(i({placement:a},s),{ref:t}),r);return n===null?M__namespace.default.createElement(react.FloatingTree,null,g):g});A.displayName="Menu";var Te=()=>css.css({position:"sticky",top:0,left:0,backgroundColor:f__default.default.colorWhite,borderBottom:`1px solid ${f__default.default.gray300}`,marginBottom:f__default.default.spacing2Xs,padding:`${f__default.default.spacing2Xs} 0`,zIndex:1001}),be=()=>css.css({position:"sticky",bottom:0,left:0,backgroundColor:f__default.default.colorWhite,borderTop:`1px solid ${f__default.default.gray300}`,marginTop:f__default.default.spacing2Xs,padding:`${f__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:f__default.default.colorWhite,paddingTop:e.hasStickyHeader?0:f__default.default.spacing2Xs,paddingBottom:e.hasStickyFooter?0:f__default.default.spacing2Xs,boxShadow:f__default.default.boxShadowDefault,zIndex:f__default.default.zIndexDropdown,"&:focus":{boxShadow:f__default.default.glowPrimary,outline:"none"},"&:focus:not(:focus-visible)":{boxShadow:f__default.default.boxShadowDefault}})});var O=e=>{let n=e,{children:o,testId:t="cf-ui-menu-list-header",className:r}=n,u=m(n,["children","testId","className"]),s=Te();return M__namespace.default.createElement("div",i({"data-test-id":t,className:css.cx(s,r)},u),o)};O.displayName="MenuListHeader";var D=e=>{let n=e,{children:o,testId:t="cf-ui-menu-list-footer",className:r}=n,u=m(n,["children","testId","className"]),s=be();return M__namespace.default.createElement("div",i({"data-test-id":t,className:css.cx(s,r)},u),o)};D.displayName="MenuListFooter";function ht(e){return !M__namespace.default.isValidElement(e)||typeof e.type=="string"?false:typeof e.type.displayName=="string"}var Ee=(e,o)=>{let T=e,{children:t,testId:r="cf-ui-menu-list",className:u,style:s}=T,n=m(T,["children","testId","className","style"]),a=k(),g=null,c=null,E=[],y=react.useMergeRefs([a.refs.setFloating,o]);M__namespace.default.Children.forEach(t,p=>{let l=true;ht(p)&&(p.type.displayName===O.displayName?(g=p,l=false):p.type.displayName===D.displayName&&(c=p,l=false)),l&&E.push(p);});let v=he({hasStickyHeader:!!g,hasStickyFooter:!!c,isOpen:a.isOpen});if(a.renderOnlyWhenOpen&&!a.isOpen)return null;let d=M__namespace.default.createElement("div",i(i({role:"menu",style:i(i({},s),a.floatingStyles),className:css.cx(v.container,u),"data-test-id":r,ref:y},n),a.getFloatingProps()),g,E,c),I=p=>a.autoFocus===false?p:M__namespace.default.createElement(react.FloatingFocusManager,{context:a.context,modal:false,initialFocus:a.isNested?-1:0,returnFocus:!a.isNested},p);return M__namespace.default.createElement(react.FloatingList,{elementsRef:a.elementsRef,labelsRef:a.labelsRef},a.usePortal?M__namespace.default.createElement(react.FloatingPortal,null,I(d)):I(d))};Ee.displayName="MenuList";var Z=M__namespace.default.forwardRef(Ee);function Se(){let e=M__namespace.default.useContext(H),o=react.useListItem(),t=react.useFloatingTree(),r=o.index===e.activeIndex,u=M__namespace.default.useCallback((s={})=>e.getItemProps(P(i({},s),{onClick(n){var a;(a=s.onClick)==null||a.call(s,n),t==null||t.events.emit("click");},onFocus(n){var a;(a=s.onFocus)==null||a.call(s,n),e.setHasFocusInside(true);}})),[e,t]);return {isActive:r,item:o,menu:e,tree:t,getItemProps:u}}var Le=({isActive:e,isDisabled:o})=>css.cx(f36Core.getMenuItemStyles({isActive:e,isDisabled:o}),css.css({width:`calc(100% - 2 * ${f__default.default.spacing2Xs})`,margin:`0 ${f__default.default.spacing2Xs}`,gap:f__default.default.spacingXs}));var kt="button";function Fe(e,o){let S=e,{testId:t,className:r,as:u,isActive:s=false,isDisabled:n,isInitiallyFocused:a,icon:g}=S,c=m(S,["testId","className","as","isActive","isDisabled","isInitiallyFocused","icon"]),E=n!=null?n:e.disabled,y=Se(),v=f36Core.useId(void 0,"menu-item"),d=t||`cf-ui-${v}`,I=Le({isActive:s,isDisabled:n}),T=u!=null?u:kt,{menu:p,item:l}=y,{setActiveIndex:x}=p;return M__namespace.default.useEffect(()=>{a&&x(l.index);},[a,l.index,x]),M__namespace.default.createElement(T,i(P(i({},c),{ref:react.useMergeRefs([y.item.ref,o]),role:"menuitem",className:css.cx(I,r),"data-test-id":d,tabIndex:y.isActive?0:-1,disabled:E}),y.getItemProps(c)),g,e.children)}Fe.displayName="MenuItem";var B=M__namespace.default.forwardRef(Fe);var W=M__namespace.default.forwardRef(function(u,r){var s=u,{children:o}=s,t=m(s,["children"]);let n=k(),{refs:a,item:g,isNested:c,isOpen:E,hasFocusInside:y,setHasFocusInside:v,parent:d}=n,I=o.ref,T=d==null?void 0:d.activeIndex,p=d?d.getItemProps:n.getItemProps,l=i({ref:react.useMergeRefs([a.setReference,g.ref,r,I]),tabIndex:c?T===g.index?0:-1:void 0,role:c?"menuitem":void 0,"data-open":E?"":void 0,"data-nested":c?"":void 0,"data-focus-inside":y?"":void 0},n.getReferenceProps(p(P(i({},t),{onFocus(x){var S;(S=t.onFocus)==null||S.call(t,x),v(false),d&&d.setHasFocusInside(true);}}))));return M__namespace.default.cloneElement(o,l)});var He=()=>css.css({border:"none",width:"100%",height:"1px",backgroundColor:f__default.default.gray200,margin:`${f__default.default.spacing2Xs} 0`});var j=e=>{let n=e,{children:o,testId:t="cf-ui-menu-divider",className:r}=n,u=m(n,["children","testId","className"]),s=He();return M__namespace.default.createElement("hr",i({"aria-orientation":"horizontal","data-test-id":t,className:css.cx(s,r)},u))};j.displayName="MenuDivider";var ke=()=>css.css({color:f__default.default.gray500,textAlign:"left",padding:`${f__default.default.spacingXs} ${f__default.default.spacingS} ${f__default.default.spacing2Xs}`,lineHeight:f__default.default.lineHeightM});var oe=e=>{let n=e,{children:o,testId:t="cf-ui-menu-section-title",className:r}=n,u=m(n,["children","testId","className"]),s=ke();return M__namespace.default.createElement(f36Typography.Caption,i({"aria-hidden":"true",as:"div",testId:t,className:css.cx(s,r),marginBottom:"none"},u),o)};var V=e=>M__namespace.default.createElement(A,i({},e));V.displayName="Submenu";var we=()=>({root:({isActive:e})=>css.css(i({display:"flex",alignItems:"center",paddingRight:f__default.default.spacingXs},e?{backgroundColor:f__default.default.gray100}:{})),content:css.css({marginRight:f__default.default.spacingM}),icon:css.css({marginLeft:"auto",fill:"currentColor"})});var Gt=(e,o)=>{let{className:t,children:r}=e,u=we(),{isOpen:s}=k();return M__namespace.default.createElement(W,null,M__namespace.default.createElement(B,P(i({},e),{ref:o,className:css.cx(u.root({isActive:s}),t)}),M__namespace.default.createElement("span",{className:u.content},r),M__namespace.default.createElement(f36Icons.CaretRightIcon,{className:u.icon})))},se=M__namespace.default.forwardRef(Gt);var R=A;R.List=Z;R.ListHeader=O;R.ListFooter=D;R.Item=B;R.Trigger=W;R.Divider=j;R.SectionTitle=oe;R.Submenu=V;R.SubmenuTrigger=se;exports.Menu=R;exports.MenuDivider=j;exports.MenuItem=B;exports.MenuList=Z;exports.MenuSectionTitle=oe;exports.MenuTrigger=W;exports.Submenu=V;exports.SubmenuTrigger=se;//# sourceMappingURL=index.js.map
27
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/Menu.tsx","../src/useArrowKeyNavigation.ts","../src/MenuContext.ts","../src/MenuList/MenuList.tsx","../src/SubmenuContext.ts","../src/MenuList/MenuList.styles.ts","../src/MenuList/MenuListHeader.tsx","../src/MenuList/MenuListFooter.tsx","../src/MenuItem/MenuItem.tsx","../src/MenuItem/MenuItem.styles.ts","../src/MenuTrigger/MenuTrigger.tsx","../src/MenuDivider/MenuDivider.tsx","../src/MenuDivider/MenuDivider.styles.ts","../src/MenuSectionTitle/MenuSectionTitle.tsx","../src/MenuSectionTitle/MenuSectionTitle.styles.ts","../src/Submenu/Submenu.tsx","../src/SubmenuTrigger/SubmenuTrigger.tsx","../src/SubmenuTrigger/SubmenuTrigger.styles.ts","../src/CompoundMenu.tsx"],"names":["React","useCallback","useMemo","useRef","useEffect","mergeRefs","useId","useControllableState","Popover","useState","ARROW_KEY_TYPES","useArrowKeyNavigation","itemsContainerRef","itemsSelector","keyType","focusedIndex","setFocusedIndex","handleArrowsKeyDown","event","container","items","lastItemIndex","focusFirstItem","focusLastItem","focusNextItem","focusPrevItem","fn","MenuContext","useMenuContext","context","MenuContextProvider","MENU_ITEMS_SELECTOR","Menu","props","_a","closeOnSelect","closeOnBlur","closeOnEsc","children","onOpen","otherProps","__objRest","isOpen","handleOpen","handleClose","isControlled","triggerRef","menuListRef","menuId","menuItems","focusMenuItem","item","itemIndex","menuItem","closeAndFocusTrigger","handleMenuListKeyDown","isMouseDown","contextValue","_props","_ref","_b","_c","_d","activeElement","relatedTarget","targetIsMenu","targetIsTrigger","targetIsSubmenu","isSubmenuTrigger","__spreadProps","__spreadValues","SubmenuContext","useSubmenuContext","SubmenuContextProvider","cx","css","tokens","getMenuHeaderStyles","getMenuFooterStyles","getMenuListStyles","MenuListHeader","testId","className","styles","MenuListFooter","assertChild","child","_MenuList","ref","getMenuListProps","submenuContext","header","footer","appendChild","extendedOtherProps","MenuList","globalGetMenuItemStyles","getMenuItemStyles","isActive","isDisabled","MENU_ITEM_DEFAULT_TAG","_MenuItem","as","isInitiallyFocused","icon","id","itemTestId","getMenuItemProps","itemRef","Element","MenuItem","MenuTrigger","getTriggerProps","getMenuDividerStyles","MenuDivider","Caption","getMenuSectionTitleStyles","MenuSectionTitle","SUBMENU_OFFSET","Submenu","onClose","placement","isAutoalignmentEnabled","isParentMenuOpen","propsToPropagateToSubmenus","mouseLeaveTimerRef","setIsOpen","CaretRightIcon","getSubmenuTriggerStyles","_SubmenuTrigger","getSubmenuTriggerProps","SubmenuTrigger"],"mappings":"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","sourcesContent":["import React, { useCallback, useMemo, useRef, useEffect } from 'react';\nimport { mergeRefs, useId, useControllableState } from '@contentful/f36-core';\nimport { Popover, type PopoverProps } from '@contentful/f36-popover';\n\nimport { useArrowKeyNavigation } from './useArrowKeyNavigation';\nimport { MenuContextProvider, MenuContextType } from './MenuContext';\n\nconst MENU_ITEMS_SELECTOR = '[role=\"menuitem\"]:not(:disabled)';\n\nexport interface MenuProps\n extends Omit<PopoverProps, 'autoFocus' | 'id' | 'closeOnBlur'> {\n /**\n * By default, the Menu is uncontrolled (manage it's expanded state by itself)\n * But you can make it controlled by providing boolean (true/false)\n */\n isOpen?: boolean;\n\n /**\n * If `true`, the Menu will be initially opened.\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 * 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\nexport function Menu(props: MenuProps) {\n const {\n closeOnSelect = true,\n closeOnBlur = true,\n closeOnEsc = true,\n children,\n onOpen,\n ...otherProps\n } = props;\n const { isOpen, handleOpen, handleClose, isControlled } =\n useControllableState({\n isOpen: props.isOpen,\n defaultIsOpen: props.defaultIsOpen,\n onOpen,\n onClose: props.onClose,\n });\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuListRef = useRef<HTMLDivElement>(null);\n\n const menuId = useId(null, 'menu');\n\n const { focusedIndex, handleArrowsKeyDown, setFocusedIndex } =\n useArrowKeyNavigation({\n itemsContainerRef: menuListRef,\n itemsSelector: MENU_ITEMS_SELECTOR,\n });\n\n useEffect(() => {\n if (isOpen && menuListRef.current) {\n const menuItems =\n menuListRef.current.querySelectorAll<HTMLElement>(MENU_ITEMS_SELECTOR);\n\n if (menuItems.length > 0 && focusedIndex < menuItems.length) {\n // timeout trick to prevent scroll from jumping\n // when the popover is not positioned correctly yet in the opening phase\n setTimeout(() => {\n menuItems[focusedIndex].focus({ preventScroll: false });\n }, 0);\n } else {\n setTimeout(() => {\n menuListRef.current?.focus({ preventScroll: false });\n }, 0);\n }\n }\n }, [isOpen, focusedIndex]);\n\n const focusMenuItem = useCallback(\n (item: HTMLElement) => {\n const menuItems =\n menuListRef.current.querySelectorAll(MENU_ITEMS_SELECTOR);\n\n const itemIndex = [...menuItems].findIndex(\n (menuItem) => item === menuItem,\n );\n\n if (itemIndex !== -1) {\n setFocusedIndex(itemIndex);\n }\n },\n [setFocusedIndex],\n );\n\n const closeAndFocusTrigger = useCallback(() => {\n handleClose();\n triggerRef.current?.focus({ preventScroll: true });\n }, [handleClose]);\n\n const handleMenuListKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key === 'Tab') {\n event.preventDefault();\n closeAndFocusTrigger();\n return;\n }\n\n // we don't want to propagate other keydown events except `Tab`\n event.stopPropagation();\n\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n closeAndFocusTrigger();\n return;\n }\n\n handleArrowsKeyDown(event);\n },\n [closeAndFocusTrigger, handleArrowsKeyDown],\n );\n\n // Safari has an issue with the relatedTarget that we use on the onBlur for menuListProps,\n // which was causing the menu to close and reopen when clicking on the trigger.\n // We will use the isMouseDown to prevent triggering blur in the cases where the user clicks on the trigger.\n const isMouseDown = useRef<Boolean>(false);\n\n const contextValue: MenuContextType = useMemo(\n () => ({\n isOpen,\n menuId,\n focusMenuItem,\n getTriggerProps: (_props = {}, _ref = null) => ({\n onMouseDown: (event) => {\n isMouseDown.current = true;\n _props.onMouseDown?.(event);\n },\n onMouseUp: (event) => {\n isMouseDown.current = false;\n _props.onMouseUp?.(event);\n },\n onClick: (event) => {\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\n if (!isFullyControlled) {\n if (isOpen) {\n handleClose();\n } else {\n handleOpen();\n }\n }\n\n _props.onClick?.(event);\n },\n ref: mergeRefs(triggerRef, _ref),\n }),\n getMenuListProps: (_props = {}, _ref = null) => ({\n ref: mergeRefs(menuListRef, _ref),\n onKeyDown: (event) => {\n handleMenuListKeyDown(event);\n _props.onKeyDown?.(event);\n },\n onBlur: (event) => {\n _props.onBlur?.(event);\n\n if (!closeOnBlur) {\n return;\n }\n\n const activeElement = document.activeElement;\n const relatedTarget = event.relatedTarget || activeElement;\n\n const targetIsMenu =\n menuListRef.current === relatedTarget ||\n menuListRef.current?.contains(relatedTarget);\n const targetIsTrigger =\n triggerRef.current === relatedTarget ||\n triggerRef.current?.contains(relatedTarget) ||\n isMouseDown.current;\n const targetIsSubmenu =\n relatedTarget?.parentElement?.dataset.parentMenu === menuId;\n\n if (targetIsMenu || targetIsTrigger || targetIsSubmenu) {\n event.stopPropagation();\n return;\n }\n\n handleClose();\n },\n }),\n getMenuItemProps: (_props = {}) => ({\n onClick: (event) => {\n _props.onClick?.(event);\n\n const isSubmenuTrigger = Boolean(\n (event.target as HTMLElement).getAttribute('aria-haspopup'),\n );\n if (closeOnSelect && !isSubmenuTrigger) {\n closeAndFocusTrigger();\n }\n },\n }),\n propsToPropagateToSubmenus: {\n closeOnSelect,\n closeOnBlur,\n closeOnEsc,\n },\n }),\n [\n menuId,\n isOpen,\n handleMenuListKeyDown,\n closeOnSelect,\n handleClose,\n handleOpen,\n focusMenuItem,\n closeOnBlur,\n closeOnEsc,\n closeAndFocusTrigger,\n isControlled,\n onOpen,\n ],\n );\n\n return (\n <MenuContextProvider value={contextValue}>\n <Popover\n {...otherProps}\n isOpen={isOpen}\n onClose={handleClose}\n id={menuId}\n closeOnEsc={closeOnEsc}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={false}\n closeOnBlur={false}\n >\n {children}\n </Popover>\n </MenuContextProvider>\n );\n}\n","import { useState, useCallback } from 'react';\n\ninterface UseArrowKeyNavigationProps {\n itemsContainerRef: React.MutableRefObject<HTMLElement>;\n itemsSelector: string;\n keyType?: 'vertical' | 'horizontal';\n initialFocusedIndex?: number;\n}\n\nconst ARROW_KEY_TYPES = {\n vertical: {\n prev: 'ArrowUp',\n next: 'ArrowDown',\n },\n horizontal: {\n prev: 'ArrowLeft',\n next: 'ArrowRight',\n },\n};\n\nexport const useArrowKeyNavigation = ({\n itemsContainerRef,\n itemsSelector,\n keyType = 'vertical',\n}: UseArrowKeyNavigationProps) => {\n const [focusedIndex, setFocusedIndex] = useState<number>(0);\n\n const handleArrowsKeyDown = useCallback(\n (event: React.KeyboardEvent) => {\n const container = itemsContainerRef.current;\n if (!container) return;\n\n const items = container.querySelectorAll(itemsSelector);\n if (items.length === 0) return;\n\n const lastItemIndex = items.length - 1;\n\n const focusFirstItem = () => setFocusedIndex(0);\n const focusLastItem = () => setFocusedIndex(lastItemIndex);\n const focusNextItem = () => {\n if (focusedIndex === lastItemIndex) {\n focusFirstItem();\n } else {\n setFocusedIndex(focusedIndex + 1);\n }\n };\n const focusPrevItem = () => {\n if (focusedIndex === 0) {\n focusLastItem();\n } else {\n setFocusedIndex(focusedIndex - 1);\n }\n };\n\n const keyToFnMap = {\n [ARROW_KEY_TYPES[keyType].next]: focusNextItem,\n [ARROW_KEY_TYPES[keyType].prev]: focusPrevItem,\n };\n\n const fn = keyToFnMap[event.key];\n if (fn) {\n event.preventDefault();\n fn();\n }\n },\n [focusedIndex, itemsSelector, itemsContainerRef, keyType],\n );\n\n return { focusedIndex, handleArrowsKeyDown, setFocusedIndex };\n};\n","import React, { ComponentPropsWithRef } from 'react';\nimport { MenuProps } from '.';\n\nexport type MenuContextType = {\n isOpen: boolean;\n menuId: string;\n focusMenuItem: (item: HTMLElement) => void;\n getTriggerProps: (\n _props: ComponentPropsWithRef<'button'>,\n _ref: React.Ref<HTMLButtonElement>,\n ) => ComponentPropsWithRef<'button'>;\n getMenuListProps: (\n _props: ComponentPropsWithRef<'div'>,\n _ref: React.Ref<HTMLDivElement>,\n ) => ComponentPropsWithRef<'div'>;\n getMenuItemProps: (\n _props: ComponentPropsWithRef<'button'>,\n ) => ComponentPropsWithRef<'button'>;\n propsToPropagateToSubmenus: Pick<\n MenuProps,\n 'closeOnBlur' | 'closeOnEsc' | 'closeOnSelect'\n >;\n};\n\nconst MenuContext = React.createContext<MenuContextType | undefined>(undefined);\n\nexport const useMenuContext = () => {\n const context = React.useContext(MenuContext);\n\n if (context === undefined) {\n throw new Error('useMenuContext must be used within a MenuContextProvider');\n }\n\n return context;\n};\n\nexport const MenuContextProvider = MenuContext.Provider;\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { useMenuContext } from '../MenuContext';\nimport { useSubmenuContext } from '../SubmenuContext';\nimport { Popover } from '@contentful/f36-popover';\nimport { cx } from 'emotion';\nimport { getMenuListStyles } from './MenuList.styles';\nimport { MenuListHeader } from './MenuListHeader';\nimport { MenuListFooter } from './MenuListFooter';\n\ninterface MenuListInternalProps extends CommonProps {\n children?: React.ReactNode;\n}\n\nfunction assertChild(child: any): child is { type: { displayName: string } } {\n return Boolean(child?.type?.displayName);\n}\n\nexport type MenuListProps = PropsWithHTMLElement<MenuListInternalProps, 'div'>;\n\nconst _MenuList = (\n props: ExpandProps<MenuListProps>,\n ref: React.Ref<HTMLDivElement>,\n) => {\n const {\n children,\n testId = 'cf-ui-menu-list',\n className,\n ...otherProps\n } = props;\n\n const { getMenuListProps } = useMenuContext();\n const submenuContext = useSubmenuContext();\n\n let header: React.ReactElement | null = null;\n let footer: React.ReactElement | null = null;\n const items: React.ReactElement[] = [];\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 });\n\n const extendedOtherProps = submenuContext\n ? submenuContext.getSubmenuListProps(otherProps)\n : otherProps;\n\n return (\n <Popover.Content\n role=\"menu\"\n {...extendedOtherProps}\n {...getMenuListProps(extendedOtherProps, ref)}\n className={cx(styles.container, className)}\n testId={testId}\n >\n {header}\n {items}\n {footer}\n </Popover.Content>\n );\n};\n\nexport const MenuList = React.forwardRef(_MenuList);\n","import React, { ComponentPropsWithRef, ComponentPropsWithoutRef } from 'react';\n\nexport type SubmenuContextType = {\n isOpen: boolean;\n getSubmenuListProps: (\n _props: ComponentPropsWithRef<'div'>,\n ) => { 'data-parent-menu': string } & ComponentPropsWithoutRef<'div'>;\n getSubmenuTriggerProps: (\n _props: ComponentPropsWithRef<'button'>,\n _ref: React.Ref<HTMLButtonElement>,\n ) => ComponentPropsWithRef<'button'>;\n};\n\nconst SubmenuContext = React.createContext<SubmenuContextType | undefined>(\n undefined,\n);\n\nexport const useSubmenuContext = () => {\n const context = React.useContext(SubmenuContext);\n return context;\n};\n\nexport const SubmenuContextProvider = SubmenuContext.Provider;\n","import { css } from 'emotion';\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}) => ({\n container: css({\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: 'relative',\n padding: 0,\n paddingTop: props.hasStickyHeader ? 0 : tokens.spacing2Xs,\n paddingBottom: props.hasStickyFooter ? 0 : tokens.spacing2Xs,\n }),\n});\n","import React from 'react';\nimport { cx } from 'emotion';\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';\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, { useEffect, useRef } from 'react';\nimport { cx } from 'emotion';\nimport {\n mergeRefs,\n useId,\n type CommonProps,\n type PolymorphicComponent,\n type PolymorphicProps,\n type ExpandProps,\n} from '@contentful/f36-core';\n\nimport { useMenuContext } from '../MenuContext';\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 _MenuItem<E extends React.ElementType = typeof MENU_ITEM_DEFAULT_TAG>(\n props: MenuItemProps<E>,\n ref: React.Ref<any>,\n) {\n const {\n testId,\n className,\n as,\n isActive = false,\n isDisabled,\n isInitiallyFocused,\n icon,\n ...otherProps\n } = props;\n\n const id = useId(undefined, 'menu-item');\n const itemTestId = testId || `cf-ui-${id}`;\n const styles = getMenuItemStyles({ isActive, isDisabled });\n\n const { getMenuItemProps, focusMenuItem } = useMenuContext();\n\n const itemRef = useRef<HTMLElement>(null);\n useEffect(() => {\n if (isInitiallyFocused && itemRef.current) {\n focusMenuItem(itemRef.current);\n }\n }, [isInitiallyFocused, focusMenuItem]);\n\n const Element = (as ?? MENU_ITEM_DEFAULT_TAG) as React.ElementType;\n\n return (\n <Element\n role=\"menuitem\"\n {...otherProps}\n {...getMenuItemProps(otherProps)}\n disabled={isDisabled ?? props.disabled}\n className={cx(styles, className)}\n data-test-id={itemTestId}\n ref={mergeRefs(itemRef, ref)}\n tabIndex={-1}\n >\n {icon}\n {props.children}\n </Element>\n );\n}\n\n_MenuItem.displayName = 'MenuItem';\n\nexport const MenuItem: PolymorphicComponent<\n ExpandProps<MenuItemInternalProps>,\n typeof MENU_ITEM_DEFAULT_TAG\n> = React.forwardRef(_MenuItem);\n","import { css, cx } from 'emotion';\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 { Popover } from '@contentful/f36-popover';\nimport { useMenuContext } from '../MenuContext';\nimport type { ExpandProps } from '@contentful/f36-core';\n\nexport interface MenuTriggerProps {\n children: React.ReactNode;\n}\n\nexport const MenuTrigger = (props: ExpandProps<MenuTriggerProps>) => {\n const child = React.Children.only(props.children) as any;\n const { getTriggerProps } = useMenuContext();\n\n return (\n <Popover.Trigger>\n {React.cloneElement(child, {\n ...getTriggerProps(child.props, child.ref),\n ['aria-haspopup']: 'menu',\n })}\n </Popover.Trigger>\n );\n};\n","import React from 'react';\nimport type {\n CommonProps,\n PropsWithHTMLElement,\n ExpandProps,\n} from '@contentful/f36-core';\nimport { cx } from 'emotion';\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","import { css } from 'emotion';\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 { cx } from 'emotion';\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 { css } from 'emotion';\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, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { Menu, type MenuProps } from '../Menu';\nimport { useMenuContext } from '../MenuContext';\nimport {\n SubmenuContextProvider,\n type SubmenuContextType,\n} from '../SubmenuContext';\nimport { mergeRefs } from '@contentful/f36-core';\n\nconst SUBMENU_OFFSET: [number, number] = [-8, 2];\n\nexport type SubmenuProps = Omit<\n MenuProps,\n 'offset' | 'usePortal' | 'isOpen' | 'defaultIsOpen'\n>;\n\nexport const Submenu = (props: SubmenuProps) => {\n const {\n onClose,\n onOpen,\n placement = 'right-start',\n isAutoalignmentEnabled = false,\n ...otherProps\n } = props;\n\n const {\n isOpen: isParentMenuOpen,\n menuId,\n propsToPropagateToSubmenus,\n } = useMenuContext();\n\n const triggerRef = useRef<HTMLButtonElement>(null);\n const mouseLeaveTimerRef = useRef(null);\n\n const [isOpen, setIsOpen] = useState(false);\n const handleOpen = useCallback(() => {\n setIsOpen(true);\n window.clearTimeout(mouseLeaveTimerRef.current);\n\n onOpen?.();\n }, [onOpen]);\n const handleClose = useCallback(() => {\n setIsOpen(false);\n window.clearTimeout(mouseLeaveTimerRef.current);\n\n onClose?.();\n }, [onClose]);\n const closeAndFocusTrigger = useCallback(() => {\n handleClose();\n triggerRef.current?.focus({ preventScroll: true });\n }, [handleClose]);\n\n useEffect(() => {\n // close when parent menu closed\n if (isParentMenuOpen === false) {\n setIsOpen(false);\n }\n }, [isParentMenuOpen]);\n\n const contextValue: SubmenuContextType = useMemo(\n () => ({\n isOpen,\n getSubmenuListProps: (_props) => ({\n 'data-parent-menu': menuId,\n onMouseOver: (event) => {\n handleOpen();\n\n _props.onMouseOver?.(event);\n },\n onMouseLeave: (event) => {\n closeAndFocusTrigger();\n\n _props.onMouseLeave?.(event);\n },\n }),\n getSubmenuTriggerProps: (_props, _ref) => ({\n ref: mergeRefs(triggerRef, _ref),\n onKeyDown: (event) => {\n if (event.key === 'ArrowRight') {\n event.preventDefault();\n handleOpen();\n }\n\n _props.onKeyDown?.(event);\n },\n onMouseOver: (event) => {\n handleOpen();\n\n _props.onMouseOver?.(event);\n },\n onMouseLeave: (event) => {\n mouseLeaveTimerRef.current = window.setTimeout(\n closeAndFocusTrigger,\n 300,\n );\n\n _props.onMouseLeave?.(event);\n },\n }),\n }),\n [isOpen, menuId, handleOpen, closeAndFocusTrigger],\n );\n\n return (\n <SubmenuContextProvider value={contextValue}>\n <Menu\n {...propsToPropagateToSubmenus}\n {...otherProps}\n isOpen={isOpen}\n onClose={handleClose}\n onOpen={handleOpen}\n placement={placement}\n isAutoalignmentEnabled={isAutoalignmentEnabled}\n offset={SUBMENU_OFFSET}\n />\n </SubmenuContextProvider>\n );\n};\n","import React from 'react';\nimport { MenuTrigger } from '../MenuTrigger/MenuTrigger';\nimport { MenuItem, MenuItemProps } from '../MenuItem/MenuItem';\nimport { useSubmenuContext } from '../SubmenuContext';\nimport { CaretRightIcon } from '@contentful/f36-icons';\nimport type { ExpandProps } from '@contentful/f36-core';\nimport { cx } from 'emotion';\nimport { getSubmenuTriggerStyles } from './SubmenuTrigger.styles';\n\nexport type SubmenuTriggerProps = Omit<\n MenuItemProps<'button'>,\n 'isInitiallyFocused' | 'as'\n>;\n\nconst _SubmenuTrigger = (\n props: ExpandProps<SubmenuTriggerProps>,\n ref: React.Ref<HTMLButtonElement>,\n) => {\n const { className, children } = props;\n const { getSubmenuTriggerProps, isOpen } = useSubmenuContext();\n\n const styles = getSubmenuTriggerStyles();\n\n return (\n <MenuTrigger>\n <MenuItem\n {...props}\n {...getSubmenuTriggerProps(props, 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(_SubmenuTrigger);\n","import { css } from 'emotion';\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 { 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","closeOnEsc","closeOnBlur","closeOnSelect","autoFocus","elementsRef","labelsRef","tree","useFloatingTree","nodeId","useFloatingNodeId","parentId","useFloatingParentNodeId","item","useListItem","parent","isNested","isControlled","uncontrolledIsOpen","setUncontrolledIsOpen","isOpen","prevOpenRef","handleOpenChange","nextOpen","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","w","_a","ref","_b","children","otherProps","__objRest","menuContext","__spreadValues","FloatingNode","Menu","props","resolvedPlacement","content","__spreadProps","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","getMenuItemStyles","isDisabled","globalGetMenuItemStyles","MENU_ITEM_DEFAULT_TAG","MenuItemBase","as","isInitiallyFocused","icon","propDisabled","menuItem","id","useId","itemTestId","Element","MenuItem","MenuTrigger","childRef","parentActiveIndex","triggerProps","getMenuDividerStyles","MenuDivider","getMenuSectionTitleStyles","MenuSectionTitle","Caption","Submenu","getSubmenuTriggerStyles","SubmenuTriggerBase","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 } 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;\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 (nextOpen: boolean) => {\n const wasOpen = prevOpenRef.current;\n\n if (nextOpen === wasOpen) {\n return;\n }\n if (!isControlled) {\n setUncontrolledIsOpen(nextOpen);\n }\n if (nextOpen && !wasOpen) {\n onOpen?.();\n } else if (!nextOpen && wasOpen) {\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 ancestorScroll: true,\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 { FloatingNode } from '@floating-ui/react';\nimport * as React from 'react';\n\nimport { useMenu } from './useMenu';\nimport { MenuContextProvider } from './MenuContext';\nimport type { MenuProps } from './Menu';\n\nexport const MenuComponent = React.forwardRef<\n HTMLDivElement,\n React.PropsWithChildren<MenuProps>\n>(function MenuComponentInner({ children, ...otherProps }, ref) {\n const menuContext = useMenu({ ...otherProps });\n return (\n <MenuContextProvider value={menuContext}>\n <FloatingNode id={menuContext.nodeId}>\n <div ref={ref}>{children}</div>\n </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';\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 = React.forwardRef<\n HTMLDivElement,\n React.PropsWithChildren<MenuProps>\n>(function Menu(props, ref) {\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} ref={ref}>\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<E extends HTMLElement = HTMLElement> {\n children: React.ReactElement<\n Record<string, unknown> & {\n ref?: React.Ref<E>;\n },\n React.ElementType\n >;\n}\n\nexport const MenuTrigger = React.forwardRef<\n HTMLElement,\n MenuTriggerProps & { onFocus?: React.FocusEventHandler<HTMLElement> }\n>(function MenuTrigger({ children, ...otherProps }, 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 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 ? undefined : parentActiveIndex === item.index ? 0 : -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 ...otherProps,\n onFocus(event: React.FocusEvent<HTMLElement>) {\n (\n otherProps as { onFocus?: React.FocusEventHandler<HTMLElement> }\n ).onFocus?.(event);\n setHasFocusInside(false);\n if (parent) parent.setHasFocusInside(true);\n },\n }),\n ),\n };\n\n return React.cloneElement(children, triggerProps);\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,22 +1,26 @@
1
1
  {
2
2
  "name": "@contentful/f36-menu",
3
- "version": "5.5.0",
3
+ "version": "6.0.0-alpha.1",
4
4
  "description": "Forma 36: Menu component",
5
5
  "scripts": {
6
6
  "build": "tsup"
7
7
  },
8
8
  "dependencies": {
9
- "@contentful/f36-core": "^5.5.0",
10
- "@contentful/f36-icons": "^5.5.0",
11
- "@contentful/f36-popover": "^5.5.0",
12
- "@contentful/f36-tokens": "^5.1.0",
13
- "@contentful/f36-typography": "^5.5.0",
14
- "@contentful/f36-utils": "^5.1.0",
15
- "emotion": "^10.0.17"
9
+ "@contentful/f36-core": "^6.0.0-alpha.0",
10
+ "@contentful/f36-icons": "^6.0.0-alpha.0",
11
+ "@contentful/f36-popover": "^6.0.0-alpha.0",
12
+ "@contentful/f36-tokens": "^6.0.0-alpha.0",
13
+ "@contentful/f36-typography": "^6.0.0-alpha.0",
14
+ "@contentful/f36-utils": "^6.0.0-alpha.0",
15
+ "@emotion/css": "^11.13.5",
16
+ "@floating-ui/react": "^0.27.16"
17
+ },
18
+ "devDependencies": {
19
+ "react-router-dom": "^7.9.3"
16
20
  },
17
21
  "peerDependencies": {
18
- "react": ">=16.8",
19
- "react-dom": ">=16.8"
22
+ "react": ">=19.1.0",
23
+ "react-dom": ">=19.1.0"
20
24
  },
21
25
  "license": "MIT",
22
26
  "files": [