1010 * governing permissions and limitations under the License.
1111 */
1212
13- import { ButtonRenderProps , Button as RACButton , ButtonProps as RACButtonProps , Provider , Link , LinkProps } from 'react-aria-components' ;
13+ import { ButtonRenderProps , Button as RACButton , ButtonProps as RACButtonProps , Provider , Link , LinkProps , OverlayTriggerStateContext } from 'react-aria-components' ;
1414import { FocusableRef } from '@react-types/shared' ;
1515import { style , baseColor , fontRelative } from '../style/spectrum-theme' with { type : 'macro' } ;
1616import { StyleProps , centerPadding , focusRing , getAllowedOverrides } from './style-utils' with { type : 'macro' } ;
@@ -279,6 +279,7 @@ function Button(props: ButtonProps, ref: FocusableRef<HTMLButtonElement>) {
279279 let domRef = useFocusableRef ( ref ) ;
280280 let ctx = useContext ( ButtonContext ) ;
281281 props = mergeProps ( ctx , props ) ;
282+ let overlayTriggerState = useContext ( OverlayTriggerStateContext ) ;
282283
283284 return (
284285 < RACButton
@@ -287,6 +288,8 @@ function Button(props: ButtonProps, ref: FocusableRef<HTMLButtonElement>) {
287288 style = { pressScale ( domRef , props . UNSAFE_style ) }
288289 className = { renderProps => ( props . UNSAFE_className || '' ) + button ( {
289290 ...renderProps ,
291+ // Retain hover styles when an overlay is open.
292+ isHovered : renderProps . isHovered || overlayTriggerState ?. isOpen || false ,
290293 variant : props . variant || 'primary' ,
291294 fillStyle : props . fillStyle || 'fill' ,
292295 size : props . size || 'M' ,
@@ -318,6 +321,7 @@ function LinkButton(props: LinkButtonProps, ref: FocusableRef<HTMLAnchorElement>
318321 let domRef = useFocusableRef ( ref ) ;
319322 let ctx = useContext ( ButtonContext ) ;
320323 props = mergeProps ( ctx , props ) ;
324+ let overlayTriggerState = useContext ( OverlayTriggerStateContext ) ;
321325
322326 return (
323327 < Link
@@ -326,6 +330,8 @@ function LinkButton(props: LinkButtonProps, ref: FocusableRef<HTMLAnchorElement>
326330 style = { pressScale ( domRef , props . UNSAFE_style ) }
327331 className = { renderProps => ( props . UNSAFE_className || '' ) + button ( {
328332 ...renderProps ,
333+ // Retain hover styles when an overlay is open.
334+ isHovered : renderProps . isHovered || overlayTriggerState ?. isOpen || false ,
329335 variant : props . variant || 'primary' ,
330336 fillStyle : props . fillStyle || 'fill' ,
331337 size : props . size || 'M' ,
0 commit comments