Skip to content

Commit b5afabb

Browse files
committed
style: completely redesign GitHub star counter with premium dark style
1 parent f45f4c2 commit b5afabb

File tree

1 file changed

+94
-56
lines changed

1 file changed

+94
-56
lines changed

src/components/GitHubStarCounter.tsx

+94-56
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ const GitHubStarCounter: React.FC<GitHubStarCounterProps> = ({
2828
}) => {
2929
const [starCount, setStarCount] = useState<number | null>(null);
3030
const [loading, setLoading] = useState(true);
31+
const [isHovered, setIsHovered] = useState(false);
3132

3233
useEffect(() => {
3334
const fetchStarCount = async () => {
@@ -99,83 +100,120 @@ const GitHubStarCounter: React.FC<GitHubStarCounterProps> = ({
99100
return count.toString();
100101
};
101102

102-
// 美化后的容器样式
103-
const containerStyle = {
104-
display: 'inline-flex',
103+
// 精美的按钮容器
104+
const buttonStyles = {
105+
display: 'flex',
105106
alignItems: 'center',
106-
justifyContent: 'center',
107-
fontSize: '13px',
108-
color: '#24292e',
109-
cursor: 'pointer',
110-
transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
111107
height: '28px',
112-
borderRadius: '15px',
113-
textDecoration: 'none',
114108
padding: '0 12px',
115-
fontWeight: 500,
116-
border: '1px solid rgba(36, 41, 46, 0.1)',
117-
background: 'linear-gradient(to bottom, #fafbfc, #f6f8fa)',
118-
boxShadow: '0 1px 2px rgba(0, 0, 0, 0.05)',
119-
};
120-
121-
// 悬停样式
122-
const hoverStyle = {
123-
background: 'linear-gradient(to bottom, #f6f8fa, #e1e4e8)',
124-
boxShadow: '0 1px 3px rgba(0, 0, 0, 0.1)',
125-
transform: 'translateY(-1px)',
126-
borderColor: 'rgba(36, 41, 46, 0.2)',
109+
background: isHovered
110+
? 'linear-gradient(135deg, #2b3137 0%, #373e47 100%)'
111+
: 'linear-gradient(135deg, #24292e 0%, #2c3036 100%)',
112+
color: 'white',
113+
border: 'none',
114+
borderRadius: '14px',
115+
fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica',
116+
fontSize: '12px',
117+
fontWeight: 600,
118+
letterSpacing: '0.2px',
119+
transition: 'all 0.2s ease',
120+
boxShadow: isHovered
121+
? '0 4px 8px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(255, 255, 255, 0.06)'
122+
: '0 2px 5px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(255, 255, 255, 0.04)',
123+
cursor: 'pointer',
124+
position: 'relative',
125+
overflow: 'hidden',
126+
transform: isHovered ? 'translateY(-1px)' : 'none',
127+
textDecoration: 'none'
127128
};
128129

129-
// GitHub图标样式
130-
const githubIconStyle = {
131-
fontSize: '16px',
132-
color: '#24292e',
130+
// GitHub 图标样式
131+
const githubIconStyles = {
132+
fontSize: '14px',
133133
marginRight: '4px',
134+
color: 'white',
135+
transition: 'transform 0.2s ease',
136+
transform: isHovered ? 'scale(1.1)' : 'scale(1)',
134137
};
135138

136-
// Star图标样式
137-
const starIconStyle = {
138-
fontSize: '14px',
139-
color: '#f1c40f',
140-
marginRight: '4px',
141-
filter: 'drop-shadow(0px 1px 1px rgba(0, 0, 0, 0.1))',
139+
// 星星图标样式
140+
const starIconStyles = {
141+
color: isHovered ? '#ffdd57' : '#f9d361',
142+
fontSize: '12px',
143+
marginRight: '5px',
144+
marginLeft: '3px',
145+
transition: 'transform 0.3s ease, color 0.3s ease',
146+
transform: isHovered ? 'scale(1.2) rotate(5deg)' : 'scale(1)',
147+
filter: isHovered
148+
? 'drop-shadow(0 0 3px rgba(255, 221, 87, 0.6))'
149+
: 'drop-shadow(0 0 1px rgba(255, 221, 87, 0.3))',
142150
};
143151

144152
// 数字样式
145-
const countStyle = {
153+
const countStyles = {
146154
fontWeight: 600,
147-
color: '#24292e',
155+
color: 'white',
156+
fontSize: '12px',
157+
textShadow: '0px 1px 2px rgba(0, 0, 0, 0.2)',
148158
};
149159

150-
// 加载动画样式
151-
const spinnerStyle = {
152-
margin: '0 5px',
160+
// 加载动画容器样式
161+
const loadingContainerStyles = {
162+
display: 'inline-flex',
163+
alignItems: 'center',
164+
justifyContent: 'center',
165+
marginLeft: '4px',
166+
width: '20px',
167+
height: '16px',
153168
};
154169

170+
// 发光动画样式
171+
const glowStyles = {
172+
position: 'absolute',
173+
top: 0,
174+
left: 0,
175+
right: 0,
176+
height: '100%',
177+
background: 'linear-gradient(90deg, transparent, rgba(255,255,255,0.08), transparent)',
178+
transform: isHovered ? 'translateX(100%)' : 'translateX(-100%)',
179+
transition: 'transform 0.6s ease',
180+
} as React.CSSProperties;
181+
182+
// 按钮文本内容
183+
const buttonText = loading ? (
184+
<div style={loadingContainerStyles}>
185+
<Spin size="small" style={{ transform: 'scale(0.7)' }} />
186+
</div>
187+
) : (
188+
<span style={countStyles}>
189+
{starCount !== null ? formatStarCount(starCount) : '0'}
190+
</span>
191+
);
192+
155193
return (
156-
<Tooltip title="Star us on GitHub" placement="bottom">
157-
<a
194+
<Tooltip
195+
title="Star us on GitHub!"
196+
placement="bottom"
197+
color="#1a1e22"
198+
overlayInnerStyle={{
199+
padding: '8px 10px',
200+
fontSize: '12px',
201+
fontWeight: 500,
202+
borderRadius: '6px'
203+
}}
204+
>
205+
<a
158206
href={`https://github.com/${owner}/${repo}`}
159207
target="_blank"
160208
rel="noopener noreferrer"
161-
style={containerStyle}
162-
onMouseOver={(e) => {
163-
Object.assign(e.currentTarget.style, hoverStyle);
164-
}}
165-
onMouseOut={(e) => {
166-
// 重置为原始样式
167-
Object.assign(e.currentTarget.style, containerStyle);
168-
}}
209+
style={buttonStyles as React.CSSProperties}
210+
onMouseEnter={() => setIsHovered(true)}
211+
onMouseLeave={() => setIsHovered(false)}
169212
>
170-
<GithubOutlined style={githubIconStyle} />
171-
<StarFilled style={starIconStyle} />
172-
{loading ? (
173-
<Spin size="small" style={spinnerStyle} />
174-
) : (
175-
<span style={countStyle}>
176-
{starCount !== null ? formatStarCount(starCount) : '0'}
177-
</span>
178-
)}
213+
<div style={glowStyles} />
214+
<GithubOutlined style={githubIconStyles} />
215+
<StarFilled style={starIconStyles} />
216+
{buttonText}
179217
</a>
180218
</Tooltip>
181219
);

0 commit comments

Comments
 (0)