Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import * as React from 'react';
Copy link
Collaborator

@fabricteam fabricteam Mar 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🕵🏾‍♀️ visual regressions to review in the fluentuiv9 Visual Regression Report

Charts-Legend 3 screenshots
Image Name Diff(in Pixels) Image Type
Charts-Legend.Overflow - RTL.expanded.chromium.png 232 Changed
Charts-Legend.Overflow - Dark Mode.expanded.chromium.png 195 Changed
Charts-Legend.Overflow.expanded.chromium.png 232 Changed
Combobox Converged 6 screenshots
Image Name Diff(in Pixels) Image Type
Combobox Converged.Disabled option.default.chromium.png 56 Changed
Combobox Converged.Disabled option.active option.chromium.png 56 Changed
Combobox Converged.With multiselect selection.default.chromium.png 12 Changed
Combobox Converged.With multiselect selection.hover.chromium.png 12 Changed
Combobox Converged.Disabled option.hover.chromium.png 56 Changed
Combobox Converged.With multiselect selection.active option.chromium.png 12 Changed
Menu 5 screenshots
Image Name Diff(in Pixels) Image Type
Menu.Nested Submenus Small Viewport Stacked.nested menu.chromium.png 684 Changed
Menu.Nested Submenus Small Viewport Flipped.default.chromium.png 645 Changed
Menu.Nested Submenus Small Viewport Flipped.nested menu.chromium.png 684 Changed
Menu.Scrollable Menu Small Viewport.default.chromium.png 259 Changed
Menu.Nested Submenus Small Viewport Stacked.default.chromium.png 645 Changed
Menu Converged - MenuItemLinks 2 screenshots
Image Name Diff(in Pixels) Image Type
Menu Converged - MenuItemLinks.default.chromium.png 645 Changed
Menu Converged - MenuItemLinks.default.hover menuitemlink.chromium.png 657 Changed
Menu Converged - basic 4 screenshots
Image Name Diff(in Pixels) Image Type
Menu Converged - basic.default.hover menuitem.chromium.png 657 Changed
Menu Converged - basic.default - RTL.chromium.png 646 Changed
Menu Converged - basic.default.chromium.png 645 Changed
Menu Converged - basic.default - RTL.hover menuitem.chromium.png 657 Changed
Menu Converged - groups 4 screenshots
Image Name Diff(in Pixels) Image Type
Menu Converged - groups.default - RTL.chromium.png 646 Changed
Menu Converged - groups.default.chromium.png 645 Changed
Menu Converged - groups.default - High Contrast.chromium.png 442 Changed
Menu Converged - groups.default - Dark Mode.chromium.png 542 Changed
Menu Converged - icon slotted content 4 screenshots
Image Name Diff(in Pixels) Image Type
Menu Converged - icon slotted content.default.chromium.png 645 Changed
Menu Converged - icon slotted content.default - RTL.chromium.png 646 Changed
Menu Converged - icon slotted content.default.hover menuitem.chromium.png 657 Changed
Menu Converged - icon slotted content.default - RTL.hover menuitem.chromium.png 657 Changed
Menu Converged - long content 2 screenshots
Image Name Diff(in Pixels) Image Type
Menu Converged - long content.default - RTL.chromium.png 1291 Changed
Menu Converged - long content.default.chromium.png 1291 Changed
Menu Converged - nested submenus 4 screenshots
Image Name Diff(in Pixels) Image Type
Menu Converged - nested submenus.default - RTL.all open.chromium.png 681 Changed
Menu Converged - nested submenus.default.all open.chromium.png 681 Changed
Menu Converged - nested submenus.default - RTL.chromium.png 646 Changed
Menu Converged - nested submenus.default.chromium.png 645 Changed
Menu Converged - secondary content 4 screenshots
Image Name Diff(in Pixels) Image Type
Menu Converged - secondary content.default - RTL.hover menuitem.chromium.png 657 Changed
Menu Converged - secondary content.default - RTL.chromium.png 646 Changed
Menu Converged - secondary content.default.chromium.png 645 Changed
Menu Converged - secondary content.default.hover menuitem.chromium.png 657 Changed
Menu Converged - selection 17 screenshots
Image Name Diff(in Pixels) Image Type
Menu Converged - selection.checkbox - Dark Mode.chromium.png 542 Changed
Menu Converged - selection.checkbox - Dark Mode.selected.chromium.png 570 Changed
Menu Converged - selection.checkbox - High Contrast.chromium.png 442 Changed
Menu Converged - selection.checkbox - High Contrast.selected.chromium.png 585 Changed
Menu Converged - selection.checkbox - RTL.chromium.png 646 Changed
Menu Converged - selection.checkbox.selected.chromium.png 659 Changed
Menu Converged - selection.checkbox - RTL.selected.chromium.png 660 Changed
Menu Converged - selection.checkbox.chromium.png 645 Changed
Menu Converged - selection.switch - High Contrast.chromium.png 544 Changed
Menu Converged - selection.switch - Dark Mode.selected.chromium.png 690 Changed
Menu Converged - selection.selectable with long text.chromium.png 1291 Changed
Menu Converged - selection.switch - High Contrast.selected.chromium.png 823 Changed
Menu Converged - selection.switch - Dark Mode.chromium.png 642 Changed
Menu Converged - selection.switch.chromium.png 765 Changed
Menu Converged - selection.switch - RTL.chromium.png 765 Changed
Menu Converged - selection.switch - RTL.selected.chromium.png 792 Changed
Menu Converged - selection.switch.selected.chromium.png 792 Changed
Menu Converged - selection groups 4 screenshots
Image Name Diff(in Pixels) Image Type
Menu Converged - selection groups.default - RTL.selected.chromium.png 660 Changed
Menu Converged - selection groups.default.selected.chromium.png 659 Changed
Menu Converged - selection groups.default - RTL.chromium.png 646 Changed
Menu Converged - selection groups.default.chromium.png 645 Changed
Menu Converged - split item 4 screenshots
Image Name Diff(in Pixels) Image Type
Menu Converged - split item.default.chromium.png 645 Changed
Menu Converged - split item.default - RTL.chromium.png 646 Changed
Menu Converged - split item.default - RTL.submenu open.chromium.png 654 Changed
Menu Converged - split item.default.submenu open.chromium.png 654 Changed
Menu Converged - submenuIndicator slotted content 4 screenshots
Image Name Diff(in Pixels) Image Type
Menu Converged - submenuIndicator slotted content.default - RTL.submenus open.chromium.png 669 Changed
Menu Converged - submenuIndicator slotted content.default - RTL.chromium.png 646 Changed
Menu Converged - submenuIndicator slotted content.default.chromium.png 645 Changed
Menu Converged - submenuIndicator slotted content.default.submenus open.chromium.png 669 Changed
Menu Multiline items 4 screenshots
Image Name Diff(in Pixels) Image Type
Menu Multiline items.default - RTL.chromium.png 1291 Changed
Menu Multiline items.default.hover menuitem.chromium.png 1342 Changed
Menu Multiline items.default.chromium.png 1291 Changed
Menu Multiline items.default - RTL.hover menuitem.chromium.png 1342 Changed
Menu nested within a MenuTrigger 2 screenshots
Image Name Diff(in Pixels) Image Type
Menu nested within a MenuTrigger.default.chromium.png 645 Changed
Menu nested within a MenuTrigger.default.submenu open.chromium.png 683 Changed
Shadow DOM 1 screenshots
Image Name Diff(in Pixels) Image Type
Shadow DOM.Portal.normal.chromium.png 645 Changed
TagPicker 7 screenshots
Image Name Diff(in Pixels) Image Type
TagPicker.default open - Dark Mode.chromium.png 1371 Changed
TagPicker.default open - Dark Mode.default open option mouse down.chromium.png 2061 Changed
TagPicker.grouped - Dark Mode.default.chromium.png 1371 Changed
TagPicker.default open - RTL.default open option mouse down.chromium.png 1439 Changed
TagPicker.default open - High Contrast.chromium.png 12194 Changed
TagPicker.default open.default open option mouse down.chromium.png 1439 Changed
TagPicker.grouped - High Contrast.default.chromium.png 12194 Changed

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🕵🏾‍♀️ visual changes to review in the Visual Change Report

vr-tests-react-components/Avatar Converged 1 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Avatar Converged.badgeMask - RTL.normal.chromium.png 6 Changed
vr-tests-react-components/Charts-Legend 1 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Charts-Legend.Overflow.expanded.chromium.png 238 Changed
vr-tests-react-components/Combobox Converged 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Combobox Converged.Disabled option.active option.chromium.png 57 Changed
vr-tests-react-components/Combobox Converged.With multiselect selection.default.chromium.png 12 Changed
vr-tests-react-components/Menu 4 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu.Nested Submenus Small Viewport Flipped.nested menu.chromium.png 671 Changed
vr-tests-react-components/Menu.Nested Submenus Small Viewport Stacked.default.chromium.png 645 Changed
vr-tests-react-components/Menu.Nested Submenus Small Viewport Stacked.nested menu.chromium.png 670 Changed
vr-tests-react-components/Menu.Scrollable Menu Small Viewport.default.chromium.png 259 Changed
vr-tests-react-components/Menu Converged - icon slotted content 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu Converged - icon slotted content.default - RTL.hover menuitem.chromium.png 658 Changed
vr-tests-react-components/Menu Converged - icon slotted content.default.hover menuitem.chromium.png 657 Changed
vr-tests-react-components/Menu Converged - nested submenus 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu Converged - nested submenus.default - RTL.all open.chromium.png 667 Changed
vr-tests-react-components/Menu Converged - nested submenus.default.all open.chromium.png 668 Changed
vr-tests-react-components/Menu Converged - secondary content 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu Converged - secondary content.default - RTL.hover menuitem.chromium.png 655 Changed
vr-tests-react-components/Menu Converged - secondary content.default.hover menuitem.chromium.png 654 Changed
vr-tests-react-components/Menu Converged - selection 9 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu Converged - selection.checkbox - Dark Mode.selected.chromium.png 574 Changed
vr-tests-react-components/Menu Converged - selection.checkbox - High Contrast.selected.chromium.png 594 Changed
vr-tests-react-components/Menu Converged - selection.checkbox - RTL.selected.chromium.png 657 Changed
vr-tests-react-components/Menu Converged - selection.selectable with long text.chromium.png 1291 Changed
vr-tests-react-components/Menu Converged - selection.checkbox.selected.chromium.png 656 Changed
vr-tests-react-components/Menu Converged - selection.switch - Dark Mode.selected.chromium.png 713 Changed
vr-tests-react-components/Menu Converged - selection.switch - High Contrast.selected.chromium.png 846 Changed
vr-tests-react-components/Menu Converged - selection.switch.chromium.png 777 Changed
vr-tests-react-components/Menu Converged - selection.switch.selected.chromium.png 795 Changed
vr-tests-react-components/Menu Converged - selection groups 3 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu Converged - selection groups.default - RTL.selected.chromium.png 657 Changed
vr-tests-react-components/Menu Converged - selection groups.default.selected.chromium.png 656 Changed
vr-tests-react-components/Menu Converged - selection groups.default.chromium.png 645 Changed
vr-tests-react-components/Menu Converged - split item 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu Converged - split item.default - RTL.submenu open.chromium.png 654 Changed
vr-tests-react-components/Menu Converged - split item.default.submenu open.chromium.png 654 Changed
vr-tests-react-components/Menu Converged - submenuIndicator slotted content 3 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu Converged - submenuIndicator slotted content.default - RTL.submenus open.chromium.png 659 Changed
vr-tests-react-components/Menu Converged - submenuIndicator slotted content.default.chromium.png 645 Changed
vr-tests-react-components/Menu Converged - submenuIndicator slotted content.default.submenus open.chromium.png 658 Changed
vr-tests-react-components/Menu Multiline items 3 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu Multiline items.default - RTL.hover menuitem.chromium.png 1336 Changed
vr-tests-react-components/Menu Multiline items.default.chromium.png 1291 Changed
vr-tests-react-components/Menu Multiline items.default.hover menuitem.chromium.png 1337 Changed
vr-tests-react-components/Menu nested within a MenuTrigger 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu nested within a MenuTrigger.default.chromium.png 645 Changed
vr-tests-react-components/Menu nested within a MenuTrigger.default.submenu open.chromium.png 668 Changed
vr-tests-react-components/Positioning 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Positioning.Positioning end.chromium.png 857 Changed
vr-tests-react-components/Positioning.Positioning end.updated 2 times.chromium.png 601 Changed
vr-tests-react-components/Shadow DOM 1 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Shadow DOM.Portal.normal.chromium.png 645 Changed
vr-tests-react-components/TagPicker 7 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/TagPicker.default open - Dark Mode.chromium.png 1359 Changed
vr-tests-react-components/TagPicker.default open - Dark Mode.default open option mouse down.chromium.png 2045 Changed
vr-tests-react-components/TagPicker.default open - High Contrast.chromium.png 12226 Changed
vr-tests-react-components/TagPicker.default open - RTL.default open option mouse down.chromium.png 1435 Changed
vr-tests-react-components/TagPicker.default open.default open option mouse down.chromium.png 1437 Changed
vr-tests-react-components/TagPicker.grouped - Dark Mode.default.chromium.png 1359 Changed
vr-tests-react-components/TagPicker.grouped - High Contrast.default.chromium.png 12226 Changed

