Accessibility
UserMenu from @prepared911/ui/user-menu.
button with aria-haspopup="menu", aria-expanded, and aria-controls while open. Its accessible name is triggerLabel, which should name the person. The avatar and the chevron are aria-hidden.group that holds two role="menu" lists with the slider rows between them, in a region neither menu owns (Menu MN-49): the first menu holds the header, the rule and the Appearance rows up to Reduce motion; the region holds Reset layout, Zoom and the Sound section; the second menu holds the rule, any extra items and Sign out. Each menu is named by the trigger too. With no slider the panel is one role="menu". The look and the order on screen are the same either way.groups named by their headings. Sign out is a menuitem; Reduce motion is a menuitemcheckbox with aria-checked whose switch track is aria-hidden and not focusable, so the row is the only control (Enter or Space toggles it and the menu stays open); the Theme control is a group named by its label whose segments are menuitemradio; each preference slider is a group named by its row label with a role="slider" thumb (aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext); Reset layout is a button named "Reset" in the same region as the sliders, so no menu owns it; its visible label and info icon are aria-hidden, and the tooltip text ("Resets all layout customizations to the app default") is the button's accessible description, so it is read once. The tooltip opens on hover over the icon and while the button holds keyboard focus.defaultOpen or open leaves focus where it is.aria-busy="true" and reads signingOutLabel; the spinning loader stops under reduced motion and stays visible.aria-valuetext unless the app uses a separate speech formatter on a custom slider.Highlight and the selected glyph HighlightText.