[menu] Fix focus returning to root when submenus have exit transitions
The key is isFocusInsideFloatingTree needs to be true because sometimes the activeElement is one of the submenu items. However, the isFocusInsideFloatingTree check was faulty because getNodeChildren filters out closed children, but since they have an exit transition, they're closed-but-still-mounted (and the activeElement can be inside them). In this case it shouldn't filter the open children so the contains check can work.
https://github.com/mui/base-ui/blob/11cbf2185d74ce5468263f31828cec0b68ad49c1/packages/react/src/floating-ui-react/components/FloatingFocusManager.tsx#L682-L684
On https://deploy-preview-2171--base-ui.netlify.app/experiments/menu/menu-fully-featured Open root, navigate to the second nested submenu, press Escape. Try it several times since it didn't fail every time previously.
Bundle size report
@base-ui-components/react parsed: ▼-884B(-0.29%) gzip: ▼-152B(-0.16%)
@base-ui-components/react/tabs parsed: 🔺+33B(+0.13%) gzip: 🔺+26B(+0.28%) @base-ui-components/react/menubar parsed: 🔺+31B(+0.15%) gzip: 🔺+33B(+0.42%) @base-ui-components/react/menu parsed: ▼-557B(-0.50%) gzip: ▼-131B(-0.34%) @base-ui-components/react/context-menu parsed: ▼-552B(-0.50%) gzip: ▼-132B(-0.35%) @base-ui-components/react/select parsed: ▼-150B(-0.13%) gzip: 🔺+8B(+0.02%) @base-ui-components/react/collapsible parsed: ▼-127B(-0.75%) gzip: ▼-44B(-0.74%) @base-ui-components/react/popover parsed: ▼-105B(-0.13%) gzip: ▼-5B(-0.02%) @base-ui-components/react/navigation-menu parsed: ▼-89B(-0.10%) gzip: ▼-6B(-0.02%) @base-ui-components/react/preview-card parsed: ▼-89B(-0.16%) gzip: ▼-6B(-0.03%) @base-ui-components/react/tooltip parsed: ▼-89B(-0.14%) gzip: 0B(0.00%) @base-ui-components/react/accordion parsed: ▼-67B(-0.30%) gzip: ▼-35B(-0.45%) @base-ui-components/react/alert-dialog parsed: ▼-55B(-0.11%) gzip: 🔺+2B(+0.01%) @base-ui-components/react/dialog parsed: ▼-55B(-0.11%) gzip: 🔺+5B(+0.03%) @base-ui-components/react/checkbox parsed: ▼-37B(-0.21%) gzip: ▼-6B(-0.09%) @base-ui-components/react/radio parsed: ▼-20B(-0.13%) gzip: ▼-6B(-0.11%) @base-ui-components/react/utils parsed: ▼-20B(-0.26%) gzip: ▼-1B(-0.03%) @base-ui-components/react/slider parsed: ▼-17B(-0.07%) gzip: 🔺+3B(+0.03%) @base-ui-components/react/avatar parsed: 0B(0.00%) gzip: 🔺+2B(+0.07%) @base-ui-components/react/checkbox-group parsed: 0B(0.00%) gzip: 🔺+1B(+0.02%) @base-ui-components/react/direction-provider parsed: 0B(0.00%) gzip: 0B(0.00%) @base-ui-components/react/field parsed: 0B(0.00%) gzip: 🔺+1B(+0.02%) @base-ui-components/react/fieldset parsed: 0B(0.00%) gzip: ▼-1B(-0.05%) @base-ui-components/react/form parsed: 0B(0.00%) gzip: 0B(0.00%) @base-ui-components/react/input parsed: 0B(0.00%) gzip: 🔺+2B(+0.05%) @base-ui-components/react/merge-props parsed: 0B(0.00%) gzip: 0B(0.00%) @base-ui-components/react/meter parsed: 0B(0.00%) gzip: 0B(0.00%) @base-ui-components/react/number-field parsed: 0B(0.00%) gzip: 🔺+4B(+0.04%) @base-ui-components/react/progress parsed: 0B(0.00%) gzip: 0B(0.00%) @base-ui-components/react/radio-group parsed: 0B(0.00%) gzip: 🔺+12B(+0.15%) @base-ui-components/react/scroll-area parsed: 0B(0.00%) gzip: 🔺+4B(+0.07%) @base-ui-components/react/separator parsed: 0B(0.00%) gzip: 0B(0.00%) @base-ui-components/react/switch parsed: 0B(0.00%) gzip: 🔺+1B(+0.02%) @base-ui-components/react/toast parsed: 0B(0.00%) gzip: 🔺+2B(+0.02%) @base-ui-components/react/toggle parsed: 0B(0.00%) gzip: 🔺+1B(+0.03%) @base-ui-components/react/toggle-group parsed: 0B(0.00%) gzip: 🔺+8B(+0.14%) @base-ui-components/react/toolbar parsed: 0B(0.00%) gzip: 🔺+10B(+0.14%) @base-ui-components/react/unstable-no-ssr parsed: 0B(0.00%) gzip: 0B(0.00%) @base-ui-components/react/unstable-use-media-query parsed: 0B(0.00%) gzip: 0B(0.00%) @base-ui-components/react/use-render parsed: 0B(0.00%) gzip: 0B(0.00%)
Generated by :no_entry_sign: dangerJS against 186fd76148eb586897cb1e73ef4d0df1887e8c57
Deploy Preview for base-ui ready!
| Name | Link |
|---|---|
| Latest commit | 186fd76148eb586897cb1e73ef4d0df1887e8c57 |
| Latest deploy log | https://app.netlify.com/projects/base-ui/deploys/6861f48818c0d00008a8411f |
| Deploy Preview | https://deploy-preview-2171--base-ui.netlify.app |
| Preview on mobile | Toggle QR Code...Use your smartphone camera to open QR code link. |
To edit notification comments on pull requests, go to your Netlify project configuration.