fix: input alignment
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
.footer {
|
||||
background: #1a1a1a;
|
||||
border-top: 1px solid #2a2a2a;
|
||||
padding: 0.75rem 1.5rem;
|
||||
}
|
||||
|
||||
.footer-content {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.footer-left {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.footer-brand {
|
||||
font-size: 0.9rem;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
.footer-copyright {
|
||||
font-size: 0.8rem;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.footer-stats {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.5rem 1rem;
|
||||
background: rgba(100, 181, 246, 0.1);
|
||||
border: 1px solid rgba(100, 181, 246, 0.2);
|
||||
border-radius: 20px;
|
||||
text-decoration: none;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.footer-stats:hover {
|
||||
background: rgba(100, 181, 246, 0.15);
|
||||
border-color: rgba(100, 181, 246, 0.3);
|
||||
}
|
||||
|
||||
.stats-icon {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
.stats-label {
|
||||
font-size: 0.8rem;
|
||||
color: #888;
|
||||
}
|
||||
|
||||
.stats-value {
|
||||
font-size: 0.9rem;
|
||||
font-weight: 600;
|
||||
color: #64b5f6;
|
||||
}
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.footer-content {
|
||||
flex-direction: column;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.footer-stats {
|
||||
width: 100%;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import { Link } from "react-router-dom";
|
||||
import { useAuth } from "../contexts/AuthContext";
|
||||
import { getAdminStats } from "../services/api";
|
||||
import "./Footer.css";
|
||||
|
||||
export function Footer() {
|
||||
const { isAuthenticated } = useAuth();
|
||||
const [totalTokens, setTotalTokens] = useState<number | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
const loadStats = async () => {
|
||||
if (!isAuthenticated) return;
|
||||
const stats = await getAdminStats();
|
||||
if (stats) {
|
||||
setTotalTokens(stats.totalTokens);
|
||||
}
|
||||
};
|
||||
loadStats();
|
||||
}, [isAuthenticated]);
|
||||
|
||||
const formatTokens = (tokens: number) => {
|
||||
if (tokens >= 1000000) return `${(tokens / 1000000).toFixed(2)}M`;
|
||||
if (tokens >= 1000) return `${(tokens / 1000).toFixed(1)}K`;
|
||||
return tokens.toString();
|
||||
};
|
||||
|
||||
return (
|
||||
<footer className="footer">
|
||||
<div className="footer-content">
|
||||
<div className="footer-left">
|
||||
<span className="footer-brand">⚔️ ReSekai</span>
|
||||
<span className="footer-copyright">© 2026</span>
|
||||
</div>
|
||||
|
||||
{isAuthenticated && (
|
||||
<Link to="/admin" className="footer-stats">
|
||||
<span className="stats-icon">📊</span>
|
||||
<span className="stats-label">Токенов:</span>
|
||||
<span className="stats-value">
|
||||
{totalTokens !== null ? formatTokens(totalTokens) : "..."}
|
||||
</span>
|
||||
</Link>
|
||||
)}
|
||||
</div>
|
||||
</footer>
|
||||
);
|
||||
}
|
||||
@@ -26,9 +26,6 @@ export function Header() {
|
||||
<Link to="/characters" className="nav-link">
|
||||
Персонажи
|
||||
</Link>
|
||||
<Link to="/admin" className="nav-link">
|
||||
📊 Статистика
|
||||
</Link>
|
||||
</>
|
||||
)}
|
||||
</nav>
|
||||
|
||||
Reference in New Issue
Block a user