diff --git a/src/components/layout/Header.jsx b/src/components/layout/Header.jsx index 854e935..dcb7f2f 100644 --- a/src/components/layout/Header.jsx +++ b/src/components/layout/Header.jsx @@ -12,11 +12,101 @@ export const Header = () => { const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const navItems = [ - { path: '/dashboard', label: t('nav.dashboard') }, - { path: '/wallets', label: t('nav.deposits') }, - { path: '/requests', label: t('nav.withdrawals') }, - { path: '/history', label: t('nav.history') }, - { path: '/operational', label: t('nav.operating') }, + { + path: '/dashboard', + label: t('nav.dashboard'), + icon: ( + + + + ), + }, + { + path: '/wallets', + label: t('nav.deposits'), + icon: ( + + + + ), + }, + { + path: '/requests', + label: t('nav.withdrawals'), + icon: ( + + + + ), + }, + { + path: '/history', + label: t('nav.history'), + icon: ( + + + + ), + }, + { + path: '/operational', + label: t('nav.operating'), + icon: ( + + + + ), + }, ]; const handleLanguageChange = (lng) => { @@ -32,7 +122,7 @@ export const Header = () => {
- Winbit + Winbit {user && ( @@ -41,12 +131,13 @@ export const Header = () => { + {item.icon} {item.label} ))} @@ -165,13 +256,14 @@ export const Header = () => { setIsMobileMenuOpen(false)} > + {item.icon} {item.label} ))} diff --git a/src/components/layout/Header.test.jsx b/src/components/layout/Header.test.jsx index 0bfb7fe..0d0eaff 100644 --- a/src/components/layout/Header.test.jsx +++ b/src/components/layout/Header.test.jsx @@ -28,7 +28,7 @@ describe('Header', () => { it('renders logo', () => { useAuth.mockReturnValue({ user: null, logout: vi.fn() }); renderWithRouter(
); - expect(screen.getByText('Winbit')).toBeInTheDocument(); + expect(screen.getByAltText('Winbit')).toBeInTheDocument(); }); it('renders navigation when user is logged in', () => { diff --git a/src/components/ui/Button.jsx b/src/components/ui/Button.jsx index 4638f1d..ac895b0 100644 --- a/src/components/ui/Button.jsx +++ b/src/components/ui/Button.jsx @@ -11,13 +11,13 @@ export const Button = ({ const variants = { primary: - 'bg-[rgba(101,167,165,0.15)] text-[#8dc8bf] border border-[rgba(101,167,165,0.35)] hover:bg-[rgba(101,167,165,0.25)] hover:border-[rgba(101,167,165,0.55)] focus:ring-primary', + 'bg-[rgba(101,167,165,0.2)] text-white border border-[rgba(101,167,165,0.35)] hover:bg-[rgba(101,167,165,0.3)] hover:border-[rgba(101,167,165,0.55)] focus:ring-primary', secondary: - 'bg-[rgba(101,167,165,0.10)] text-[#8dc8bf] border border-[rgba(101,167,165,0.35)] hover:bg-[rgba(101,167,165,0.18)] hover:border-[rgba(101,167,165,0.55)] focus:ring-primary', + 'bg-[rgba(101,167,165,0.1)] text-[#8dc8bf] border border-[rgba(101,167,165,0.35)] hover:bg-[rgba(101,167,165,0.2)] hover:border-[rgba(101,167,165,0.55)] focus:ring-primary', danger: 'bg-[rgba(196,107,107,0.14)] text-[#c46b6b] border border-[rgba(196,107,107,0.18)] hover:bg-[rgba(196,107,107,0.22)] focus:ring-error', outline: - 'bg-[rgba(101,167,165,0.10)] text-[#8dc8bf] border border-[rgba(101,167,165,0.35)] hover:bg-[rgba(101,167,165,0.18)] hover:border-[rgba(101,167,165,0.55)] focus:ring-primary', + 'bg-[rgba(101,167,165,0.1)] text-[#8dc8bf] border border-[rgba(101,167,165,0.35)] hover:bg-[rgba(101,167,165,0.2)] hover:border-[rgba(101,167,165,0.55)] focus:ring-primary', copy: 'btn-copy text-xs focus:ring-primary', }; diff --git a/src/components/ui/ConfirmModal.jsx b/src/components/ui/ConfirmModal.jsx index b38447f..9909acb 100644 --- a/src/components/ui/ConfirmModal.jsx +++ b/src/components/ui/ConfirmModal.jsx @@ -26,10 +26,13 @@ export const ConfirmModal = ({ return (
-
+
{title && ( -

+

{title}

)} @@ -74,14 +77,14 @@ export const ConfirmModal = ({ diff --git a/src/components/ui/Modal.jsx b/src/components/ui/Modal.jsx index 49ce3fa..79c8c97 100644 --- a/src/components/ui/Modal.jsx +++ b/src/components/ui/Modal.jsx @@ -15,30 +15,18 @@ export const Modal = ({ isOpen, onClose, title, message, type = 'info' }) => { if (!isOpen) return null; - const bgColorClass = - type === 'success' - ? 'bg-[rgba(76,175,80,0.15)] border-[rgba(76,175,80,0.3)]' - : type === 'error' - ? 'bg-[rgba(239,83,80,0.15)] border-[rgba(239,83,80,0.3)]' - : 'bg-[rgba(101,167,165,0.15)] border-[rgba(101,167,165,0.3)]'; - const iconColorClass = type === 'success' ? 'text-success' : type === 'error' ? 'text-error' : 'text-primary'; - const buttonColorClass = - type === 'success' - ? 'bg-success hover:bg-success/80 focus:ring-success' - : type === 'error' - ? 'bg-error hover:bg-error/80 focus:ring-error' - : 'bg-primary hover:bg-primary/80 focus:ring-primary'; - return (
- {/* Backdrop */} -
+
{
{title && ( - )} @@ -101,7 +89,7 @@ export const Modal = ({ isOpen, onClose, title, message, type = 'info' }) => { diff --git a/src/index.css b/src/index.css index c533e0f..73f18d5 100644 --- a/src/index.css +++ b/src/index.css @@ -4,10 +4,12 @@ @layer base { body { - background: - radial-gradient(circle at 20% 0%, rgba(101, 167, 165, 0.05) 0%, rgba(101, 167, 165, 0) 40%), - radial-gradient(circle at 80% 100%, rgba(101, 167, 165, 0.03) 0%, rgba(101, 167, 165, 0) 35%), - #0f1113; + background: radial-gradient( + circle at 30% 20%, + rgba(31, 122, 99, 0.25), + rgba(11, 15, 14, 1) 60% + ); + background-color: #0b0f0e; color: #e8e8e8; font-family: 'Montserrat', @@ -21,18 +23,20 @@ input, select, textarea { - background: rgba(15, 18, 18, 0.8); - border: 1px solid rgba(255, 255, 255, 0.08); + background: #121716; + color: #ffffff; + border: 1px solid rgba(101, 167, 165, 0.25); border-radius: 0.5rem; padding: 0.75rem 1rem; - color: #e8e8e8; font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, sans-serif; font-size: 0.95rem; - transition: border-color 0.2s ease; + transition: + border-color 0.2s ease, + box-shadow 0.2s ease; } input::placeholder, @@ -45,8 +49,8 @@ select:focus, textarea:focus { outline: none; - border-color: rgba(101, 167, 165, 0.5); - box-shadow: 0 0 0 2px rgba(101, 167, 165, 0.15); + border-color: #65a7a5; + box-shadow: 0 0 0 1px rgba(101, 167, 165, 0.3); } } @@ -56,39 +60,80 @@ } .winbit-card { - background: linear-gradient(180deg, rgba(18, 24, 24, 0.92) 0%, rgba(15, 18, 18, 0.96) 100%); - border: 1px solid rgba(101, 167, 165, 0.22); + background: rgba(20, 20, 20, 0.6); + backdrop-filter: blur(14px); + -webkit-backdrop-filter: blur(14px); + border: 1px solid rgba(101, 167, 165, 0.25); border-radius: 8px; - padding: 28px 26px; + padding: 32px 30px; box-shadow: - inset 3px 0 0 rgba(101, 167, 165, 0.22), - 0 10px 28px rgba(0, 0, 0, 0.22); + inset 0 0 0 1px rgba(255, 255, 255, 0.02), + 0 10px 30px rgba(0, 0, 0, 0.35); + transition: + transform 0.2s ease, + box-shadow 0.2s ease; + } + + .winbit-card:hover { + transform: translateY(-2px); + box-shadow: + inset 0 0 0 1px rgba(255, 255, 255, 0.03), + 0 14px 36px rgba(0, 0, 0, 0.4); } .winbit-card--highlight { - background: linear-gradient(180deg, rgba(28, 40, 40, 0.94) 0%, rgba(20, 28, 28, 0.98) 100%); - border: 1px solid rgba(101, 167, 165, 0.32); + background: rgba(20, 20, 20, 0.6); + backdrop-filter: blur(14px); + -webkit-backdrop-filter: blur(14px); + border: 1px solid rgba(101, 167, 165, 0.35); border-radius: 8px; - padding: 28px 26px; + padding: 32px 30px; + box-shadow: + inset 0 0 0 1px rgba(255, 255, 255, 0.03), + 0 12px 32px rgba(0, 0, 0, 0.38); + transition: + transform 0.2s ease, + box-shadow 0.2s ease; + } + + .winbit-card--highlight:hover { + transform: translateY(-2px); box-shadow: - inset 4px 0 0 rgba(101, 167, 165, 0.3), - 0 12px 30px rgba(0, 0, 0, 0.24); + inset 0 0 0 1px rgba(255, 255, 255, 0.04), + 0 16px 40px rgba(0, 0, 0, 0.42); } .winbit-card--compact { - background: linear-gradient(180deg, rgba(18, 24, 24, 0.92) 0%, rgba(15, 18, 18, 0.96) 100%); - border: 1px solid rgba(101, 167, 165, 0.22); + background: rgba(20, 20, 20, 0.6); + backdrop-filter: blur(14px); + -webkit-backdrop-filter: blur(14px); + border: 1px solid rgba(101, 167, 165, 0.25); border-radius: 8px; - padding: 20px 22px; + padding: 24px 26px; + box-shadow: + inset 0 0 0 1px rgba(255, 255, 255, 0.02), + 0 10px 30px rgba(0, 0, 0, 0.35); + transition: + transform 0.2s ease, + box-shadow 0.2s ease; + } + + .winbit-card--compact:hover { + transform: translateY(-2px); box-shadow: - inset 3px 0 0 rgba(101, 167, 165, 0.22), - 0 10px 28px rgba(0, 0, 0, 0.22); + inset 0 0 0 1px rgba(255, 255, 255, 0.03), + 0 14px 36px rgba(0, 0, 0, 0.4); + } + + .card-inner { + background: rgba(255, 255, 255, 0.02); + border-radius: 6px; + padding: 16px; } .section-subtitle { color: #65a7a5; padding-bottom: 8px; - border-bottom: 1px solid rgba(101, 167, 165, 0.35); font-size: 0.95rem; margin-top: 4px; } @@ -133,11 +178,12 @@ } .row-negative { - background: rgba(196, 107, 107, 0.1); + color: #d16b6b; + background: rgba(209, 107, 107, 0.08); } .row-negative:hover { - background: rgba(196, 107, 107, 0.16); + background: rgba(209, 107, 107, 0.14); } .row-fee { @@ -150,7 +196,7 @@ .btn-copy { background: rgba(101, 167, 165, 0.1); - border: 1px solid rgba(101, 167, 165, 0.35); + border: 1px solid rgba(101, 167, 165, 0.4); color: #8dc8bf; border-radius: 6px; padding: 8px 16px; diff --git a/src/pages/DashboardPage.jsx b/src/pages/DashboardPage.jsx index 5d1ce0c..fc49077 100644 --- a/src/pages/DashboardPage.jsx +++ b/src/pages/DashboardPage.jsx @@ -442,7 +442,7 @@ export const DashboardPage = () => { } return ( -
+

{t('dashboard.welcomeBack', { name: formatName(data.name) })} @@ -451,7 +451,7 @@ export const DashboardPage = () => {

{/* Row 1: Valor del portfolio + Capital invertido */} -
+
{
{/* Row 2: Resultado histórico (%) + Resultado histórico (USD) */} -
+
{
{/* Row 3: Resultado estrategia actual (%) + Resultado estrategia actual (USD) */} -
+
{
-
+
{formatDate(row.date)}
{movementText(row, t)}
diff --git a/tailwind.config.js b/tailwind.config.js index 653a25d..8abb1d3 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -10,8 +10,8 @@ export default { 'accent-dim': 'rgba(101, 167, 165, 0.15)', 'accent-glow': 'rgba(101, 167, 165, 0.3)', dark: { - bg: '#0d0f10', - card: 'rgba(20, 20, 20, 0.5)', + bg: '#0B0F0E', + card: 'rgba(20, 20, 20, 0.6)', section: 'rgba(20, 20, 20, 0.55)', }, 'text-primary': '#e8e8e8',