diff --git a/packages/react-components/react-menu/etc/react-menu.api.md b/packages/react-components/react-menu/etc/react-menu.api.md index 23bfa9a0f8b375..959621ec32a767 100644 --- a/packages/react-components/react-menu/etc/react-menu.api.md +++ b/packages/react-components/react-menu/etc/react-menu.api.md @@ -34,7 +34,7 @@ export type MenuCheckedValueChangeData = { export type MenuCheckedValueChangeEvent = React_2.MouseEvent | React_2.KeyboardEvent; // @public -export type MenuContextValue = Pick & { +export type MenuContextValue = Pick & { open: boolean; triggerId: string; defaultCheckedValues?: Record; @@ -282,6 +282,7 @@ export type MenuPopoverSlots = { // @public export type MenuPopoverState = ComponentState & { inline: boolean; + autoSize: boolean; }; // @public @@ -335,6 +336,7 @@ export type MenuState = ComponentState & Required; onOpenChange?: (e: MenuOpenEvent, data: MenuOpenChangeData) => void; defaultCheckedValues?: Record; + autoSize: boolean; }; // @public diff --git a/packages/react-components/react-menu/src/components/Menu/Menu.types.ts b/packages/react-components/react-menu/src/components/Menu/Menu.types.ts index 252bc37bfafd83..9bd127985cef72 100644 --- a/packages/react-components/react-menu/src/components/Menu/Menu.types.ts +++ b/packages/react-components/react-menu/src/components/Menu/Menu.types.ts @@ -163,6 +163,8 @@ export type MenuState = ComponentState & * the signature remains just to avoid breaking changes */ defaultCheckedValues?: Record; + + autoSize: boolean; }; export type MenuContextValues = { diff --git a/packages/react-components/react-menu/src/components/Menu/useMenu.tsx b/packages/react-components/react-menu/src/components/Menu/useMenu.tsx index a8492c9de0d054..fa0c2c38458a01 100644 --- a/packages/react-components/react-menu/src/components/Menu/useMenu.tsx +++ b/packages/react-components/react-menu/src/components/Menu/useMenu.tsx @@ -113,6 +113,7 @@ export const useMenu_unstable = (props: MenuProps): MenuState => { checkedValues, onCheckedValueChange, persistOnItemClick, + autoSize: !!positioningState.autoSize, }; }; diff --git a/packages/react-components/react-menu/src/components/Menu/useMenuContextValues.ts b/packages/react-components/react-menu/src/components/Menu/useMenuContextValues.ts index 01296281af5893..c750f8f55d808e 100644 --- a/packages/react-components/react-menu/src/components/Menu/useMenuContextValues.ts +++ b/packages/react-components/react-menu/src/components/Menu/useMenuContextValues.ts @@ -16,6 +16,7 @@ export function useMenuContextValues_unstable(state: MenuState): MenuContextValu setOpen, triggerId, triggerRef, + autoSize, } = state; // This context is created with "@fluentui/react-context-selector", these is no sense to memoize it @@ -34,6 +35,7 @@ export function useMenuContextValues_unstable(state: MenuState): MenuContextValu setOpen, triggerId, triggerRef, + autoSize, }; return { menu }; diff --git a/packages/react-components/react-menu/src/components/MenuPopover/MenuPopover.types.ts b/packages/react-components/react-menu/src/components/MenuPopover/MenuPopover.types.ts index 14909539952830..22cc3182de5db4 100644 --- a/packages/react-components/react-menu/src/components/MenuPopover/MenuPopover.types.ts +++ b/packages/react-components/react-menu/src/components/MenuPopover/MenuPopover.types.ts @@ -18,4 +18,6 @@ export type MenuPopoverState = ComponentState & { * This option is disregarded for submenus */ inline: boolean; + + autoSize: boolean; }; diff --git a/packages/react-components/react-menu/src/components/MenuPopover/useMenuPopover.ts b/packages/react-components/react-menu/src/components/MenuPopover/useMenuPopover.ts index dbc2a5ab1ebbea..3e57d978f5bd89 100644 --- a/packages/react-components/react-menu/src/components/MenuPopover/useMenuPopover.ts +++ b/packages/react-components/react-menu/src/components/MenuPopover/useMenuPopover.ts @@ -21,6 +21,7 @@ export const useMenuPopover_unstable = (props: MenuPopoverProps, ref: React.Ref< const setOpen = useMenuContext_unstable(context => context.setOpen); const open = useMenuContext_unstable(context => context.open); const openOnHover = useMenuContext_unstable(context => context.openOnHover); + const autoSize = useMenuContext_unstable(context => context.autoSize); const isSubmenu = useIsSubmenu(); const canDispatchCustomEventRef = React.useRef(true); const throttleDispatchTimerRef = React.useRef(0); @@ -96,5 +97,6 @@ export const useMenuPopover_unstable = (props: MenuPopoverProps, ref: React.Ref< root: 'div', }, root: rootProps, + autoSize, }; }; diff --git a/packages/react-components/react-menu/src/components/MenuPopover/useMenuPopoverStyles.ts b/packages/react-components/react-menu/src/components/MenuPopover/useMenuPopoverStyles.ts index a53b6ce1668468..9ca4e1244aea57 100644 --- a/packages/react-components/react-menu/src/components/MenuPopover/useMenuPopoverStyles.ts +++ b/packages/react-components/react-menu/src/components/MenuPopover/useMenuPopoverStyles.ts @@ -20,6 +20,11 @@ const useStyles = makeStyles({ ...shorthands.border('1px', 'solid', tokens.colorTransparentStroke), ...typographyStyles.body1, }, + + autoSize: { + overflowX: 'auto', + overflowY: 'auto', + }, }); /** @@ -27,6 +32,11 @@ const useStyles = makeStyles({ */ export const useMenuPopoverStyles_unstable = (state: MenuPopoverState): MenuPopoverState => { const styles = useStyles(); - state.root.className = mergeClasses(menuPopoverClassNames.root, styles.root, state.root.className); + state.root.className = mergeClasses( + menuPopoverClassNames.root, + styles.root, + state.root.className, + state.autoSize && styles.autoSize, + ); return state; }; diff --git a/packages/react-components/react-menu/src/contexts/menuContext.ts b/packages/react-components/react-menu/src/contexts/menuContext.ts index 263084872be8be..15e0780b098e66 100644 --- a/packages/react-components/react-menu/src/contexts/menuContext.ts +++ b/packages/react-components/react-menu/src/contexts/menuContext.ts @@ -22,6 +22,7 @@ const menuContextDefaultValue: MenuContextValue = { hasCheckmarks: false, inline: false, persistOnItemClick: false, + autoSize: false, }; /** @@ -44,6 +45,7 @@ export type MenuContextValue = Pick< | 'inline' | 'checkedValues' | 'onCheckedValueChange' + | 'autoSize' > & { open: boolean; triggerId: string;