@import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@300;400;500;600;700;800&family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap'); :root { --sage-50: #ecfdf5; --sage-100: #d1fae5; --sage-200: #a7f3d0; --sage-300: #6ee7b7; --sage-400: #34d399; --sage-500: #10b981; --sage-600: #059669; --sage-700: #047857; --sage-800: #065f46; --terra-50: #fff7ed; --terra-100: #ffedd5; --terra-200: #fed7aa; --terra-300: #fdba74; --terra-400: #fb923c; --terra-500: #f97316; --terra-600: #ea580c; --terra-700: #c2410c; --stone-50: #fafaf9; --stone-100: #f5f5f4; --stone-200: #e7e5e4; --stone-300: #d6d3d1; --stone-400: #a8a29e; --stone-500: #78716c; --stone-600: #57534e; --stone-700: #44403c; --stone-800: #292524; --stone-900: #1c1917; --bg: var(--stone-50); --bg-card: #ffffff; --bg-hover: var(--sage-50); --bg-input: var(--stone-100); --text-primary: var(--stone-800); --text-secondary: var(--stone-500); --text-muted: var(--stone-400); --border: var(--stone-200); --border-hover: var(--sage-200); --border-accent: var(--sage-300); --border-focus: var(--sage-400); --shadow-sm: 0 1px 2px rgba(0,0,0,0.03); --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.04), 0 2px 4px -2px rgba(0,0,0,0.03); --shadow-lg: 0 10px 15px -3px rgba(16,185,129,0.06), 0 4px 6px -4px rgba(16,185,129,0.04); --shadow-hover: 0 8px 30px rgba(16,185,129,0.1); --radius-sm: 8px; --radius-md: 12px; --radius-lg: 16px; --radius-xl: 24px; --red-100: #fee2e2; --red-700: #b91c1c; } /* ── Dark Theme Variables ── */ .dark, :root[data-theme="dark"] { --bg: #0f172a; --bg-card: #1e293b; --bg-hover: rgba(16, 185, 129, 0.04); --bg-input: #0f172a; --text-primary: #f8fafc; --text-secondary: #cbd5e1; --text-muted: #64748b; --border: #334155; --border-hover: #475569; --border-accent: var(--sage-600); --border-focus: var(--sage-500); --shadow-sm: 0 1px 2px rgba(0,0,0,0.2); --shadow-md: 0 4px 6px -1px rgba(0,0,0,0.3), 0 2px 4px -2px rgba(0,0,0,0.2); --shadow-lg: 0 10px 15px -3px rgba(16,185,129,0.15), 0 4px 6px -4px rgba(16,185,129,0.1); --shadow-hover: 0 8px 30px rgba(16,185,129,0.25); --red-100: #450a0a; --red-700: #fca5a5; /* Muted brand colors for dark mode backgrounds */ --sage-50: rgba(16, 185, 129, 0.05); --sage-100: rgba(16, 185, 129, 0.15); --sage-200: rgba(16, 185, 129, 0.3); --sage-300: rgba(16, 185, 129, 0.45); --terra-50: rgba(249, 115, 22, 0.05); --terra-100: rgba(249, 115, 22, 0.15); --terra-200: rgba(249, 115, 22, 0.3); --terra-300: rgba(249, 115, 22, 0.45); } .dark .loading-overlay { background: rgba(15, 23, 42, 0.85) !important; } *, *::before, *::after { box-sizing: border-box; } body, .gradio-container, grad-container { font-family: 'DM Sans', system-ui, -apple-system, sans-serif !important; background: var(--bg) !important; color: var(--text-primary) !important; -webkit-font-smoothing: antialiased; } .gradio-container { max-width: 1400px !important; margin: 0 auto !important; padding: 20px 32px 40px !important; background: transparent !important; } h1, h2, h3, h4, h5, h6, .app-title, .candidate-name, .metric-value, .score-badge-value { font-family: 'Space Grotesk', sans-serif !important; letter-spacing: -0.02em; } code, pre, .mono { font-family: 'JetBrains Mono', monospace !important; } .app-header { text-align: center; padding: 36px 20px 28px; position: relative; margin-bottom: 8px; } .app-header::after { content: ''; position: absolute; bottom: 0; left: 50%; transform: translateX(-50%); width: 80px; height: 4px; background: linear-gradient(90deg, var(--sage-300), var(--terra-300), var(--sage-300)); border-radius: 2px; background-size: 200% 100%; animation: shimmer 3s ease-in-out infinite; } @keyframes shimmer { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } } .app-title { font-size: 42px; font-weight: 800; color: var(--sage-600) !important; line-height: 1.1; margin: 0; text-shadow: 0 1px 3px rgba(0,0,0,0.04); } .app-subtitle { font-size: 15px; color: var(--text-secondary); font-weight: 400; margin-top: 8px; } /* ── Gradio Overrides (Modern & Backward Compatible) ────────────────── */ .gr-box, .gr-form, .panel, .tab-nav, .tabs, .tabitem, .block, .fieldset, .form { border-color: var(--border) !important; border-radius: var(--radius-md) !important; background: transparent !important; } input:not([type="checkbox"]):not([type="radio"]), textarea, select, .gr-input, .gr-text-input, .block input, .block textarea { background: var(--bg-input) !important; border: 1.5px solid var(--border) !important; border-radius: var(--radius-sm) !important; font-family: 'DM Sans', sans-serif !important; font-size: 14px !important; color: var(--text-primary) !important; transition: all 0.2s ease; } input:not([type="checkbox"]):not([type="radio"]):focus, textarea:focus, .gr-input:focus-within, .gr-text-input:focus-within, .block input:focus, .block textarea:focus { border-color: var(--border-focus) !important; box-shadow: 0 0 0 3px var(--sage-100) !important; outline: none !important; } .gr-box, label, .gr-label, .block-label, span.block-label, label span { font-family: 'DM Sans', sans-serif !important; font-size: 13px !important; font-weight: 600 !important; color: var(--text-secondary) !important; letter-spacing: 0.02em; } .gr-button, button, .gr-btn, .btn { font-family: 'DM Sans', sans-serif !important; font-weight: 600 !important; border-radius: var(--radius-sm) !important; transition: all 0.2s ease !important; border: 1.5px solid transparent !important; } .gr-button-primary, button.gr-button-lg, button.primary, .primary { background: linear-gradient(135deg, var(--sage-400), var(--sage-500)) !important; color: white !important; border: none !important; box-shadow: var(--shadow-md) !important; } .gr-button-primary:hover, button.primary:hover, .primary:hover { transform: translateY(-1px) !important; box-shadow: var(--shadow-hover) !important; background: linear-gradient(135deg, var(--sage-500), var(--sage-600)) !important; } .gr-button-secondary, button.secondary, .secondary { background: var(--bg-card) !important; color: var(--sage-600) !important; border: 1.5px solid var(--sage-200) !important; } .gr-button-secondary:hover, button.secondary:hover, .secondary:hover { background: var(--sage-50) !important; border-color: var(--sage-300) !important; } .gr-accordion, .accordion, details { border: 1.5px solid var(--border) !important; border-radius: var(--radius-md) !important; background: var(--bg-card) !important; } .gr-checkbox, input[type="checkbox"] { accent-color: var(--sage-400) !important; } .gr-slider input[type="range"], input[type="range"] { accent-color: var(--sage-400) !important; } /* Examples styling (formatted as beautiful cards) */ .examples, .examples-table, table.examples, .examples-list { background: transparent !important; border: none !important; margin-top: 8px !important; } .examples button, .examples-table tr, table.examples tr, .examples-list button, .gr-examples-button { background: var(--bg-card) !important; border: 1.5px solid var(--border) !important; border-radius: var(--radius-sm) !important; padding: 10px 14px !important; margin: 6px 0 !important; font-size: 13px !important; text-align: left !important; color: var(--text-secondary) !important; box-shadow: var(--shadow-sm) !important; transition: all 0.2s ease !important; cursor: pointer !important; display: block !important; width: 100% !important; } .examples button:hover, .examples-table tr:hover, table.examples tr:hover, .examples-list button:hover, .gr-examples-button:hover { border-color: var(--sage-300) !important; background: var(--sage-50) !important; color: var(--sage-700) !important; transform: translateY(-1px) !important; box-shadow: var(--shadow-md) !important; } .tabs, .tab-nav { border-bottom: 1.5px solid var(--border) !important; } button.tab-nav { font-family: 'DM Sans', sans-serif !important; font-size: 14px !important; font-weight: 500 !important; color: var(--text-secondary) !important; border-bottom: 2px solid transparent !important; transition: all 0.2s; } button.tab-nav.selected { color: var(--sage-500) !important; border-bottom-color: var(--sage-400) !important; } /* ── Progress / Loading ─────────────────────────────────────────────── */ .progress-container { background: var(--bg-card); border: 1.5px solid var(--border); border-radius: var(--radius-lg); padding: 24px 28px; margin-bottom: 20px; box-shadow: var(--shadow-sm); } .progress-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; } .progress-title { font-size: 15px; font-weight: 600; color: var(--text-primary); display: flex; align-items: center; gap: 8px; font-family: 'Space Grotesk', sans-serif; } .progress-step-label { font-size: 13px; color: var(--text-secondary); font-weight: 400; } .progress-track { width: 100%; height: 8px; background: var(--stone-200); border-radius: 4px; overflow: hidden; position: relative; } .progress-fill { height: 100%; border-radius: 4px; background: linear-gradient(90deg, var(--sage-300), var(--sage-400), var(--terra-300), var(--sage-400)); background-size: 300% 100%; animation: progressGlow 2s ease-in-out infinite; transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1); position: relative; } .progress-fill::after { content: ''; position: absolute; right: 0; top: 0; height: 100%; width: 20px; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4)); border-radius: 4px; } @keyframes progressGlow { 0%, 100% { background-position: 0% 50%; } 50% { background-position: 100% 50%; } } .progress-steps { display: flex; justify-content: space-between; margin-top: 16px; gap: 4px; } .progress-step { flex: 1; text-align: center; padding: 10px 4px; border-radius: var(--radius-sm); font-size: 11px; font-weight: 500; color: var(--text-muted); transition: all 0.4s ease; position: relative; } .progress-step.active { color: var(--sage-500); background: var(--sage-50); transform: scale(1.02); } .progress-step.completed { color: var(--sage-500); } .progress-step .step-icon { display: block; font-size: 20px; margin-bottom: 4px; transition: transform 0.3s ease; } .progress-step.active .step-icon { animation: stepBounce 1s ease-in-out infinite; } @keyframes stepBounce { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-4px); } } /* ── Loading Overlay ──────────────────────────────────────────────────── */ .loading-overlay { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 400px; background: var(--bg-card); border: 1.5px solid var(--border); border-radius: var(--radius-lg); gap: 24px; animation: fadeIn 0.3s ease; width: 100%; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .loading-ring-container { position: relative; width: 80px; height: 80px; } .loading-ring { position: absolute; inset: 0; border-radius: 50%; border: 3px solid transparent; animation: ringSpin 1.5s cubic-bezier(0.4, 0, 0.2, 1) infinite; } .loading-ring:nth-child(1) { border-top-color: var(--sage-400); animation-delay: 0s; } .loading-ring:nth-child(2) { inset: 8px; border-right-color: var(--terra-400); animation-delay: 0.2s; animation-direction: reverse; } .loading-ring:nth-child(3) { inset: 16px; border-bottom-color: var(--sage-300); animation-delay: 0.4s; } @keyframes ringSpin { to { transform: rotate(360deg); } } .loading-text { font-family: 'Space Grotesk', sans-serif; font-size: 18px; font-weight: 600; color: var(--text-primary); animation: textPulse 2s ease-in-out infinite; } @keyframes textPulse { 0%, 100% { opacity: 0.7; } 50% { opacity: 1; } } .loading-sub { font-size: 13px; color: var(--text-muted); font-weight: 400; } .loading-particles { display: flex; gap: 8px; align-items: center; } .loading-particle { width: 8px; height: 8px; border-radius: 50%; animation: particleFloat 1.2s ease-in-out infinite; } .loading-particle:nth-child(1) { background: var(--sage-400); animation-delay: 0s; } .loading-particle:nth-child(2) { background: var(--terra-400); animation-delay: 0.2s; } .loading-particle:nth-child(3) { background: var(--sage-300); animation-delay: 0.4s; } .loading-particle:nth-child(4) { background: var(--terra-300); animation-delay: 0.6s; } .loading-particle:nth-child(5) { background: var(--sage-400); animation-delay: 0.8s; } @keyframes particleFloat { 0%, 100% { transform: translateY(0) scale(1); opacity: 0.4; } 50% { transform: translateY(-12px) scale(1.3); opacity: 1; } } /* ── Candidate Card ──────────────────────────────────────────────────── */ .candidate-card { background: var(--bg-card); border: 1.5px solid var(--border); border-radius: var(--radius-lg); padding: 24px; margin-bottom: 14px; box-shadow: var(--shadow-sm); transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); position: relative; overflow: hidden; } .candidate-card::before { content: ''; position: absolute; top: 0; left: 0; width: 4px; height: 100%; background: var(--sage-300); opacity: 0; transition: opacity 0.3s ease; border-radius: 0 4px 4px 0; } .candidate-card:hover { border-color: var(--border-hover); box-shadow: var(--shadow-hover); transform: translateY(-2px); background: var(--bg-hover); } .candidate-card:hover::before { opacity: 1; } .candidate-rank { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 6px; font-size: 12px; font-weight: 700; color: var(--sage-600); background: var(--sage-100); margin-right: 10px; font-family: 'Space Grotesk', sans-serif; transition: all 0.2s; } .candidate-card:hover .candidate-rank { background: var(--sage-200); color: var(--sage-700); } .candidate-name { font-size: 18px; font-weight: 600; color: var(--text-primary); letter-spacing: -0.3px; transition: color 0.2s; } .candidate-card:hover .candidate-name { color: var(--sage-600); } .candidate-role { font-size: 14px; font-weight: 500; color: var(--text-secondary); margin-top: 2px; } .candidate-meta { font-size: 13px; color: var(--text-muted); margin-top: 4px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } /* ── Score Badge ─────────────────────────────────────────────────────── */ .score-badge { display: flex; flex-direction: column; align-items: center; justify-content: center; min-width: 72px; height: 72px; border-radius: var(--radius-md); font-weight: 700; text-align: center; transition: all 0.3s ease; } .candidate-card:hover .score-badge { transform: scale(1.05); } .score-badge-value { font-size: 22px; font-weight: 700; line-height: 1; } .score-badge-label { font-size: 9px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.8px; margin-top: 2px; opacity: 0.8; } .score-strong { background: var(--sage-100) !important; color: var(--sage-700) !important; border: 1px solid var(--sage-200) !important; } .score-good { background: #dbeafe !important; color: #1d4ed8 !important; border: 1px solid #bfdbfe !important; } .score-potential { background: var(--terra-100) !important; color: var(--terra-600) !important; border: 1px solid var(--terra-200) !important; } .score-weak { background: #fee2e2 !important; color: #b91c1c !important; border: 1px solid #fecaca !important; } /* ── Score Bars ──────────────────────────────────────────────────────── */ .score-bar-row { display: flex; align-items: center; margin: 6px 0; gap: 8px; } .score-bar-label { font-size: 11px; font-weight: 600; color: var(--text-secondary); width: 90px; text-align: right; flex-shrink: 0; letter-spacing: 0.02em; } .score-bar-track { flex: 1; height: 6px; background: var(--stone-200); border-radius: 3px; overflow: hidden; } .score-bar-fill { height: 100%; border-radius: 3px; transition: width 0.6s cubic-bezier(0.4, 0, 0.2, 1); position: relative; } .score-bar-fill::after { content: ''; position: absolute; right: 0; top: 0; height: 100%; width: 12px; background: linear-gradient(90deg, transparent, rgba(255,255,255,0.3)); border-radius: 3px; } .candidate-card:hover .score-bar-fill { filter: brightness(1.1); } .score-bar-pct { font-size: 11px; font-weight: 600; color: var(--text-secondary); width: 36px; text-align: right; flex-shrink: 0; font-variant-numeric: tabular-nums; } /* ── Skill Chips ─────────────────────────────────────────────────────── */ .skill-chip { display: inline-block; padding: 4px 12px; margin: 2px; border-radius: 8px; font-size: 11px; font-weight: 500; letter-spacing: 0.2px; transition: all 0.2s ease; cursor: default; } .skill-chip.matched { background: var(--sage-100); color: var(--sage-700); border: 1px solid var(--sage-200); } .skill-chip.matched:hover { background: var(--sage-200); transform: translateY(-1px); box-shadow: 0 2px 8px rgba(16,185,129,0.15); } .skill-chip.missing { background: #fee2e2; color: #b91c1c; border: 1px solid #fecaca; } .skill-chip.missing:hover { background: #fecaca; transform: translateY(-1px); } /* ── Status Badges ───────────────────────────────────────────────────── */ .badge { display: inline-flex; align-items: center; gap: 4px; padding: 4px 14px; border-radius: 999px; font-size: 11px; font-weight: 600; letter-spacing: 0.3px; transition: all 0.2s ease; cursor: default; } .badge:hover { transform: translateY(-1px); } .badge-listwise { background: var(--sage-100); color: var(--sage-700); border: 1px solid var(--sage-200); } .badge-pii { background: #dbeafe; color: #1d4ed8; border: 1px solid #bfdbfe; } .badge-method { background: var(--terra-100); color: var(--terra-600); border: 1px solid var(--terra-200); } .badge-turbo { background: var(--stone-100); color: var(--stone-600); border: 1px solid var(--stone-200); } /* ── Metric Cards ────────────────────────────────────────────────────── */ .metric-card { background: var(--bg-card); border: 1.5px solid var(--border); border-radius: var(--radius-md); padding: 20px; text-align: center; transition: all 0.3s ease; box-shadow: var(--shadow-sm); } .metric-card:hover { border-color: var(--sage-200); box-shadow: var(--shadow-hover); transform: translateY(-2px); } .metric-label { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.8px; color: var(--text-muted); margin-bottom: 8px; } .metric-value { font-size: 30px; font-weight: 700; color: var(--sage-500); } /* ── Empty State ─────────────────────────────────────────────────────── */ .empty-state { text-align: center; padding: 60px 20px; } .empty-state-icon { font-size: 48px; margin-bottom: 16px; animation: float 3s ease-in-out infinite; } @keyframes float { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-8px); } } .empty-state-title { font-family: 'Space Grotesk', sans-serif; font-size: 22px; font-weight: 600; color: var(--text-primary); margin-bottom: 8px; } .empty-state-desc { font-size: 14px; color: var(--text-secondary); line-height: 1.6; max-width: 400px; margin: 0 auto; } .empty-state-hint { font-size: 12px; color: var(--text-muted); margin-top: 8px; } /* ── Rationale Panel ──────────────────────────────────────────────────── */ .rationale-panel { border-left: 4px solid var(--sage-300); } /* ── About Section ────────────────────────────────────────────────────── */ .about-section { padding: 8px 0; } .about-section h2 { font-family: 'Space Grotesk', sans-serif; font-size: 28px; font-weight: 700; color: var(--text-primary); margin: 0 0 8px; } .about-section h3 { font-family: 'Space Grotesk', sans-serif; font-size: 18px; font-weight: 600; color: var(--text-primary); margin: 28px 0 12px; } .about-feature-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 14px; margin: 16px 0; } .about-feature-card { background: var(--bg-card); border: 1.5px solid var(--border); border-radius: var(--radius-md); padding: 18px; display: flex; flex-direction: column; gap: 6px; transition: all 0.3s ease; box-shadow: var(--shadow-sm); } .about-feature-card:hover { border-color: var(--sage-200); box-shadow: var(--shadow-hover); transform: translateY(-2px); } .about-feature-card strong { font-size: 14px; color: var(--sage-600); } .about-feature-card span { font-size: 13px; color: var(--text-secondary); line-height: 1.5; } /* ── Scrollbar ────────────────────────────────────────────────────────── */ ::-webkit-scrollbar { width: 6px; height: 6px; } ::-webkit-scrollbar-track { background: var(--stone-100); border-radius: 3px; } ::-webkit-scrollbar-thumb { background: var(--sage-200); border-radius: 3px; } ::-webkit-scrollbar-thumb:hover { background: var(--sage-300); } /* ── Responsive ────────────────────────────────────────────────────────── */ @media (max-width: 768px) { .gradio-container { padding: 12px 16px !important; } .app-title { font-size: 28px; } .candidate-card { padding: 16px; } .progress-steps { flex-wrap: wrap; gap: 8px; } .progress-step { flex: 0 0 calc(50% - 4px); } }