:root { /* Brand */ --navy: #0f172a; --dark-blue: #1e293b; --mid-blue: #334155; --accent-green: #10b981; --accent-green-dim: #059669; --light-green: #d1fae5; --teal: #14b8a6; --brand-accent: #6366f1; /* Grays */ --gray-50: #f8fafc; --gray-100: #f1f5f9; --gray-200: #e2e8f0; --gray-300: #cbd5e1; --gray-400: #94a3b8; --gray-500: #64748b; --gray-600: #475569; --gray-700: #334155; --gray-800: #1e293b; --gray-900: #0f172a; --white: #ffffff; /* Semantic */ --red: #ef4444; --red-light: #fee2e2; --green-light: #d1fae5; --amber: #f59e0b; --amber-light: #fef3c7; --blue: #3b82f6; --blue-light: #dbeafe; /* Shadows */ --shadow-xs: 0 1px 3px rgba(15,23,42,0.04); --shadow-sm: 0 2px 8px rgba(15,23,42,0.06); --shadow-md: 0 4px 20px rgba(15,23,42,0.08); --shadow-lg: 0 8px 32px rgba(15,23,42,0.10); /* Radius */ --radius-sm: 6px; --radius-md: 10px; --radius-lg: 14px; --radius-xl: 20px; /* Glass */ --glass-bg: rgba(255,255,255,0.7); --glass-border: rgba(255,255,255,0.5); } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; color: var(--gray-800); background: var(--white); -webkit-font-smoothing: antialiased; line-height: 1.6; } /* ── NAV ── */ nav { position: fixed; top: 0; left: 0; right: 0; z-index: 1000; background: rgba(255,255,255,0.92); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border-bottom: 1px solid rgba(226,232,240,0.7); padding: 0 2rem; height: 64px; display: flex; align-items: center; justify-content: space-between; gap: 1rem; transition: background 0.3s, box-shadow 0.3s; } .nav-scrolled { background: rgba(255,255,255,0.97) !important; box-shadow: 0 1px 10px rgba(15,23,42,0.07); } .nav-logo { font-family: 'Space Grotesk', sans-serif; font-weight: 700; font-size: 1.2rem; color: var(--navy); text-decoration: none; display: flex; align-items: center; gap: 0.5rem; flex-shrink: 0; } .nav-logo-icon { width: 32px; height: 32px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; } .nav-logo-icon svg { width: 32px; height: 32px; display: block; } /* ── MEGA-MENU TOP-LEVEL LIST ── */ .nav-mega-links { display: flex; gap: 0.125rem; list-style: none; align-items: center; } .nav-mega-item { position: relative; } /* ── MEGA TRIGGER BUTTON ── */ .nav-mega-trigger { display: flex; align-items: center; gap: 0.3rem; font-size: 0.8375rem; font-weight: 500; color: var(--gray-600); background: none; border: none; padding: 0.375rem 0.7rem; border-radius: 7px; cursor: pointer; font-family: inherit; white-space: nowrap; transition: color 0.15s, background 0.15s; line-height: 1; } .nav-mega-trigger:hover { color: var(--navy); background: var(--gray-50); } .nav-mega-trigger.panel-open { color: var(--navy); background: var(--gray-100); } .nav-mega-chevron { width: 11px; height: 11px; transition: transform 0.2s; color: var(--gray-400); flex-shrink: 0; } .nav-mega-trigger.panel-open .nav-mega-chevron { transform: rotate(180deg); } /* ── MEGA PANEL DROPDOWN ── */ .nav-mega-panel { display: none; position: absolute; top: calc(100% + 8px); left: 50%; transform: translateX(-50%); background: #fff; border: 1px solid var(--gray-200); border-radius: 14px; box-shadow: 0 8px 40px rgba(15,23,42,0.10), 0 2px 8px rgba(15,23,42,0.05); padding: 1.25rem; min-width: 580px; z-index: 999; animation: megaFadeIn 0.14s ease; } .nav-mega-panel.open { display: block; } .nav-mega-panel.wide { min-width: 740px; } @keyframes megaFadeIn { from { opacity: 0; transform: translateX(-50%) translateY(-8px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } } /* First item panel — anchor left not center */ .nav-mega-item:first-child .nav-mega-panel { left: 0; transform: none; } @keyframes megaFadeInLeft { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: translateY(0); } } .nav-mega-item:first-child .nav-mega-panel.open { animation: megaFadeInLeft 0.14s ease; } /* ── PANEL INNER GRID ── */ .mega-cols { display: grid; gap: 1.25rem; } .mega-cols-2 { grid-template-columns: 1fr 1fr; } .mega-cols-3 { grid-template-columns: 1fr 1fr 1fr; } .mega-cols-4 { grid-template-columns: 1fr 1fr 1fr 1fr; } .mega-col-hd { font-size: 0.67rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.09em; color: var(--gray-400); margin-bottom: 0.5rem; padding-bottom: 0.4rem; border-bottom: 1px solid var(--gray-100); } .mega-links { list-style: none; display: flex; flex-direction: column; gap: 0.1rem; } .mega-links a { display: block; font-size: 0.8125rem; font-weight: 500; color: var(--gray-600); text-decoration: none; padding: 0.26rem 0.5rem; border-radius: 5px; transition: color 0.12s, background 0.12s; white-space: nowrap; } .mega-links a:hover { color: var(--navy); background: var(--gray-50); } .mega-links a.mega-see-all { color: var(--accent-green); font-weight: 600; margin-top: 0.2rem; font-size: 0.775rem; } .mega-links a.mega-see-all:hover { background: rgba(16,185,129,0.06); } /* ── AI TRACKER INPUT (Track the Market panel) ── */ .mega-ai-row { grid-column: 1 / -1; background: linear-gradient(135deg, rgba(16,185,129,0.05) 0%, rgba(99,102,241,0.04) 100%); border: 1px solid rgba(16,185,129,0.16); border-radius: 10px; padding: 0.875rem 1rem; margin-bottom: 0.125rem; } .mega-ai-label { font-size: 0.68rem; font-weight: 700; color: var(--accent-green); text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 0.5rem; display: flex; align-items: center; gap: 0.35rem; } .mega-ai-form { display: flex; gap: 0.5rem; } .mega-ai-input { flex: 1; padding: 0.575rem 0.875rem; border: 1px solid var(--gray-200); border-radius: 8px; font-size: 0.8375rem; font-family: inherit; color: var(--navy); background: #fff; outline: none; min-width: 0; transition: border 0.15s, box-shadow 0.15s; } .mega-ai-input:focus { border-color: var(--accent-green); box-shadow: 0 0 0 3px rgba(16,185,129,0.08); } .mega-ai-input::placeholder { color: var(--gray-400); } .mega-ai-btn { padding: 0.575rem 1rem; background: linear-gradient(135deg, var(--accent-green), var(--teal)); color: #fff; border: none; border-radius: 8px; font-size: 0.8rem; font-weight: 700; cursor: pointer; font-family: inherit; white-space: nowrap; transition: box-shadow 0.15s; box-shadow: 0 2px 8px rgba(16,185,129,0.25); } .mega-ai-btn:hover { box-shadow: 0 4px 14px rgba(16,185,129,0.35); } /* ── MY STACK EDGE CTA BUTTON ── */ .nav-edge-cta { display: inline-flex; align-items: center; gap: 0.35rem; background: linear-gradient(135deg, #10b981, #059669); color: #fff !important; font-size: 0.8125rem; font-weight: 700; padding: 0.44rem 1.05rem; border-radius: 8px; text-decoration: none; white-space: nowrap; transition: all 0.15s; box-shadow: 0 2px 10px rgba(16,185,129,0.30); border: 1px solid rgba(5,150,105,0.3); } .nav-edge-cta:hover { box-shadow: 0 4px 16px rgba(16,185,129,0.40); transform: translateY(-1px); } /* ── MOBILE HAMBURGER ── */ .nav-mobile-btn { display: none; background: none; border: 1.5px solid var(--gray-200); border-radius: 7px; width: 36px; height: 36px; cursor: pointer; align-items: center; justify-content: center; flex-shrink: 0; color: var(--navy); } .nav-mobile-btn svg { display: block; } /* ── LEGACY COMPAT ── */ .nav-cta { background: linear-gradient(135deg, var(--accent-green), var(--teal)) !important; color: #fff !important; padding: 0.375rem 0.875rem; border-radius: 7px; font-weight: 600 !important; font-size: 0.8125rem !important; transition: all 0.15s !important; white-space: nowrap; box-shadow: 0 2px 8px rgba(16,185,129,0.25); } .nav-cta:hover { box-shadow: 0 4px 14px rgba(16,185,129,0.3) !important; transform: translateY(-1px); } .nav-advisors-link { background: linear-gradient(135deg, var(--accent-green), var(--teal)) !important; color: #fff !important; padding: 0.375rem 0.875rem; border-radius: 7px; font-weight: 600 !important; font-size: 0.8125rem !important; transition: all 0.15s !important; box-shadow: 0 2px 8px rgba(16,185,129,0.25); } .nav-advisors-link:hover { box-shadow: 0 4px 14px rgba(16,185,129,0.3) !important; } .nav-links { display: flex; gap: 1.5rem; list-style: none; align-items: center; flex-wrap: nowrap; } .nav-links a { font-size: 0.8375rem; font-weight: 500; color: var(--gray-600); text-decoration: none; transition: color 0.15s; white-space: nowrap; } .nav-links a:hover { color: var(--navy); } .nav-links a.active { color: var(--navy); font-weight: 600; } .nav-new-badge { display: inline-block; font-size: 0.55rem; font-weight: 800; padding: 0.1rem 0.35rem; border-radius: 3px; background: linear-gradient(135deg, var(--accent-green), var(--teal)); color: #fff; vertical-align: middle; margin-left: 0.2rem; letter-spacing: 0.04em; } /* ── LAYOUT ── */ .container { max-width: 1200px; margin: 0 auto; padding: 0 2rem; } .page-header { padding: 7rem 0 3rem; } .page-wrap { max-width: 1200px; margin: 0 auto; padding: 7rem 2rem 4rem; } /* ── BREADCRUMB ── */ .breadcrumb { display: flex; align-items: center; gap: 0.4rem; font-size: 0.78rem; color: var(--gray-500); margin-bottom: 1.25rem; } .breadcrumb a { color: var(--gray-500); text-decoration: none; } .breadcrumb a:hover { color: var(--accent-green); } .breadcrumb span { color: var(--gray-400); } /* ── PAGE TYPOGRAPHY ── */ .page-label { font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; color: var(--accent-green); margin-bottom: 0.6rem; } .page-title { font-family: 'Space Grotesk', sans-serif; font-size: 2.75rem; font-weight: 700; color: var(--navy); line-height: 1.12; letter-spacing: -0.025em; margin-bottom: 1rem; } .page-subtitle { font-size: 1.05rem; color: var(--gray-500); line-height: 1.75; max-width: 620px; } /* ── SECTION ── */ .section { padding: 3rem 0; border-top: 1px solid var(--gray-100); } .section-label { font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; color: var(--accent-green); margin-bottom: 0.5rem; } .section-title { font-family: 'Space Grotesk', sans-serif; font-size: 1.35rem; font-weight: 700; color: var(--navy); margin-bottom: 1.5rem; letter-spacing: -0.01em; } .section-subtitle { font-size: 0.95rem; color: var(--gray-500); margin-bottom: 2rem; line-height: 1.7; max-width: 560px; } /* ── CARDS ── */ .card { background: var(--white); border: 1px solid var(--gray-200); border-radius: var(--radius-lg); overflow: hidden; } .card-hover { transition: border-color 0.2s, box-shadow 0.2s, transform 0.2s; } .card-hover:hover { border-color: var(--accent-green); box-shadow: var(--shadow-md); transform: translateY(-2px); } .card-body { padding: 1.5rem; } /* ── BUTTONS ── */ .btn { display: inline-flex; align-items: center; gap: 0.4rem; padding: 0.625rem 1.25rem; border-radius: 8px; font-size: 0.875rem; font-weight: 600; font-family: inherit; cursor: pointer; border: none; transition: all 0.15s; text-decoration: none; white-space: nowrap; line-height: 1; } .btn-primary { background: linear-gradient(135deg, var(--accent-green), var(--teal)); color: #fff; box-shadow: 0 2px 8px rgba(16,185,129,0.25); } .btn-primary:hover { box-shadow: 0 4px 14px rgba(16,185,129,0.3); transform: translateY(-1px); } .btn-green { background: var(--accent-green); color: var(--white); } .btn-green:hover { background: var(--accent-green-dim); } .btn-outline { background: var(--white); color: var(--navy); border: 1.5px solid var(--gray-200); } .btn-outline:hover { border-color: var(--navy); background: var(--gray-50); } .btn-ghost { background: var(--gray-100); color: var(--gray-700); } .btn-ghost:hover { background: var(--gray-200); } .btn-danger { background: var(--red-light); color: var(--red); } .btn-danger:hover { background: #fecaca; } .btn-sm { padding: 0.375rem 0.75rem; font-size: 0.8rem; border-radius: 6px; } .btn-lg { padding: 0.8rem 1.75rem; font-size: 1rem; border-radius: 10px; } /* ── BADGES ── */ .badge { display: inline-block; padding: 0.2rem 0.625rem; border-radius: 100px; font-size: 0.72rem; font-weight: 600; line-height: 1.4; } .badge-green { background: var(--green-light); color: #065f46; } .badge-red { background: var(--red-light); color: #991b1b; } .badge-blue { background: var(--blue-light); color: #1d4ed8; } .badge-amber { background: var(--amber-light); color: #92400e; } .badge-gray { background: var(--gray-100); color: var(--gray-600); } .badge-navy { background: linear-gradient(135deg, var(--accent-green), var(--teal)); color: #fff; } /* ── STAT CARDS ── */ .stat-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1rem; margin-bottom: 2rem; } .stat-card { background: var(--white); border: 1px solid var(--gray-200); border-radius: var(--radius-lg); padding: 1.25rem 1.5rem; } .stat-label { font-size: 0.68rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--gray-400); margin-bottom: 0.5rem; } .stat-value { font-family: 'Space Grotesk', sans-serif; font-size: 1.75rem; font-weight: 700; color: var(--navy); line-height: 1; } .stat-value.green { color: var(--accent-green); } .stat-value.red { color: var(--red); } .stat-sub { font-size: 0.75rem; color: var(--gray-400); margin-top: 0.35rem; } /* ── DATA TABLE ── */ .data-table { width: 100%; border-collapse: collapse; font-size: 0.875rem; } .data-table th { text-align: left; padding: 0.75rem 1rem; font-size: 0.68rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--gray-400); border-bottom: 2px solid var(--gray-200); background: var(--gray-50); } .data-table td { padding: 0.9rem 1rem; border-bottom: 1px solid var(--gray-100); color: var(--gray-700); vertical-align: middle; } .data-table tr:last-child td { border-bottom: none; } .data-table tr:hover td { background: var(--gray-50); } .data-table .ticker-col { font-family: 'Space Grotesk', sans-serif; font-weight: 700; color: var(--navy); font-size: 0.9rem; } .risks-table { width: 100%; border-collapse: collapse; font-size: 0.9rem; } .risks-table th { text-align: left; padding: 0.75rem 1rem; font-size: 0.68rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--gray-400); border-bottom: 2px solid var(--gray-200); background: var(--gray-50); } .risks-table td { padding: 0.9rem 1rem; border-bottom: 1px solid var(--gray-100); vertical-align: top; color: var(--gray-700); line-height: 1.6; } .risks-table td:first-child { font-weight: 600; color: var(--navy); white-space: nowrap; } .risks-table tr:last-child td { border-bottom: none; } .risks-table tr:hover td { background: var(--gray-50); } /* ── FORMS ── */ .form-group { margin-bottom: 1.1rem; } .form-label { display: block; font-size: 0.8rem; font-weight: 600; color: var(--gray-600); margin-bottom: 0.4rem; } .form-input, .form-select, .form-textarea { width: 100%; padding: 0.65rem 0.9rem; border: 1.5px solid var(--gray-200); border-radius: 8px; font-size: 0.875rem; font-family: inherit; color: var(--gray-800); background: var(--white); transition: border-color 0.15s, box-shadow 0.15s; -webkit-appearance: none; } .form-input:focus, .form-select:focus, .form-textarea:focus { outline: none; border-color: var(--accent-green); box-shadow: 0 0 0 3px rgba(16,185,129,0.1); } .form-textarea { resize: vertical; min-height: 80px; } .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; } .form-actions { display: flex; gap: 0.75rem; justify-content: flex-end; margin-top: 1.5rem; } /* ── EMPTY STATE ── */ .empty-state { text-align: center; padding: 4rem 2rem; } .empty-icon { font-size: 2.5rem; margin-bottom: 1rem; opacity: 0.5; } .empty-title { font-family: 'Space Grotesk', sans-serif; font-size: 1.2rem; font-weight: 700; color: var(--navy); margin-bottom: 0.5rem; } .empty-text { font-size: 0.9rem; color: var(--gray-400); margin-bottom: 1.5rem; line-height: 1.6; } /* ── SUB NAV ── */ .sub-nav { display: flex; gap: 0.25rem; margin-bottom: 2rem; border-bottom: 1px solid var(--gray-200); } .sub-nav a { padding: 0.65rem 1.25rem; font-size: 0.875rem; font-weight: 500; color: var(--gray-500); text-decoration: none; border-bottom: 2px solid transparent; margin-bottom: -1px; transition: all 0.15s; } .sub-nav a:hover { color: var(--navy); } .sub-nav a.active { color: var(--navy); font-weight: 600; border-bottom-color: var(--accent-green); } /* ── MODAL ── */ .modal-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.4); z-index: 200; align-items: center; justify-content: center; backdrop-filter: blur(4px); } .modal-overlay.open { display: flex; } .modal { background: var(--white); border-radius: var(--radius-xl); padding: 2rem; width: 100%; max-width: 520px; max-height: 90vh; overflow-y: auto; box-shadow: var(--shadow-lg); } .modal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.5rem; } .modal-title { font-family: 'Space Grotesk', sans-serif; font-size: 1.25rem; font-weight: 700; color: var(--navy); } .modal-close { background: none; border: none; font-size: 1.5rem; cursor: pointer; color: var(--gray-400); line-height: 1; padding: 0; } .modal-close:hover { color: var(--gray-700); } /* ── FOOTER ── */ footer { background: var(--gray-50); color: var(--gray-500); padding: 3.5rem 2rem 2rem; margin-top: 5rem; border-top: 1px solid var(--gray-100); } .footer-inner { max-width: 1200px; margin: 0 auto; } .footer-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 3rem; padding-bottom: 2.5rem; border-bottom: 1px solid var(--gray-200); margin-bottom: 2rem; } .footer-brand .footer-logo { font-family: 'Space Grotesk', sans-serif; font-weight: 700; font-size: 1.1rem; color: var(--navy); text-decoration: none; display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.875rem; } .footer-brand .footer-logo-icon { width: 28px; height: 28px; flex-shrink: 0; display: flex; align-items: center; justify-content: center; } .footer-brand .footer-logo-icon svg { width: 28px; height: 28px; display: block; } .footer-brand p { font-size: 0.82rem; color: var(--gray-500); line-height: 1.7; max-width: 240px; } .footer-col-title { font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.1em; color: var(--gray-400); margin-bottom: 1rem; } .footer-links { list-style: none; display: flex; flex-direction: column; gap: 0.5rem; } .footer-links a { font-size: 0.82rem; color: var(--gray-500); text-decoration: none; transition: color 0.15s; } .footer-links a:hover { color: var(--accent-green); } .footer-bottom { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 0.75rem; } .footer-bottom p { font-size: 0.78rem; color: var(--gray-500); } .footer-legal { display: flex; gap: 1.25rem; } .footer-legal a { font-size: 0.78rem; color: var(--gray-500); text-decoration: none; transition: color 0.15s; } .footer-legal a:hover { color: var(--navy); } /* ── RESPONSIVE ── */ @media (max-width: 1100px) { .nav-mega-links { gap: 0.05rem; } .nav-mega-trigger { padding: 0.375rem 0.5rem; font-size: 0.8rem; } .footer-grid { grid-template-columns: 1fr 1fr 1fr; } .footer-brand { grid-column: 1 / -1; } .stat-grid { grid-template-columns: repeat(2, 1fr); } } @media (max-width: 900px) { .nav-mega-links { display: none; } .nav-mega-links.open { display: flex; flex-direction: column; position: absolute; top: 64px; left: 0; right: 0; background: #fff; border-bottom: 1px solid var(--gray-200); padding: 0.5rem 0; box-shadow: 0 8px 24px rgba(15,23,42,0.08); z-index: 999; max-height: 80vh; overflow-y: auto; } .nav-mega-item { width: 100%; border-bottom: 1px solid var(--gray-100); } .nav-mega-item:last-child { border-bottom: none; } .nav-mega-trigger { width: 100%; justify-content: space-between; padding: 0.75rem 1.25rem; font-size: 0.9rem; font-weight: 600; border-radius: 0; } .nav-mega-panel { display: none; position: static; transform: none; box-shadow: none; border: none; border-radius: 0; border-top: 1px solid var(--gray-100); padding: 0.75rem 1.25rem 1rem; min-width: 0; animation: none; background: var(--gray-50); } .nav-mega-panel.open { display: block; } .nav-mega-panel.wide { min-width: 0; } .mega-cols { grid-template-columns: 1fr; gap: 0.875rem; } .mega-cols-2, .mega-cols-3, .mega-cols-4 { grid-template-columns: 1fr; } .mega-ai-row { grid-column: 1; } .mega-ai-form { flex-direction: column; } .mega-ai-input { width: 100%; } .mega-ai-btn { width: 100%; justify-content: center; } .nav-edge-cta { display: flex; justify-content: center; margin: 0.625rem 1.25rem; } .nav-mobile-btn { display: flex; } /* Legacy mobile compat */ .nav-links { display: none; } .nav-links.open { display: flex; flex-direction: column; position: absolute; top: 64px; left: 0; right: 0; background: var(--white); border-bottom: 1px solid var(--gray-200); padding: 1rem 2rem; gap: 0.25rem; box-shadow: var(--shadow-md); z-index: 99; } .nav-links.open li { width: 100%; } .nav-links.open a { display: block; padding: 0.5rem 0; font-size: 0.9rem; } .page-title { font-size: 2.1rem; } .footer-grid { grid-template-columns: 1fr 1fr; gap: 2rem; } } @media (max-width: 600px) { .page-title { font-size: 1.75rem; } .stat-grid { grid-template-columns: 1fr 1fr; } .footer-grid { grid-template-columns: 1fr; gap: 1.5rem; } .footer-bottom { flex-direction: column; align-items: flex-start; gap: 0.5rem; } .form-row { grid-template-columns: 1fr; } } /* ── Data Freshness Badge ─────────────────────────────────────────── */ .dfb-badge { display: inline-flex; align-items: center; gap: 0.35rem; padding: 0.22rem 0.7rem; border-radius: 100px; font-size: 0.72rem; font-weight: 600; cursor: pointer; user-select: none; transition: opacity 0.15s; border: 1px solid; position: relative; text-decoration: none; } .dfb-loading { background:rgba(100,116,139,0.1); border-color:rgba(100,116,139,0.2); color:#64748b; } .dfb-green { background:rgba(16,185,129,0.12); border-color:rgba(16,185,129,0.3); color:#10b981; } .dfb-yellow { background:rgba(245,158,11,0.1); border-color:rgba(245,158,11,0.3); color:#f59e0b; } .dfb-red { background:rgba(239,68,68,0.1); border-color:rgba(239,68,68,0.3); color:#ef4444; } .dfb-dot { width:7px; height:7px; border-radius:50%; background:currentColor; flex-shrink:0; } .dfb-loading .dfb-dot { animation: dfb-pulse 1.5s ease-in-out infinite; } @keyframes dfb-pulse { 0%,100%{opacity:0.3} 50%{opacity:1} } .dfb-tooltip { position:absolute; top:calc(100% + 8px); left:50%; transform:translateX(-50%); background:var(--white); border:1px solid var(--gray-200); border-radius:10px; padding:0.75rem 0.875rem; min-width:270px; max-width:340px; z-index:9999; box-shadow:0 8px 32px rgba(15,23,42,0.12); text-align:left; white-space:normal; pointer-events:none; } .dfb-tooltip.dfb-tip-open { pointer-events:auto; } .dfb-tooltip.dfb-hidden { display:none; } .dfb-tip-head { font-size:0.7rem; font-weight:700; color:var(--gray-400); text-transform:uppercase; letter-spacing:0.07em; margin-bottom:0.5rem; } .dfb-tip-row { display:flex; justify-content:space-between; align-items:center; padding:0.2rem 0; font-size:0.75rem; color:var(--gray-700); gap:0.5rem; border-bottom:1px solid var(--gray-100); } .dfb-tip-row:last-of-type { border-bottom:none; } .dfb-tip-meta { color:var(--gray-400); font-size:0.69rem; white-space:nowrap; } .dfb-tip-footer { margin-top:0.6rem; padding-top:0.5rem; border-top:1px solid var(--gray-100); } .dfb-tip-footer a { color:#10b981; font-size:0.75rem; text-decoration:none; font-weight:600; } .dfb-stale-notice { display:none; margin-top:0.75rem; padding:0.6rem 0.875rem; background:rgba(239,68,68,0.06); border:1px solid rgba(239,68,68,0.2); border-radius:8px; font-size:0.8rem; color:#ef4444; line-height:1.5; } .dfb-stale-notice a { color:#ef4444; font-weight:600; }
Free — No Login Required

Portfolio Health Check

Enter your holdings and get a full health score in 60 seconds. Diversification grade, sector risk, fee drag, and a prioritized rebalancing plan — all free, instant, and built by FinanceStackHub.

No account needed
Results in under 60 seconds
AI-powered analysis
100% free

What is a Portfolio Health Check?

A quick, quantitative snapshot of how your investment portfolio is performing against key benchmarks — before small problems become expensive ones.

A portfolio health check is a systematic analysis of your investment holdings that evaluates five core dimensions: diversification, sector concentration, risk-adjusted returns, fee drag, and rebalancing drift. Think of it as a physical exam for your money — it catches problems early, when they're still cheap to fix.

Unlike a full financial plan (which takes hours and costs hundreds of dollars), a health check is fast, automated, and quantitative. It gives you a score you can track over time — so you know whether your portfolio is getting healthier or quietly drifting into dangerous territory.

The difference between a 70/100 portfolio and an 85/100 portfolio, compounded over 20 years, can be hundreds of thousands of dollars. Most investors never check. Now you can — in 60 seconds, for free.

A
Diversification Grade
B+
Sector Balance
0.18%
Fee Drag Score
+3%
Rebalancing Gap

What We Analyze

Four dimensions. Scored against real benchmarks. Each one tells you something the others can't.

Diversification Score

Measures how spread your holdings are across asset classes, geographies, and market caps. Over-concentration in one area amplifies volatility without improving expected returns.

Scored 0–100 · Benchmarked vs. 3-fund portfolio

Sector Concentration

Identifies when you're over-exposed to any single sector — tech, financials, energy. Heavy sector tilts create hidden correlation risk that only surfaces in downturns.

Flagged vs. S&P 500 sector weights

Risk-Adjusted Returns

Compares your portfolio's Sharpe ratio and volatility against benchmark indices. Are you being compensated for the risk you're taking — or just taking the risk?

Benchmarked vs. VTI, AGG, VXUS

Fee Drag

Calculates your blended expense ratio and projects the cumulative cost over 10, 20, and 30 years. Even 0.5% annual fees can cost $50,000+ on a $200k portfolio over two decades.

vs. low-cost index fund benchmarks

Rebalancing Recommendations

Shows how far your actual allocation has drifted from your target and generates specific buy/sell suggestions to bring it back into balance — sorted by impact.

Prioritized action plan · Tax-aware

AI Action Plan

A plain-English summary of your portfolio's biggest risks and top 3 actions to take this week — ranked by estimated impact on your long-term outcome.

Powered by FinanceStackHub AI

How It Works

Three steps. Under 60 seconds total.

Enter Your Holdings

Type in your tickers and allocation percentages. No brokerage login, no account sync. Just the data — you control what you share.

AI Runs the Analysis

Our AI scores diversification, concentration, fees, and drift against real benchmarks — instantly, with no waiting for a human advisor to review.

Get Your Action Plan

See your health score, dimension grades, and specific steps to fix the highest-impact issues — sorted so you know exactly what to do first.

Start My Health Check — Free

Frequently Asked Questions

The questions investors actually search for — answered clearly, without the jargon.

Financial advisors recommend reviewing portfolio health quarterly, or after any major market movement of 10% or more. At minimum, run a health check annually before rebalancing. With a free tool like this one, there's no reason to go longer than 60 days without checking — it takes less time than checking your email.
A diversification score above 70/100 is generally healthy for a long-term investor. Scores below 50 often indicate over-concentration in a single stock, sector, or asset class — which amplifies downside risk without improving expected returns. Retirees and near-retirees should aim for 80+.
Not quite. A portfolio review typically means meeting with a financial advisor who assesses your holdings qualitatively. A portfolio health check is quantitative — it scores specific dimensions against benchmarks. Health checks are faster, objective, and repeatable. Most investors benefit from automated health checks regularly and using advisor reviews only for major life decisions.
Fee drag is the cumulative cost of investment fees (expense ratios, management fees, trading costs) on long-term growth. A 1% annual fee on $100,000 costs roughly $30,000 over 20 years due to compounding. A health check surfaces your blended expense ratio and compares it to low-cost benchmarks — even reducing fees by 0.5% significantly improves your outcome.
No. The portfolio health check is completely free with no account required. Enter your holdings, get your score. If you want to save results and track changes over time, you can create a free account — but it's optional.
The health check works for stocks, ETFs, index funds, and mutual funds. It's designed for individual investors — whether you're managing a $5,000 Roth IRA or a $500,000 taxable brokerage account. Crypto and real estate are not currently included in the scoring model.
Brokers show you your portfolio's value and performance. A health check shows you whether your portfolio structure is sound — independent of recent returns. A portfolio can perform well in a bull market while being dangerously concentrated. And a great portfolio can underperform in the short term. The health check separates signal from noise.

Your Portfolio. Checked in 60 Seconds.

Free, instant, no login. See your diversification score, fee drag, and action plan right now.

Check My Portfolio Now — Free
📈 THE FINANCE STACK

Get your weekly market edge. Free.

Market pulse, stock spotlights, and actionable frameworks — delivered every week.

No spam · Unsubscribe anytime · View all issues →