There were 38 duplicate changes discarded. Check the build logs for more information.

import { Combobox, Option, makeStyles, useId } from '@fluentui/react-components';
import { Scenario } from './utils';

const useStyles = makeStyles({
root: {
// Stack the label above the field with a gap
display: 'grid',
gridTemplateRows: 'repeat(1fr)',
justifyItems: 'start',
gap: '2px',
maxWidth: '400px',
},
});

const options = [
'Apple',
'Apricot',
'Avocado',
'Banana',
'Blackberry',
'Blueberry',
'Boysenberry',
'Cantaloupe',
'Coconut',
'Currant',
'Date',
'Dragon fruit',
'Fig',
'Grape',
'Grapefruit',
'Honeydew',
'Kiwi',
'Lemon',
'Lime',
'Lychee',
'Mango',
'Mandarin orange',
'Melon',
'Nectarine',
'Olive',
'Orange',
'Papaya',
'Passion Fruit',
'Peach',
'Pear',
'Persimmon',
'Pineapple',
'Plum',
'Pomegranate',
'Raspberry',
'Ramnutan',
'Strawberry',
'Tangerine',
'Watermelon',
];

export const FilteringCombobox: React.FunctionComponent = () => {
const comboId = useId();
const styles = useStyles();

return (
<Scenario pageTitle="Filtering combobox">
<h1>Test 3</h1>
<div>Single State Interaction (Unified Hover/Focus)</div>
<div className={styles.root}>
<label id={comboId}>Favourite fruit to have with ice-cream</label>
<Combobox aria-labelledby={comboId} placeholder="Pick a fruit" positioning={{ autoSize: true }}>
{options.map(option => (
<Option key={option} disabled={option === 'Ferret'}>
{option}
</Option>
))}
</Combobox>
</div>
</Scenario>
);
};
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ Accessibility scenarios are used to validate accessibility of components and dem
- <FullscreenLink content="Menu / Profile menu" parent={parentPath} story="profile-menu" />
- <FullscreenLink content="Menu / Menu with split item" parent={parentPath} story="menu-with-split-item" />

