aboutsummaryrefslogtreecommitdiffstats
path: root/src/app/components/LRCPlayer.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/components/LRCPlayer.tsx')
-rw-r--r--src/app/components/LRCPlayer.tsx99
1 files changed, 64 insertions, 35 deletions
diff --git a/src/app/components/LRCPlayer.tsx b/src/app/components/LRCPlayer.tsx
index e691957..e6d9551 100644
--- a/src/app/components/LRCPlayer.tsx
+++ b/src/app/components/LRCPlayer.tsx
@@ -1,8 +1,14 @@
-import React, { CSSProperties, useCallback } from 'react';
-import styled, { css } from 'styled-components';
-import { Lrc, LrcLine } from 'react-lrc';
+import React, { CSSProperties, useCallback } from "react";
+import styled, { css } from "styled-components";
+import { Lrc, LrcLine } from "react-lrc";
-const Line = styled.div<{ $active: boolean; $next: boolean }>`
+interface LineProps {
+ $active: boolean;
+ $next: boolean;
+ $animate: boolean;
+}
+
+const Line = styled.div<LineProps>`
min-height: 10px;
padding: 14px 30px;
@@ -10,48 +16,71 @@ const Line = styled.div<{ $active: boolean; $next: boolean }>`
font-family: "Roboto", sans-serif;
font-weight: 500;
text-align: center;
- color: rgb(72,72,72);
+ color: rgb(72, 72, 72);
- background: linear-gradient(to right, rgba(0,0,0,0) 50%, rgb(200, 190, 190) 50%);
+ background: linear-gradient(
+ to right,
+ rgba(0, 0, 0, 0) 50%,
+ rgb(200, 190, 190) 50%
+ );
background-size: 200% 100%;
background-position: right bottom;
- ${({ $active }) => $active && css`
- color: black;
- font-weight: 700;
- background-position: left bottom;
- color: rgb(50, 50, 50);
- `}
+ ${({ $animate }) =>
+ $animate &&
+ css`
+ transition:
+ color 0.3s ease,
+ background-position 0.5s ease;
+ `}
+
+ ${({ $active }) =>
+ $active &&
+ css`
+ color: rgb(50, 50, 50);
+ font-weight: 700;
+ background-position: left bottom;
+ `}
`;
+
const lrcStyle: CSSProperties = {
- flex: 1,
- minHeight: 0,
- overflow: 'hidden !important'
+ flex: 1,
+ minHeight: 0,
+ overflow: "hidden !important",
};
interface LrcPlayerProps {
- currentMillisecond: number;
- lrc: string;
+ currentMillisecond: number;
+ lrc: string;
+ animate: boolean;
}
-const LrcPlayer: React.FC<LrcPlayerProps> = ({ currentMillisecond, lrc }) => {
- const lineRenderer = useCallback(
- ({ active, line: { content } }: { active: boolean; line: LrcLine }) => {
- const next = active && content === '';
- return <Line $active={active} $next={next}>{content}</Line>;
- },
- []
- );
+const LrcPlayer: React.FC<LrcPlayerProps> = ({
+ currentMillisecond,
+ lrc,
+ animate,
+}) => {
+ const lineRenderer = useCallback(
+ ({ active, line: { content } }: { active: boolean; line: LrcLine }) => {
+ const next = active && content === "";
+ return (
+ <Line $active={active} $next={next} $animate={animate}>
+ {content}
+ </Line>
+ );
+ },
+ [animate],
+ );
- return (
- <Lrc
- lrc={lrc}
- lineRenderer={lineRenderer}
- currentMillisecond={currentMillisecond}
- style={lrcStyle}
- recoverAutoScrollInterval={0}
- />
- );
+ return (
+ <Lrc
+ lrc={lrc}
+ lineRenderer={lineRenderer}
+ currentMillisecond={currentMillisecond}
+ style={lrcStyle}
+ recoverAutoScrollInterval={0}
+ />
+ );
};
-export default LrcPlayer; \ No newline at end of file
+export default LrcPlayer;
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage