@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 +1 -12
- package/dist/esm/index.js.map +1 -1
- package/dist/index.d.mts +116 -25
- package/dist/index.d.ts +116 -25
- package/dist/index.js +1 -26
- package/dist/index.js.map +1 -1
- package/package.json +14 -10
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
|
package/dist/esm/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/dist/index.d.mts
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import { PopoverProps } from '@contentful/f36-popover';
|
|
2
1
|
import React from 'react';
|
|
3
|
-
import {
|
|
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
|
-
|
|
6
|
+
type BaseMenuProps = {
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Boolean to determine if the Popover should be the same width as
|
|
9
|
+
* the trigger element
|
|
10
|
+
*
|
|
11
|
+
* @default false
|
|
10
12
|
*/
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
59
|
-
declare const MenuList: React.ForwardRefExoticComponent<Omit<Omit<
|
|
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
|
-
|
|
132
|
+
type MenuListHeaderProps = PropsWithHTMLElement<CommonProps, 'div'>;
|
|
62
133
|
declare const MenuListHeader: React.FC<ExpandProps<MenuListHeaderProps>>;
|
|
63
134
|
|
|
64
|
-
|
|
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
|
-
|
|
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.
|
|
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:
|
|
167
|
+
declare const MenuTrigger: React.ForwardRefExoticComponent<MenuTriggerProps<HTMLElement> & {
|
|
168
|
+
onFocus?: React.FocusEventHandler<HTMLElement>;
|
|
169
|
+
} & React.RefAttributes<HTMLElement>>;
|
|
95
170
|
|
|
96
|
-
|
|
97
|
-
declare const MenuDivider:
|
|
171
|
+
type MenuDividerProps = PropsWithHTMLElement<CommonProps, 'hr'>;
|
|
172
|
+
declare const MenuDivider: {
|
|
173
|
+
(props: ExpandProps<MenuDividerProps>): React.JSX.Element;
|
|
174
|
+
displayName: string;
|
|
175
|
+
};
|
|
98
176
|
|
|
99
|
-
|
|
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
|
-
|
|
103
|
-
|
|
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
|
-
|
|
196
|
+
type SubmenuTriggerProps = Omit<MenuItemProps<'button'>, 'isInitiallyFocused' | 'as'>;
|
|
106
197
|
declare const SubmenuTrigger: React.ForwardRefExoticComponent<SubmenuTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
107
198
|
|
|
108
|
-
|
|
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 {
|
|
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
|
-
|
|
6
|
+
type BaseMenuProps = {
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* Boolean to determine if the Popover should be the same width as
|
|
9
|
+
* the trigger element
|
|
10
|
+
*
|
|
11
|
+
* @default false
|
|
10
12
|
*/
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
59
|
-
declare const MenuList: React.ForwardRefExoticComponent<Omit<Omit<
|
|
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
|
-
|
|
132
|
+
type MenuListHeaderProps = PropsWithHTMLElement<CommonProps, 'div'>;
|
|
62
133
|
declare const MenuListHeader: React.FC<ExpandProps<MenuListHeaderProps>>;
|
|
63
134
|
|
|
64
|
-
|
|
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
|
-
|
|
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.
|
|
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:
|
|
167
|
+
declare const MenuTrigger: React.ForwardRefExoticComponent<MenuTriggerProps<HTMLElement> & {
|
|
168
|
+
onFocus?: React.FocusEventHandler<HTMLElement>;
|
|
169
|
+
} & React.RefAttributes<HTMLElement>>;
|
|
95
170
|
|
|
96
|
-
|
|
97
|
-
declare const MenuDivider:
|
|
171
|
+
type MenuDividerProps = PropsWithHTMLElement<CommonProps, 'hr'>;
|
|
172
|
+
declare const MenuDivider: {
|
|
173
|
+
(props: ExpandProps<MenuDividerProps>): React.JSX.Element;
|
|
174
|
+
displayName: string;
|
|
175
|
+
};
|
|
98
176
|
|
|
99
|
-
|
|
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
|
-
|
|
103
|
-
|
|
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
|
-
|
|
196
|
+
type SubmenuTriggerProps = Omit<MenuItemProps<'button'>, 'isInitiallyFocused' | 'as'>;
|
|
106
197
|
declare const SubmenuTrigger: React.ForwardRefExoticComponent<SubmenuTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
107
198
|
|
|
108
|
-
|
|
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": "
|
|
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": "^
|
|
10
|
-
"@contentful/f36-icons": "^
|
|
11
|
-
"@contentful/f36-popover": "^
|
|
12
|
-
"@contentful/f36-tokens": "^
|
|
13
|
-
"@contentful/f36-typography": "^
|
|
14
|
-
"@contentful/f36-utils": "^
|
|
15
|
-
"emotion": "^
|
|
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": ">=
|
|
19
|
-
"react-dom": ">=
|
|
22
|
+
"react": ">=19.1.0",
|
|
23
|
+
"react-dom": ">=19.1.0"
|
|
20
24
|
},
|
|
21
25
|
"license": "MIT",
|
|
22
26
|
"files": [
|