diff --git a/src/renderer/features/lyrics/lyrics.tsx b/src/renderer/features/lyrics/lyrics.tsx index 19e27b70..b09ace89 100644 --- a/src/renderer/features/lyrics/lyrics.tsx +++ b/src/renderer/features/lyrics/lyrics.tsx @@ -6,7 +6,7 @@ import { RiInformationFill } from 'react-icons/ri'; import styled from 'styled-components'; import { useSongLyricsByRemoteId, useSongLyricsBySong } from './queries/lyric-query'; import { SynchronizedLyrics } from './synchronized-lyrics'; -import { ScrollArea, Spinner, TextTitle } from '/@/renderer/components'; +import { Spinner, TextTitle } from '/@/renderer/components'; import { ErrorFallback } from '/@/renderer/features/action-required'; import { UnsynchronizedLyrics } from '/@/renderer/features/lyrics/unsynchronized-lyrics'; import { getServerById, useCurrentSong, usePlayerStore } from '/@/renderer/store'; @@ -53,11 +53,12 @@ const LyricsContainer = styled.div` } `; -const ScrollContainer = styled(motion(ScrollArea))` +const ScrollContainer = styled(motion.div)` position: relative; z-index: 1; + width: 100%; + height: 100%; text-align: center; - transform: translateY(-2rem); mask-image: linear-gradient( 180deg, @@ -182,7 +183,6 @@ export const Lyrics = () => { {isSynchronizedLyrics ? ( diff --git a/src/renderer/features/lyrics/synchronized-lyrics.tsx b/src/renderer/features/lyrics/synchronized-lyrics.tsx index 332ff6ce..170dcdc8 100644 --- a/src/renderer/features/lyrics/synchronized-lyrics.tsx +++ b/src/renderer/features/lyrics/synchronized-lyrics.tsx @@ -16,7 +16,19 @@ import styled from 'styled-components'; const mpvPlayer = isElectron() ? window.electron.mpvPlayer : null; const SynchronizedLyricsContainer = styled.div` + width: 100%; + height: 100%; padding: 5rem 0; + overflow: scroll; + transform: translateY(-2rem); + + mask-image: linear-gradient( + 180deg, + transparent 5%, + rgba(0, 0, 0, 100%) 20%, + rgba(0, 0, 0, 100%) 85%, + transparent 95% + ); `; interface SynchronizedLyricsProps extends Omit { @@ -120,7 +132,10 @@ export const SynchronizedLyrics = ({ return; } - const currentLyric = document.querySelector(`#lyric-${index}`); + const doc = document.getElementById('sychronized-lyrics-scroll-container') as HTMLElement; + const currentLyric = document.querySelector(`#lyric-${index}`) as HTMLElement; + const offsetTop = currentLyric?.offsetTop - doc?.clientHeight / 2 ?? 0; + if (currentLyric === null) { lyricRef.current = undefined; return; @@ -129,7 +144,7 @@ export const SynchronizedLyrics = ({ currentLyric.classList.add('active'); if (followRef.current) { - currentLyric.scrollIntoView({ behavior: 'smooth', block: 'center' }); + doc?.scroll({ behavior: 'smooth', top: offsetTop }); } if (index !== lyricRef.current!.length - 1) { @@ -254,8 +269,23 @@ export const SynchronizedLyrics = ({ timerEpoch.current += 1; }, []); + const hideScrollbar = () => { + const doc = document.getElementById('sychronized-lyrics-scroll-container') as HTMLElement; + doc.classList.add('hide-scrollbar'); + }; + + const showScrollbar = () => { + const doc = document.getElementById('sychronized-lyrics-scroll-container') as HTMLElement; + doc.classList.remove('hide-scrollbar'); + }; + return ( - + {source && (