Spaces:
Running
Running
| @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) ; } | |
| [data-theme="dark"] .react-flow__attribution { background: transparent ; } | |
| [data-theme="dark"] .react-flow__attribution a { color: var(--text-muted) ; } | |
| /* ββ 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) ; | |
| } | |
| .sidebar-logout:hover { | |
| color: var(--red-negative) ; | |
| background: rgba(194, 48, 48, 0.05) ; | |
| } | |
| .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 ; | |
| padding-bottom: 72px; /* space for bottom tab bar */ | |
| } | |
| /* ββ Desktop Sidebar hidden on mobile ββββββββββββββββββββββββββββββββ */ | |
| .sidebar:not(.mobile-nav) { | |
| display: none ; | |
| } | |
| /* ββ Mobile Bottom Tab Bar βββββββββββββββββββββββββββββββββββββββββββ */ | |
| .mobile-nav { | |
| display: flex ; | |
| 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 ; | |
| max-width: 100%; | |
| } | |
| .page-header { | |
| margin-bottom: 1.25rem; | |
| padding-bottom: 1rem; | |
| } | |
| .page-header h1 { | |
| font-size: 1.5rem ; | |
| } | |
| .page-header p { | |
| font-size: 0.85rem; | |
| } | |
| /* ββ Grids collapse ββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .grid-2, | |
| .grid-3, | |
| .grid-4 { | |
| grid-template-columns: 1fr ; | |
| gap: 1rem ; | |
| } | |
| /* ββ Cards βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .card { | |
| padding: 1.125rem ; | |
| 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 ; | |
| 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 ; | |
| } | |
| .landing-header .brand-text { | |
| font-size: 1.1rem; | |
| } | |
| .landing-hero { | |
| min-height: 80vh ; | |
| padding: 1rem ; | |
| } | |
| .landing-hero h1 { | |
| font-size: clamp(1.75rem, 7vw, 2.5rem) ; | |
| line-height: 1.2 ; | |
| } | |
| .landing-hero p { | |
| font-size: 0.9rem ; | |
| } | |
| .landing-hero .flex-gap { | |
| flex-direction: column; | |
| width: 100%; | |
| } | |
| .landing-hero .flex-gap .btn { | |
| width: 100%; | |
| } | |
| .landing-section { | |
| padding: 3rem 1.25rem ; | |
| } | |
| .landing-footer { | |
| flex-direction: column ; | |
| gap: 0.5rem; | |
| text-align: center; | |
| padding: 1.5rem 1rem ; | |
| } | |
| /* ββ Login / Register ββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .auth-container { | |
| flex-direction: column ; | |
| } | |
| .auth-card { | |
| padding: 2rem 1.25rem ; | |
| min-height: 100vh; | |
| } | |
| .auth-image { | |
| display: none ; | |
| } | |
| /* ββ Dashboard βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .dashboard-ticker-strip { | |
| gap: 0.375rem ; | |
| } | |
| .dashboard-ticker-strip button { | |
| min-width: 120px ; | |
| padding: 0.5rem 0.625rem ; | |
| } | |
| /* ββ Market Explorer βββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .market-search-bar { | |
| flex-direction: column ; | |
| gap: 0.75rem ; | |
| } | |
| .market-search-bar .input { | |
| width: 100% ; | |
| } | |
| .market-search-bar select { | |
| width: 100% ; | |
| } | |
| .market-tabs { | |
| overflow-x: auto ; | |
| flex-wrap: nowrap ; | |
| } | |
| .ticker-chips { | |
| flex-wrap: wrap ; | |
| gap: 0.375rem ; | |
| } | |
| .company-info-grid { | |
| grid-template-columns: 1fr 1fr ; | |
| gap: 0.625rem ; | |
| } | |
| /* ββ Factor Analysis βββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .factor-input-bar { | |
| flex-direction: column ; | |
| gap: 0.75rem ; | |
| } | |
| .factor-input-bar .input { | |
| width: 100% ; | |
| } | |
| /* ββ Sentiment βββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .sentiment-gauge-row { | |
| grid-template-columns: 1fr ; | |
| } | |
| /* ββ Holdings ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .holdings-actions { | |
| flex-direction: column ; | |
| gap: 0.5rem ; | |
| } | |
| .holdings-actions .btn { | |
| width: 100%; | |
| } | |
| /* ββ Strategy Builder ββββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .strategy-form-row { | |
| flex-direction: column ; | |
| gap: 0.75rem ; | |
| } | |
| /* ββ Portfolio Analysis ββββββββββββββββββββββββββββββββββββββββββββββ */ | |
| .portfolio-stats-grid { | |
| grid-template-columns: 1fr 1fr ; | |
| } | |
| /* ββ 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 ; | |
| } | |
| [style*="gridTemplateColumns"] { | |
| grid-template-columns: 1fr ; | |
| } | |
| [style*="padding: 6rem 3rem"], | |
| [style*="padding:'6rem 3rem'"] { | |
| padding: 3rem 1.25rem ; | |
| } | |
| /* 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); } | |