Skip to content

Commit d0bd7df

Browse files
committed
feat: add text transition
1 parent 22b076d commit d0bd7df

File tree

4 files changed

+28
-36
lines changed

4 files changed

+28
-36
lines changed

app/[lang]/(home)/Hero/StatsSymbol.tsx

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
'use client';
22

33
import type {CSSProperties, ReactElement} from 'react';
4-
import {cloneElement, useEffect, useRef, useState} from 'react';
4+
import {cloneElement, useState} from 'react';
55
import {track} from '@amplitude/analytics-browser';
66
import clsx from 'clsx';
7+
import TextTransition, {presets} from 'react-text-transition';
78

89
import type {StatsInfo} from '../../../../src/fetches/github';
910

@@ -46,11 +47,9 @@ type StatName = (typeof statTypes)[number]['name'];
4647
const PluginStatsInfo = ({
4748
statsInfo,
4849
selectedStatName,
49-
isTransitioning,
5050
}: {
5151
statsInfo: StatsInfo;
5252
selectedStatName: StatName;
53-
isTransitioning: boolean;
5453
}): React.ReactElement => {
5554
const {name, description} = statsInfo[selectedStatName];
5655

@@ -61,22 +60,20 @@ const PluginStatsInfo = ({
6160
'flex-1 flex flex-col relative',
6261
)}
6362
>
64-
<div
65-
className={clsx(
66-
'body1 font-bold mb-3 text-left transition-opacity duration-300',
67-
isTransitioning ? 'opacity-0' : 'opacity-100'
68-
)}
63+
<TextTransition
64+
springConfig={presets.gentle}
65+
direction="down"
66+
className="body1 font-bold mb-3 text-left"
6967
>
7068
{name}
71-
</div>
72-
<div
73-
className={clsx(
74-
'body3 leading-[160%] text-left transition-opacity duration-500',
75-
isTransitioning ? 'opacity-0' : 'opacity-100'
76-
)}
69+
</TextTransition>
70+
<TextTransition
71+
springConfig={presets.wobbly}
72+
direction="down"
73+
className="body3 leading-[160%] text-left"
7774
>
7875
{description}
79-
</div>
76+
</TextTransition>
8077
</div>
8178
);
8279
};
@@ -91,28 +88,12 @@ const StatsSymbols = ({
9188
statsInfo: StatsInfo;
9289
}): ReactElement => {
9390
const [selectedStatName, setSelectedStatName] = useState<StatName>('tree');
94-
const [isTransitioning, setIsTransitioning] = useState(false);
95-
const transitionTimer = useRef<ReturnType<typeof setTimeout> | null>(null);
9691

9792
const pressStat = (type: StatName): void => {
98-
if (transitionTimer.current) {
99-
clearTimeout(transitionTimer.current);
100-
}
101-
102-
setIsTransitioning(true);
103-
transitionTimer.current = setTimeout(() => setIsTransitioning(false), 50);
10493
setSelectedStatName(type);
10594
track('Press Stat Info', {type});
10695
};
10796

108-
useEffect(() => {
109-
return () => {
110-
if (transitionTimer.current) {
111-
clearTimeout(transitionTimer.current);
112-
}
113-
};
114-
}, []);
115-
11697
return (
11798
<div className={`flex flex-col ${className}`} style={style}>
11899
<div className={clsx('max-w-[220px]', 'flex flex-row')}>
@@ -139,7 +120,6 @@ const StatsSymbols = ({
139120
<PluginStatsInfo
140121
selectedStatName={selectedStatName}
141122
statsInfo={statsInfo}
142-
isTransitioning={isTransitioning}
143123
/>
144124
</div>
145125
);

bun.lock

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
"react-hamburger-menu": "^1.2.1",
4444
"react-hook-form": "^7.66.1",
4545
"react-hot-toast": "^2.6.0",
46+
"react-text-transition": "^3.1.0",
4647
"server-only": "^0.0.1",
4748
"tiny-invariant": "^1.3.3",
4849
"typescript": "5.9.3",

styles/output.css

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2376,10 +2376,6 @@ input[type='search']::-webkit-search-decoration,
23762376
transition-duration: 300ms;
23772377
}
23782378

2379-
.duration-500 {
2380-
transition-duration: 500ms;
2381-
}
2382-
23832379
@font-face {
23842380
font-family: 'doobooui';
23852381

0 commit comments

Comments
 (0)