## Component: Combobox (single state)

- <FullscreenLink content="Combobox" parent={parentPath} story="filtering-combobox" />

## Component: Popover

- <FullscreenLink content="Popover / Add people" parent={parentPath} story="add-people-popover" />
Expand Down
139 changes: 56 additions & 83 deletions apps/public-docsite-v9/src/AccessibilityScenarios/Menu.stories.tsx
Original file line number Diff line number Diff line change
@@ -1,99 +1,72 @@
import * as React from 'react';

import {
Menu,
MenuButton,
MenuGroup,
MenuGroupHeader,
MenuItem,
MenuItemCheckbox,
MenuItemRadio,
MenuList,
MenuPopover,
MenuTrigger,
} from '@fluentui/react-components';
import { Menu, MenuButton, MenuItem, MenuList, MenuPopover, MenuTrigger } from '@fluentui/react-components';

import { Scenario } from './utils';

interface StatusSubmenuProps {
checkedValues: Record<string, string[]>;
onChange: OnCheckedValueChangeCallback;
}

const StatusSubmenu: React.FunctionComponent<StatusSubmenuProps> = props => {
const { checkedValues, onChange } = props;

return (
<Menu checkedValues={checkedValues} onCheckedValueChange={onChange}>
<MenuTrigger disableButtonEnhancement>
<MenuItem>Status</MenuItem>
</MenuTrigger>

<MenuPopover>
<MenuList>
<MenuItemRadio name="status" value="online">
Online
</MenuItemRadio>
<MenuItemRadio name="status" value="away">
Away
</MenuItemRadio>
<MenuItemRadio name="status" value="offline" disabled>
Offline
</MenuItemRadio>
</MenuList>
</MenuPopover>
</Menu>
);
};

type OnCheckedValueChangeDataType = {
name: string;
checkedItems: string[];
};

type OnCheckedValueChangeCallback = (
event: React.MouseEvent | React.KeyboardEvent,
data: OnCheckedValueChangeDataType,
) => void;

type ProfileMenuStatus = { status: Array<'online' | 'away' | 'offline'> };

export const ProfileMenu: React.FunctionComponent = () => {
const [statusCheckedValues, setStatusCheckedValues] = React.useState<ProfileMenuStatus>({ status: ['online'] });
const onStatusChange = (
event: React.MouseEvent | React.KeyboardEvent,
{ name, checkedItems }: OnCheckedValueChangeDataType,
) => {
setStatusCheckedValues(state => ({ ...state, [name]: checkedItems }));
};

return (
<Scenario pageTitle="Profile menu">
<Menu>
<h1>Test 1</h1>
<div>Single State Interaction (Unified Hover/Focus)</div>
<Menu positioning={{ autoSize: true }}>
<MenuTrigger disableButtonEnhancement>
<MenuButton>Profile</MenuButton>
<MenuButton>Pick a fruit</MenuButton>
</MenuTrigger>

<MenuPopover>
<MenuList>
<MenuGroup>
<MenuGroupHeader>Information</MenuGroupHeader>
<MenuItem>Help</MenuItem>
</MenuGroup>
<MenuGroup>
<MenuGroupHeader>Settings</MenuGroupHeader>
<MenuItemCheckbox name="settings" value="runAtStartup">
Run at startup
</MenuItemCheckbox>
<MenuItemCheckbox name="settings" value="showNotifications">
Show notifications
</MenuItemCheckbox>
</MenuGroup>
<MenuGroup>
<MenuGroupHeader>Account</MenuGroupHeader>
<StatusSubmenu checkedValues={statusCheckedValues} onChange={onStatusChange} />
<MenuItem>Logout</MenuItem>
</MenuGroup>
<MenuItem>Apple</MenuItem>
<MenuItem>Apricot</MenuItem>
<MenuItem>Avocado</MenuItem>
<MenuItem>Banana</MenuItem>

<Menu>
<MenuTrigger disableButtonEnhancement>
<MenuItem>Berries</MenuItem>
</MenuTrigger>

<MenuPopover>
<MenuList>
<MenuItem>Blackberry</MenuItem>
<MenuItem>Boysenberry</MenuItem>
<MenuItem>Blueberry</MenuItem>
<MenuItem>Strawberry</MenuItem>
<MenuItem>Rapsberry</MenuItem>
<MenuItem>Barry White</MenuItem>
</MenuList>
</MenuPopover>
</Menu>

<MenuItem>Cantaloupe</MenuItem>
<MenuItem>Coconut</MenuItem>
<MenuItem>Currant</MenuItem>
<MenuItem>Dragon Fruit</MenuItem>
<MenuItem>Grape</MenuItem>
<MenuItem>Grapefruit</MenuItem>
<MenuItem>Honeydew</MenuItem>
<MenuItem>Kiwi</MenuItem>
<MenuItem>Lemon</MenuItem>
<MenuItem>Lime</MenuItem>
<MenuItem>Lychee</MenuItem>
<MenuItem>Mango</MenuItem>
<MenuItem>Mandarin Orange</MenuItem>
<MenuItem>Melon</MenuItem>
<MenuItem>Nectarine</MenuItem>
<MenuItem>Olive</MenuItem>
<MenuItem>Orange</MenuItem>
<MenuItem>Papaya</MenuItem>
<MenuItem>Passion Fruit</MenuItem>
<MenuItem>Peach</MenuItem>
<MenuItem>Pear</MenuItem>
<MenuItem>Persimmon</MenuItem>
<MenuItem>Pineapple</MenuItem>
<MenuItem>Plum</MenuItem>
<MenuItem>Pomegranate</MenuItem>
<MenuItem>Raspberry</MenuItem>
<MenuItem>Rambutan</MenuItem>
<MenuItem>Strawberry</MenuItem>
<MenuItem>Watermelon</MenuItem>
</MenuList>
</MenuPopover>
</Menu>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ export { QuestionnaireAboutFoodCheckboxes } from './Checkbox.stories';
export { TicketOrderFormInputs } from './Input.stories';
export { SiteNavigationLinks } from './Link.stories';
export { ProfileMenu } from './Menu.stories';
export { FilteringCombobox } from './Combobox.stories';
export { MenuWithSplitItem } from './MenuSplitGroup.stories';
export { AddPeoplePopover } from './Popover.stories';
export { QuestionnaireAboutTransportationRadios } from './RadioGroup.stories';
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,5 @@ export const Scenario: React.FunctionComponent<{ pageTitle: string }> = ({ pageT
document.title = pageTitle + APP_TITLE_SEPARATOR + APP_TITLE;
}, [pageTitle]);

return (
<div role="main">
<BackLink />
<br />
{children}
</div>
);
return <div role="main">{children}</div>;
};
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import * as React from 'react';
import { getIntrinsicElementProps, useId, useMergedRefs, slot } from '@fluentui/react-utilities';
import { getIntrinsicElementProps, useId, useMergedRefs, slot, useEventCallback } from '@fluentui/react-utilities';
import { useActiveDescendantContext } from '@fluentui/react-aria';
import { CheckmarkFilled, Checkmark12Filled } from '@fluentui/react-icons';
import { useListboxContext_unstable } from '../../contexts/ListboxContext';
import { useSetKeyboardNavigation } from '@fluentui/react-tabster';
import type { OptionValue } from '../../utils/OptionCollection.types';
import type { OptionProps, OptionState } from './Option.types';

Expand Down Expand Up @@ -87,6 +88,14 @@ export const useOption_unstable = (props: OptionProps, ref: React.Ref<HTMLElemen
props.onClick?.(event);
};

const setKeyboardNavigationState = useSetKeyboardNavigation();
const onMouseMove = useEventCallback((e: React.MouseEvent) => {
if (activeDescendantController.active() !== id) {
activeDescendantController.focus(id);
}
setKeyboardNavigationState(false);
});

// register option data with context
React.useEffect(() => {
if (id && optionRef.current) {
Expand Down Expand Up @@ -114,6 +123,7 @@ export const useOption_unstable = (props: OptionProps, ref: React.Ref<HTMLElemen
...semanticProps,
...props,
onClick,
onMouseMove,
}),
{ elementType: 'div' },
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,16 @@ const useStyles = makeStyles({
lineHeight: tokens.lineHeightBase300,
padding: `${tokens.spacingVerticalSNudge} ${tokens.spacingHorizontalS}`,
position: 'relative',
},

':hover': {
active: {
// Add the data-activedescendant attribute styles
'[data-activedescendant]': {
backgroundColor: tokens.colorNeutralBackground1Hover,
color: tokens.colorNeutralForeground1Hover,
[`& .${optionClassNames.checkIcon}`]: shorthands.borderColor(tokens.colorNeutralForeground1Hover),
},

':active': {
backgroundColor: tokens.colorNeutralBackground1Pressed,
color: tokens.colorNeutralForeground1Pressed,
[`& .${optionClassNames.checkIcon}`]: shorthands.borderColor(tokens.colorNeutralForeground1Hover),
},
},

active: {
[`[${ACTIVEDESCENDANT_FOCUSVISIBLE_ATTRIBUTE}]::after`]: {
content: '""',
position: 'absolute',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { useFocusFinders } from '@fluentui/react-tabster';
import { useMenuContext_unstable } from '../../contexts/menuContext';
import { MENU_ENTER_EVENT, useOnMenuMouseEnter } from '../../utils/index';
import { useIsSubmenu } from '../../utils/useIsSubmenu';
import { useMenuListContext_unstable } from '../../contexts/menuListContext';
import type { MenuOpenChangeData, MenuOpenEvent, MenuProps, MenuState } from './Menu.types';

// If it's not possible to position the submenu in smaller viewports, try
Expand Down Expand Up @@ -269,9 +270,17 @@ const useMenuOpenState = (
}, [findFirstFocusable, state.menuPopoverRef]);

const firstMount = useFirstMount();
const mouseInputState = useMenuListContext_unstable(context => context.mouseInputState);

React.useEffect(() => {
if (open) {
focusFirst();
// TODO this should not be called when user is moving the mouse around
// This only applies to submenus
// Submenu should only read this state if it's wrapped by a menulist
// MenuList should set this state
if (!mouseInputState?.isMouseInput()) {
focusFirst();
}
} else {
if (!firstMount) {
if (targetDocument?.activeElement === targetDocument?.body) {
Expand All @@ -287,7 +296,7 @@ const useMenuOpenState = (
}
// firstMount change should not re-run this effect
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [state.triggerRef, state.isSubmenu, open, focusFirst, targetDocument, state.menuPopoverRef]);
}, [state.triggerRef, state.isSubmenu, open, focusFirst, targetDocument, state.menuPopoverRef, mouseInputState]);

return [open, setOpen] as const;
};
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,6 @@ export type MenuItemProps = Omit<ComponentProps<Partial<MenuItemSlots>>, 'conten
};

export type MenuItemState = ComponentState<MenuItemSlots> &
Required<Pick<MenuItemProps, 'disabled' | 'hasSubmenu' | 'persistOnClick'>>;
Required<Pick<MenuItemProps, 'disabled' | 'hasSubmenu' | 'persistOnClick'>> & {
isSubmenuOpen: boolean;
};
Loading
Loading