jashdoshi77's picture
added dark mode
e85ce30
@import url('https://fonts.googleapis.com/css2?family=EB+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400&family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
/* ═══════════════════════════════════════════════════════════════════════
QuantHedge Design System β€” Institutional Light Theme
Inspired by JP Morgan, Morgan Stanley, BlackRock
═══════════════════════════════════════════════════════════════════════ */
:root {
--bg-primary: #ffffff;
--bg-secondary: #f8f9fa;
--bg-tertiary: #f0f2f5;
--bg-card: #ffffff;
--bg-glass: rgba(255, 255, 255, 0.92);
--bg-hover: rgba(0, 82, 65, 0.04);
--bg-dark: #0c1f1a;
--bg-dark-secondary: #132b24;
--text-primary: #1a1a1a;
--text-secondary: #4a5568;
--text-muted: #8892a4;
--text-accent: #005241;
--text-on-dark: #f0f4f2;
--text-on-dark-muted: #a3b8b0;
--accent: #005241;
--accent-light: #007d63;
--accent-lighter: #e6f2ef;
--accent-dark: #003d31;
--accent-gold: #b8860b;
--accent-gold-light: #d4a843;
--green-positive: #0a8f5c;
--red-negative: #c23030;
--amber-neutral: #b8860b;
--blue-info: #1a5276;
--gradient-accent: linear-gradient(135deg, #005241, #007d63);
--gradient-dark: linear-gradient(135deg, #0c1f1a 0%, #1a3a2e 50%, #0c1f1a 100%);
--gradient-hero-overlay: linear-gradient(180deg, rgba(12,31,26,0.85) 0%, rgba(12,31,26,0.7) 50%, rgba(12,31,26,0.9) 100%);
--gradient-card-hover: linear-gradient(145deg, rgba(0,82,65,0.02), rgba(0,82,65,0.06));
--border-color: #e2e5ea;
--border-subtle: #eef0f3;
--border-accent: rgba(0, 82, 65, 0.2);
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.06);
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08);
--shadow-lg: 0 8px 30px rgba(0, 0, 0, 0.1);
--shadow-card: 0 1px 3px rgba(0,0,0,0.04), 0 1px 2px rgba(0,0,0,0.06);
--shadow-card-hover: 0 10px 40px rgba(0, 0, 0, 0.08);
--radius-sm: 4px;
--radius-md: 8px;
--radius-lg: 12px;
--radius-xl: 20px;
--font-serif: 'EB Garamond', Georgia, 'Times New Roman', serif;
--font-sans: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
--font-mono: 'JetBrains Mono', 'Fira Code', monospace;
--transition-fast: 150ms ease;
--transition-base: 250ms ease;
--transition-slow: 400ms ease;
/* Chart-specific variables */
--chart-axis: #8892a4;
--chart-grid: rgba(148, 163, 184, 0.08);
--chart-tooltip-bg: #ffffff;
--chart-tooltip-border: #e2e5ea;
--chart-bar-bg: #f1f5f9;
--chart-green: #00b386;
--chart-green-fill: rgba(0, 179, 134, 0.15);
--error-bg: #fef2f2;
--error-border: #fecaca;
}
/* ═══════════════════════════════════════════════════════════════════════
Dark Mode Theme β€” True Black
═══════════════════════════════════════════════════════════════════════ */
[data-theme="dark"] {
--bg-primary: #0a0a0a;
--bg-secondary: #141414;
--bg-tertiary: #1c1c1c;
--bg-card: #111111;
--bg-glass: rgba(17, 17, 17, 0.92);
--bg-hover: rgba(0, 125, 99, 0.1);
--text-primary: #e8e8e8;
--text-secondary: #a0a8b8;
--text-muted: #6b7588;
--text-accent: #00c896;
--text-on-dark: #f0f4f2;
--text-on-dark-muted: #a3b8b0;
--accent: #00a87a;
--accent-light: #00c896;
--accent-lighter: rgba(0, 168, 122, 0.12);
--accent-dark: #008f68;
--accent-gold: #d4a843;
--accent-gold-light: #e6c470;
--green-positive: #10b981;
--red-negative: #ef4444;
--amber-neutral: #d4a843;
--blue-info: #3b82f6;
--gradient-accent: linear-gradient(135deg, #00a87a, #00c896);
--gradient-card-hover: linear-gradient(145deg, rgba(0,168,122,0.04), rgba(0,168,122,0.08));
--border-color: #1f2228;
--border-subtle: #181b20;
--border-accent: rgba(0, 168, 122, 0.25);
--shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3);
--shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
--shadow-lg: 0 8px 30px rgba(0, 0, 0, 0.5);
--shadow-card: 0 1px 3px rgba(0,0,0,0.2), 0 1px 2px rgba(0,0,0,0.15);
--shadow-card-hover: 0 10px 40px rgba(0, 0, 0, 0.35);
--chart-axis: #6b7588;
--chart-grid: rgba(100, 116, 139, 0.1);
--chart-tooltip-bg: #1c1c1c;
--chart-tooltip-border: #2a2d32;
--chart-bar-bg: #1c1c1c;
--chart-green: #00d09c;
--chart-green-fill: rgba(0, 208, 156, 0.2);
--error-bg: rgba(239, 68, 68, 0.1);
--error-border: rgba(239, 68, 68, 0.25);
}
/* Dark mode body transition */
body {
transition: background-color 0.3s ease, color 0.3s ease;
}
/* Dark mode: badge overrides */
[data-theme="dark"] .badge-primary { background: rgba(0,168,122,0.15); color: var(--accent); }
[data-theme="dark"] .badge-emerald { background: rgba(16,185,129,0.15); color: var(--green-positive); }
[data-theme="dark"] .badge-rose { background: rgba(239,68,68,0.15); color: var(--red-negative); }
[data-theme="dark"] .badge-amber { background: rgba(212,168,67,0.15); color: var(--amber-neutral); }
/* Dark mode: table header */
[data-theme="dark"] th { background: var(--bg-tertiary); }
/* Dark mode: scrollbar */
[data-theme="dark"] ::-webkit-scrollbar-track { background: var(--bg-secondary); }
[data-theme="dark"] ::-webkit-scrollbar-thumb { background: #2a2d32; }
[data-theme="dark"] ::-webkit-scrollbar-thumb:hover { background: var(--accent); }
/* Dark mode: selection */
[data-theme="dark"] ::selection { background: rgba(0, 168, 122, 0.25); color: var(--text-primary); }
/* Dark mode: React Flow (Strategy Builder) */
[data-theme="dark"] .react-flow__controls { background: var(--bg-tertiary); border-color: var(--border-color); border-radius: var(--radius-md); }
[data-theme="dark"] .react-flow__controls-button { background: var(--bg-card); border-color: var(--border-color); fill: var(--text-secondary); }
[data-theme="dark"] .react-flow__controls-button:hover { background: var(--bg-hover); }
[data-theme="dark"] .react-flow__minimap { background: var(--bg-tertiary) !important; }
[data-theme="dark"] .react-flow__attribution { background: transparent !important; }
[data-theme="dark"] .react-flow__attribution a { color: var(--text-muted) !important; }
/* ── Reset ───────────────────────────────────────────────────────────── */
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; -webkit-font-smoothing: antialiased; }
body {
font-family: var(--font-sans);
background: var(--bg-primary);
color: var(--text-primary);
line-height: 1.7;
min-height: 100vh;
}
#root { min-height: 100vh; display: flex; flex-direction: column; }
a { color: var(--accent); text-decoration: none; transition: color var(--transition-fast); }
a:hover { color: var(--accent-light); }
/* ── Typography ──────────────────────────────────────────────────────── */
h1, h2, h3, h4, h5, h6 {
font-weight: 600;
line-height: 1.25;
letter-spacing: -0.02em;
color: var(--text-primary);
}
h1 { font-size: clamp(2rem, 4.5vw, 3.25rem); font-family: var(--font-serif); font-weight: 500; }
h2 { font-size: clamp(1.5rem, 3vw, 2.25rem); font-family: var(--font-serif); font-weight: 500; }
h3 { font-size: 1rem; font-family: var(--font-sans); font-weight: 600; }
.text-gradient {
background: var(--gradient-accent);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.text-serif { font-family: var(--font-serif); }
.text-accent { color: var(--accent); }
.mono { font-family: var(--font-mono); font-size: 0.875em; }
/* ── Layout ──────────────────────────────────────────────────────────── */
.app-layout {
display: flex;
min-height: 100vh;
}
.app-main {
flex: 1;
min-width: 0;
margin-left: 68px;
transition: margin-left var(--transition-base);
}
.page { flex: 1; padding: 2.5rem 3rem; max-width: 1320px; margin: 0 auto; width: 100%; }
.page-header { margin-bottom: 2rem; padding-bottom: 1.5rem; border-bottom: 1px solid var(--border-color); }
.page-header h1 { margin-bottom: 0.25rem; }
.page-header p { color: var(--text-secondary); font-size: 0.95rem; }
.grid-2 { display: grid; grid-template-columns: repeat(auto-fit, minmax(380px, 1fr)); gap: 1.75rem; }
.grid-3 { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 1.5rem; }
.grid-4 { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 1.25rem; }
.flex-between { display: flex; justify-content: space-between; align-items: center; }
.flex-gap { display: flex; gap: 0.75rem; align-items: center; }
/* ── Sidebar ────────────────────────────────────────────────────────── */
.sidebar {
position: fixed;
left: 0;
top: 0;
bottom: 0;
width: 68px;
background: var(--bg-primary);
border-right: 1px solid var(--border-color);
display: flex;
flex-direction: column;
overflow: hidden;
transition: width 0.25s cubic-bezier(0.4, 0, 0.2, 1);
z-index: 200;
}
.sidebar.sidebar-expanded {
width: 260px;
}
/* Brand */
.sidebar-brand {
padding: 1.25rem 1.125rem;
border-bottom: 1px solid var(--border-subtle);
flex-shrink: 0;
height: 68px;
display: flex;
align-items: center;
}
.sidebar-logo {
display: flex;
align-items: center;
gap: 0.75rem;
text-decoration: none;
color: var(--text-primary);
white-space: nowrap;
}
.sidebar-logo svg {
flex-shrink: 0;
}
.sidebar-brand-text {
font-family: var(--font-serif);
font-size: 1.2rem;
font-weight: 600;
letter-spacing: -0.02em;
opacity: 0;
transform: translateX(-8px);
transition: opacity 0.2s ease 0.05s, transform 0.2s ease 0.05s;
}
.sidebar.sidebar-expanded .sidebar-brand-text {
opacity: 1;
transform: translateX(0);
}
.sidebar-brand-text em {
font-style: normal;
color: var(--accent);
}
/* Navigation */
.sidebar-nav {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
padding: 0.5rem 0;
}
.sidebar-nav::-webkit-scrollbar { width: 0; }
.sidebar-section {
padding: 0.5rem 0;
}
.sidebar-section-label {
padding: 0.375rem 1.4rem;
font-size: 0.6rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--text-muted);
white-space: nowrap;
opacity: 0;
transition: opacity 0.2s ease 0.05s;
}
.sidebar.sidebar-expanded .sidebar-section-label {
opacity: 1;
}
.sidebar-link {
display: flex;
align-items: center;
gap: 0.875rem;
padding: 0.5rem 1.25rem;
margin: 1px 0.5rem;
border-radius: var(--radius-md);
color: var(--text-secondary);
text-decoration: none;
font-size: 0.82rem;
font-weight: 500;
white-space: nowrap;
transition: all var(--transition-fast);
cursor: pointer;
border: none;
background: transparent;
width: calc(100% - 1rem);
text-align: left;
font-family: var(--font-sans);
}
.sidebar-link:hover {
background: var(--bg-hover);
color: var(--accent);
}
.sidebar-link.active {
background: var(--accent-lighter);
color: var(--accent);
font-weight: 600;
}
.sidebar-icon {
width: 20px;
height: 20px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
}
.sidebar-icon svg {
width: 18px;
height: 18px;
}
.sidebar-label {
opacity: 0;
transform: translateX(-8px);
transition: opacity 0.2s ease 0.05s, transform 0.2s ease 0.05s;
}
.sidebar.sidebar-expanded .sidebar-label {
opacity: 1;
transform: translateX(0);
}
/* Footer */
.sidebar-footer {
border-top: 1px solid var(--border-subtle);
padding: 0.75rem;
flex-shrink: 0;
}
.sidebar-user {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.5rem 0.375rem;
margin-bottom: 0.375rem;
white-space: nowrap;
overflow: hidden;
}
.sidebar-avatar {
width: 32px;
height: 32px;
border-radius: 50%;
background: var(--accent);
color: white;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.75rem;
font-weight: 700;
flex-shrink: 0;
}
.sidebar-user-info {
opacity: 0;
transition: opacity 0.2s ease 0.05s;
}
.sidebar.sidebar-expanded .sidebar-user-info {
opacity: 1;
}
.sidebar-user-name {
font-size: 0.78rem;
font-weight: 600;
color: var(--text-primary);
}
.sidebar-user-email {
font-size: 0.65rem;
color: var(--text-muted);
}
.sidebar-logout {
color: var(--text-muted) !important;
}
.sidebar-logout:hover {
color: var(--red-negative) !important;
background: rgba(194, 48, 48, 0.05) !important;
}
.card {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: var(--radius-lg);
padding: 1.75rem;
box-shadow: var(--shadow-card);
transition: all var(--transition-base);
}
.card:hover {
box-shadow: var(--shadow-card-hover);
border-color: var(--border-accent);
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 1.25rem;
padding-bottom: 0.875rem;
border-bottom: 1px solid var(--border-subtle);
}
.card-header h3 { font-size: 0.95rem; font-weight: 600; color: var(--text-primary); letter-spacing: 0; }
/* ── Buttons ─────────────────────────────────────────────────────────── */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
padding: 0.625rem 1.5rem;
border-radius: var(--radius-md);
font-family: var(--font-sans);
font-size: 0.85rem;
font-weight: 600;
border: none;
cursor: pointer;
transition: all var(--transition-fast);
white-space: nowrap;
letter-spacing: 0.02em;
text-transform: uppercase;
}
.btn:active { transform: scale(0.98); }
.btn-primary {
background: var(--accent);
color: #fff;
}
.btn-primary:hover { background: var(--accent-light); }
.btn-secondary {
background: transparent;
color: var(--text-primary);
border: 1px solid var(--border-color);
}
.btn-secondary:hover {
background: var(--bg-hover);
border-color: var(--accent);
color: var(--accent);
}
.btn-sm { padding: 0.375rem 0.875rem; font-size: 0.75rem; }
.btn-lg { padding: 0.875rem 2.25rem; font-size: 0.875rem; letter-spacing: 0.08em; }
.btn-icon { width: 36px; height: 36px; padding: 0; border-radius: var(--radius-sm); }
/* ── Form Elements ───────────────────────────────────────────────────── */
.form-group { margin-bottom: 1.25rem; }
.form-group label {
display: block;
font-size: 0.75rem;
font-weight: 600;
color: var(--text-secondary);
margin-bottom: 0.375rem;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.input, select, textarea {
width: 100%;
padding: 0.625rem 0.875rem;
background: var(--bg-primary);
border: 1px solid var(--border-color);
border-radius: var(--radius-md);
color: var(--text-primary);
font-family: var(--font-sans);
font-size: 0.875rem;
transition: all var(--transition-fast);
outline: none;
}
.input:focus, select:focus, textarea:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(0, 82, 65, 0.1);
}
.input::placeholder { color: var(--text-muted); }
/* ── Table ───────────────────────────────────────────────────────────── */
.table-container {
overflow-x: auto;
border-radius: var(--radius-md);
border: 1px solid var(--border-color);
}
table { width: 100%; border-collapse: collapse; }
th {
padding: 0.75rem 1rem;
text-align: left;
font-size: 0.7rem;
font-weight: 700;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.08em;
background: var(--bg-secondary);
border-bottom: 2px solid var(--border-color);
}
td {
padding: 0.75rem 1rem;
font-size: 0.85rem;
border-bottom: 1px solid var(--border-subtle);
font-family: var(--font-mono);
font-size: 0.8rem;
}
tr:hover td { background: var(--bg-hover); }
/* ── Metrics ─────────────────────────────────────────────────────────── */
.metric { text-align: center; padding: 1.25rem 1rem; }
.metric-value {
font-size: 1.75rem;
font-weight: 700;
font-family: var(--font-mono);
letter-spacing: -0.03em;
}
.metric-label {
font-size: 0.65rem;
text-transform: uppercase;
letter-spacing: 0.1em;
color: var(--text-muted);
margin-top: 0.25rem;
font-weight: 600;
}
.positive { color: var(--green-positive); }
.negative { color: var(--red-negative); }
.neutral { color: var(--amber-neutral); }
/* ── Badge ───────────────────────────────────────────────────────────── */
.badge {
display: inline-flex;
align-items: center;
padding: 0.2rem 0.6rem;
border-radius: 3px;
font-size: 0.65rem;
font-weight: 700;
letter-spacing: 0.06em;
text-transform: uppercase;
}
.badge-primary { background: var(--accent-lighter); color: var(--accent); }
.badge-emerald { background: #e6f9f0; color: var(--green-positive); }
.badge-rose { background: var(--error-bg); color: var(--red-negative); }
.badge-amber { background: #fffbeb; color: var(--amber-neutral); }
/* ── Tabs ────────────────────────────────────────────────────────────── */
.tabs {
display: flex;
gap: 0;
border-bottom: 2px solid var(--border-color);
margin-bottom: 1.75rem;
}
.tab {
padding: 0.75rem 1.25rem;
font-size: 0.8rem;
font-weight: 600;
cursor: pointer;
transition: all var(--transition-fast);
color: var(--text-muted);
border: none;
background: transparent;
border-bottom: 2px solid transparent;
margin-bottom: -2px;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.tab:hover { color: var(--text-primary); }
.tab.active {
color: var(--accent);
border-bottom-color: var(--accent);
}
/* ── Loading ─────────────────────────────────────────────────────────── */
.spinner {
width: 20px;
height: 20px;
border: 2px solid var(--border-color);
border-top-color: var(--accent);
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
.loading-overlay {
display: flex;
align-items: center;
justify-content: center;
padding: 5rem;
flex-direction: column;
gap: 1rem;
color: var(--text-muted);
}
/* ── Animations ──────────────────────────────────────────────────────── */
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(24px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.animate-fade-in { animation: fadeIn 0.6s ease-out; }
.animate-fade-in-up { animation: fadeInUp 0.7s ease-out; }
/* ── Chart ───────────────────────────────────────────────────────────── */
.chart-container {
width: 100%;
height: 350px;
border-radius: var(--radius-md);
padding: 0.75rem;
}
/* ── Empty State ─────────────────────────────────────────────────────── */
.empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 4rem 2rem;
text-align: center;
color: var(--text-muted);
}
.empty-state h3 { color: var(--text-secondary); margin-bottom: 0.5rem; }
.empty-state p { max-width: 400px; font-size: 0.9rem; line-height: 1.7; }
/* ── Divider ─────────────────────────────────────────────────────────── */
.divider { width: 60px; height: 2px; background: var(--accent); margin: 1rem 0; }
/* ── Professional Icon Container ─────────────────────────────────────── */
.icon-box {
width: 48px;
height: 48px;
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
background: var(--accent-lighter);
color: var(--accent);
flex-shrink: 0;
}
.icon-box svg { width: 22px; height: 22px; }
/* ═══════════════════════════════════════════════════════════════════════
MOBILE RESPONSIVE β€” max-width: 768px
All rules below ONLY apply on mobile. Desktop is untouched.
═══════════════════════════════════════════════════════════════════════ */
@media (max-width: 768px) {
/* ── App Shell ─────────────────────────────────────────────────────── */
.app-main {
margin-left: 0 !important;
padding-bottom: 72px; /* space for bottom tab bar */
}
/* ── Desktop Sidebar hidden on mobile ──────────────────────────────── */
.sidebar:not(.mobile-nav) {
display: none !important;
}
/* ── Mobile Bottom Tab Bar ─────────────────────────────────────────── */
.mobile-nav {
display: flex !important;
position: fixed;
bottom: 0;
left: 0;
right: 0;
height: 64px;
background: var(--bg-primary);
border-top: 1px solid var(--border-color);
z-index: 300;
padding: 0 0.25rem;
box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.06);
}
.mobile-nav-items {
display: flex;
justify-content: space-around;
align-items: center;
width: 100%;
height: 100%;
}
.mobile-nav-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 0.2rem;
padding: 0.35rem 0.5rem;
border-radius: var(--radius-md);
color: var(--text-muted);
text-decoration: none;
font-size: 0.6rem;
font-weight: 600;
letter-spacing: 0.02em;
transition: color var(--transition-fast);
background: none;
border: none;
cursor: pointer;
font-family: var(--font-sans);
}
.mobile-nav-item svg {
width: 20px;
height: 20px;
}
.mobile-nav-item.active,
.mobile-nav-item:hover {
color: var(--accent);
}
/* ── Mobile drawer overlay ─────────────────────────────────────────── */
.mobile-drawer-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.4);
z-index: 400;
animation: fadeIn 0.2s ease;
}
.mobile-drawer {
position: fixed;
bottom: 0;
left: 0;
right: 0;
background: var(--bg-primary);
border-radius: 20px 20px 0 0;
padding: 1rem 0.75rem 2rem;
z-index: 500;
max-height: 70vh;
overflow-y: auto;
animation: slideUp 0.25s ease;
}
@keyframes slideUp {
from { transform: translateY(100%); }
to { transform: translateY(0); }
}
.mobile-drawer-handle {
width: 36px;
height: 4px;
background: var(--border-color);
border-radius: 2px;
margin: 0 auto 1rem;
}
.mobile-drawer .sidebar-link {
width: 100%;
padding: 0.75rem 1rem;
margin: 2px 0;
font-size: 0.88rem;
border-radius: var(--radius-md);
opacity: 1;
}
.mobile-drawer .sidebar-link .sidebar-label {
opacity: 1;
transform: none;
}
.mobile-drawer .sidebar-link .sidebar-icon {
width: 22px;
height: 22px;
}
.mobile-drawer .sidebar-section-label {
opacity: 1;
padding: 0.5rem 1rem 0.25rem;
font-size: 0.65rem;
}
/* ── Page layout ───────────────────────────────────────────────────── */
.page {
padding: 1.25rem 1rem !important;
max-width: 100%;
}
.page-header {
margin-bottom: 1.25rem;
padding-bottom: 1rem;
}
.page-header h1 {
font-size: 1.5rem !important;
}
.page-header p {
font-size: 0.85rem;
}
/* ── Grids collapse ────────────────────────────────────────────────── */
.grid-2,
.grid-3,
.grid-4 {
grid-template-columns: 1fr !important;
gap: 1rem !important;
}
/* ── Cards ─────────────────────────────────────────────────────────── */
.card {
padding: 1.125rem !important;
border-radius: var(--radius-md);
}
.card-header {
margin-bottom: 1rem;
padding-bottom: 0.75rem;
flex-wrap: wrap;
gap: 0.5rem;
}
.card-header h3 {
font-size: 0.88rem;
}
/* ── Tables ────────────────────────────────────────────────────────── */
.table-container {
margin: 0 -1.125rem;
border-radius: 0;
border-left: none;
border-right: none;
-webkit-overflow-scrolling: touch;
}
th, td {
padding: 0.5rem 0.625rem;
font-size: 0.72rem;
white-space: nowrap;
}
/* ── Charts ────────────────────────────────────────────────────────── */
.chart-container {
height: 240px !important;
padding: 0.375rem;
}
/* ── Metrics ───────────────────────────────────────────────────────── */
.metric { padding: 0.875rem 0.75rem; }
.metric-value { font-size: 1.375rem; }
.metric-label { font-size: 0.6rem; }
/* ── Tabs ───────────────────────────────────────────────────────────── */
.tabs {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
flex-wrap: nowrap;
gap: 0;
margin-bottom: 1.25rem;
scrollbar-width: none;
}
.tabs::-webkit-scrollbar { display: none; }
.tab {
padding: 0.625rem 0.875rem;
font-size: 0.7rem;
flex-shrink: 0;
}
/* ── Buttons ───────────────────────────────────────────────────────── */
.btn-lg {
padding: 0.75rem 1.5rem;
font-size: 0.8rem;
}
/* ── Forms ─────────────────────────────────────────────────────────── */
.input, select, textarea {
font-size: 16px; /* prevents iOS zoom on focus */
}
.form-group label {
font-size: 0.7rem;
}
/* ── Flex Utils ────────────────────────────────────────────────────── */
.flex-between {
flex-wrap: wrap;
gap: 0.5rem;
}
/* ── Empty state ───────────────────────────────────────────────────── */
.empty-state {
padding: 2.5rem 1.5rem;
}
/* ── Loading ───────────────────────────────────────────────────────── */
.loading-overlay {
padding: 3rem 1.5rem;
}
/* ── Badge ─────────────────────────────────────────────────────────── */
.badge {
font-size: 0.6rem;
padding: 0.15rem 0.5rem;
}
/* ── Icon box ──────────────────────────────────────────────────────── */
.icon-box {
width: 40px;
height: 40px;
}
.icon-box svg { width: 18px; height: 18px; }
/* ═════════════════════════════════════════════════════════════════════
PAGE-SPECIFIC MOBILE OVERRIDES
═════════════════════════════════════════════════════════════════════ */
/* ── Landing Page ──────────────────────────────────────────────────── */
.landing-header {
padding: 0.875rem 1rem !important;
}
.landing-header .brand-text {
font-size: 1.1rem;
}
.landing-hero {
min-height: 80vh !important;
padding: 1rem !important;
}
.landing-hero h1 {
font-size: clamp(1.75rem, 7vw, 2.5rem) !important;
line-height: 1.2 !important;
}
.landing-hero p {
font-size: 0.9rem !important;
}
.landing-hero .flex-gap {
flex-direction: column;
width: 100%;
}
.landing-hero .flex-gap .btn {
width: 100%;
}
.landing-section {
padding: 3rem 1.25rem !important;
}
.landing-footer {
flex-direction: column !important;
gap: 0.5rem;
text-align: center;
padding: 1.5rem 1rem !important;
}
/* ── Login / Register ──────────────────────────────────────────────── */
.auth-container {
flex-direction: column !important;
}
.auth-card {
padding: 2rem 1.25rem !important;
min-height: 100vh;
}
.auth-image {
display: none !important;
}
/* ── Dashboard ─────────────────────────────────────────────────────── */
.dashboard-ticker-strip {
gap: 0.375rem !important;
}
.dashboard-ticker-strip button {
min-width: 120px !important;
padding: 0.5rem 0.625rem !important;
}
/* ── Market Explorer ───────────────────────────────────────────────── */
.market-search-bar {
flex-direction: column !important;
gap: 0.75rem !important;
}
.market-search-bar .input {
width: 100% !important;
}
.market-search-bar select {
width: 100% !important;
}
.market-tabs {
overflow-x: auto !important;
flex-wrap: nowrap !important;
}
.ticker-chips {
flex-wrap: wrap !important;
gap: 0.375rem !important;
}
.company-info-grid {
grid-template-columns: 1fr 1fr !important;
gap: 0.625rem !important;
}
/* ── Factor Analysis ───────────────────────────────────────────────── */
.factor-input-bar {
flex-direction: column !important;
gap: 0.75rem !important;
}
.factor-input-bar .input {
width: 100% !important;
}
/* ── Sentiment ─────────────────────────────────────────────────────── */
.sentiment-gauge-row {
grid-template-columns: 1fr !important;
}
/* ── Holdings ──────────────────────────────────────────────────────── */
.holdings-actions {
flex-direction: column !important;
gap: 0.5rem !important;
}
.holdings-actions .btn {
width: 100%;
}
/* ── Strategy Builder ──────────────────────────────────────────────── */
.strategy-form-row {
flex-direction: column !important;
gap: 0.75rem !important;
}
/* ── Portfolio Analysis ────────────────────────────────────────────── */
.portfolio-stats-grid {
grid-template-columns: 1fr 1fr !important;
}
/* ── Recharts responsive ───────────────────────────────────────────── */
.recharts-wrapper {
font-size: 0.7rem;
}
.recharts-cartesian-axis-tick-value {
font-size: 0.65rem;
}
/* ── Generic inline-style overrides using attribute selectors ───── */
/* Override inline grid/flex styles that use fixed column widths */
[style*="grid-template-columns: repeat"] {
grid-template-columns: 1fr !important;
}
[style*="gridTemplateColumns"] {
grid-template-columns: 1fr !important;
}
[style*="padding: 6rem 3rem"],
[style*="padding:'6rem 3rem'"] {
padding: 3rem 1.25rem !important;
}
/* Fix inline flex layouts that don't wrap */
[style*="display: flex"][style*="gap:"] {
flex-wrap: wrap;
}
}
/* ── Scrollbar ───────────────────────────────────────────────────────── */
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: var(--bg-secondary); }
::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: var(--accent); }
::selection { background: rgba(0, 82, 65, 0.15); color: var(--text-primary); }