From 3f3540dd2b8fb96006b744a00f5138ff3607677e Mon Sep 17 00:00:00 2001 From: jeffvli Date: Sat, 17 Jan 2026 03:02:05 -0800 Subject: [PATCH] fix mouseover state causing rerender in fullscreen player (#1535) --- .../components/full-screen-player-queue.tsx | 2 +- .../components/full-screen-player.module.css | 23 +++++++++++++ .../player/components/full-screen-player.tsx | 32 ++++--------------- src/shared/components/option/option.tsx | 10 +++--- 4 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/renderer/features/player/components/full-screen-player-queue.tsx b/src/renderer/features/player/components/full-screen-player-queue.tsx index 2f46fed68..8906d7b2f 100644 --- a/src/renderer/features/player/components/full-screen-player-queue.tsx +++ b/src/renderer/features/player/components/full-screen-player-queue.tsx @@ -91,7 +91,7 @@ export const FullScreenPlayerQueue = () => { pos="relative" size="lg" uppercase - variant="subtle" + variant="transparent" > {item.label} diff --git a/src/renderer/features/player/components/full-screen-player.module.css b/src/renderer/features/player/components/full-screen-player.module.css index de3f74301..4bb95166b 100644 --- a/src/renderer/features/player/components/full-screen-player.module.css +++ b/src/renderer/features/player/components/full-screen-player.module.css @@ -10,8 +10,31 @@ @media screen and (orientation: portrait) { padding: 2rem 2rem 1rem; } + + &:hover .controls-container { + [data-variant='subtle'] { + color: var(--theme-colors-foreground); + background: var(--theme-colors-surface); + border: 1px solid transparent; + + &:hover, + &:active, + &:focus-visible { + @mixin dark { + background: lighten(var(--theme-colors-surface), 5%); + } + + @mixin light { + background: lighten(var(--theme-colors-surface), 5%); + } + } + } + + + } } + .responsive-container { display: grid; grid-template-rows: minmax(0, 1fr); diff --git a/src/renderer/features/player/components/full-screen-player.tsx b/src/renderer/features/player/components/full-screen-player.tsx index c1faebab6..e4864b862 100644 --- a/src/renderer/features/player/components/full-screen-player.tsx +++ b/src/renderer/features/player/components/full-screen-player.tsx @@ -220,11 +220,7 @@ const BackgroundImageOverlay = memo( BackgroundImageOverlay.displayName = 'BackgroundImageOverlay'; -interface ControlsProps { - isPageHovered: boolean; -} - -const Controls = ({ isPageHovered }: ControlsProps) => { +const Controls = () => { const { t } = useTranslation(); const { dynamicBackground, @@ -271,6 +267,7 @@ const Controls = ({ isPageHovered }: ControlsProps) => { return ( { iconProps={{ size: 'lg' }} onClick={handleToggleFullScreenPlayer} tooltip={{ label: t('common.minimize', { postProcess: 'titleCase' }) }} - variant={isPageHovered ? 'default' : 'subtle'} + variant="subtle" /> @@ -293,7 +290,7 @@ const Controls = ({ isPageHovered }: ControlsProps) => { icon="settings2" iconProps={{ size: 'lg' }} tooltip={{ label: t('common.configure', { postProcess: 'titleCase' }) }} - variant={isPageHovered ? 'default' : 'subtle'} + variant="subtle" /> @@ -556,7 +553,7 @@ const Controls = ({ isPageHovered }: ControlsProps) => { void; - onMouseLeave: () => void; windowBarStyle: Platform; } const PlayerContainer = memo( - ({ - children, - dynamicBackground, - dynamicIsImage, - onMouseEnter, - onMouseLeave, - windowBarStyle, - }: PlayerContainerProps) => { + ({ children, dynamicBackground, dynamicIsImage, windowBarStyle }: PlayerContainerProps) => { const currentSong = usePlayerSong(); const imageUrl = useItemImageUrl({ id: currentSong?.imageId || undefined, @@ -650,8 +638,6 @@ const PlayerContainer = memo( custom={{ background, dynamicBackground, windowBarStyle }} exit="closed" initial="closed" - onMouseEnter={onMouseEnter} - onMouseLeave={onMouseLeave} transition={{ duration: 2 }} variants={containerVariants} > @@ -672,8 +658,6 @@ export const FullScreenPlayer = () => { const { setStore } = useFullScreenPlayerStoreActions(); const { windowBarStyle } = useWindowSettings(); - const [isPageHovered, setIsPageHovered] = useState(false); - const location = useLocation(); const isOpenedRef = useRef(null); @@ -689,11 +673,9 @@ export const FullScreenPlayer = () => { setIsPageHovered(true)} - onMouseLeave={() => setIsPageHovered(false)} windowBarStyle={windowBarStyle} > - + { +export const Option = ({ children, classNames, ...props }: OptionProps) => { const mergedClassNames = useMemo( () => (classNames ? { ...defaultClassNames, ...classNames } : defaultClassNames), [classNames], @@ -23,7 +23,7 @@ export const Option = memo(({ children, classNames, ...props }: OptionProps) => {children} ); -}); +}; Option.displayName = 'Option'; @@ -43,5 +43,5 @@ const Control = ({ children }: ControlProps) => { return {children}; }; -(Option as typeof Option & { Label: typeof Label }).Label = Label; -(Option as typeof Option & { Control: typeof Control }).Control = Control; +Option.Label = Label; +Option.Control = Control;