/* ----------------------------------------- Google Fonts ----------------------------------------- */ @import url("https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700;800&family=Poppins:wght@400;500;600;700&display=swap"); /* ----------------------------------------- Design Tokens ----------------------------------------- */ :root { /* Main container */ --main-max-w: 1200px; --main-pt: 2rem; /* default top padding */ --main-pb: 0rem; /* default bottom padding */ --main-px: 1.25rem; /* Colors used throughout (left as-is to preserve your palette) */ --brand-green-500: #10b981; --brand-green-600: #059669; --brand-blue-500: #3b82f6; --brand-blue-800: #1e40af; --brand-sky-400: #22d3ee; --brand-emerald-400: #4ade80; --brand-emerald-500: #22c55e; --gray-50: #f9fafb; --gray-100: #f3f4f6; --gray-200: #e5e7eb; --gray-300: #d1d5db; --gray-400: #dee2e6; --gray-500: #6b7280; --gray-600: #605e5c; --gray-700: #495057; --gray-800: #323130; --text-dark: #2c3e50; } /* ----------------------------------------- Base / Global ----------------------------------------- */ /* Main container: single source of truth */ .main .block-container, .main > div { max-width: var(--main-max-w); margin: 0 auto; padding: var(--main-pt) var(--main-px) var(--main-pb); } /* Typography */ h1, h2, h3 { color: var(--text-dark); } /* Hide Streamlit default elements (kept once) */ #MainMenu, footer, header { visibility: hidden; } /* ----------------------------------------- Buttons (shared) ----------------------------------------- */ .stButton > button { border-radius: 8px; border: none; font-weight: 600; transition: all 0.3s ease; background: var(--brand-green-500); color: #fff; padding: 0.5rem 1rem; } .stButton > button:hover { transform: translateY(-2px); box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); background: var(--brand-green-600); } /* Light gray styling for review buttons - multiple targets preserved */ .stButton > button:has-text("Review"), .stButton > button[aria-label*="Review"], div[data-testid*="lesson_review"] button { background-color: #f8f9fa !important; color: #6c757d !important; border: 1px solid #dee2e6 !important; } .stButton > button:has-text("Review"):hover, .stButton > button[aria-label*="Review"]:hover, div[data-testid*="lesson_review"] button:hover { background-color: #e9ecef !important; color: #495057 !important; transform: translateY(-1px); } button[kind="secondary"] { background-color: #f8f9fa !important; color: #6c757d !important; border: 1px solid #dee2e6 !important; } button[kind="secondary"]:hover { background-color: #e9ecef !important; color: #495057 !important; } /* ----------------------------------------- Welcome Card ----------------------------------------- */ .welcome-card { background: linear-gradient(to right, #4ade80, #22d3ee); padding: 2rem; border-radius: 15px; color: white; text-align: center; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } .welcome-btn { background: #fff; color: #111; padding: 10px 20px; border-radius: 8px; border: none; font-weight: bold; cursor: pointer; transition: background 0.2s; } .welcome-btn:hover { background: #e0e0e0; } /* ----------------------------------------- XP Card ----------------------------------------- */ .xp-card { background: var(--brand-blue-500); padding: 1rem; border-radius: 12px; color: white; position: relative; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } .xp-level { font-weight: bold; color: #0b612a; } .xp-text { position: absolute; right: 1rem; top: 1rem; } .xp-bar { background: var(--brand-blue-800); height: 12px; border-radius: 8px; margin-top: 0.5rem; } .xp-fill { background: var(--brand-emerald-500); height: 12px; border-radius: 8px; transition: width 0.3s ease-in-out; } /* ----------------------------------------- Daily Challenge ----------------------------------------- */ .challenge-card { background: linear-gradient(135deg, #d946ef, #ec4899); padding: 1.5rem; border-radius: 12px; color: white; position: relative; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); } .challenge-header { display: flex; justify-content: space-between; align-items: center; } .challenge-difficulty { background: rgba(255, 255, 255, 0.2); padding: 0.2rem 0.8rem; border-radius: 12px; font-size: 0.85rem; } .challenge-progress { background: rgba(255, 255, 255, 0.3); height: 10px; border-radius: 8px; margin: 1rem 0; } .challenge-fill { background: var(--brand-emerald-500); height: 10px; border-radius: 8px; transition: width 0.3s ease-in-out; } .challenge-percent { position: absolute; right: 1.5rem; top: 7rem; } .challenge-footer { display: flex; justify-content: space-between; align-items: center; margin-top: 1rem; } .challenge-btn { background: rgba(255, 255, 255, 0.2); border: none; padding: 0.5rem 1rem; border-radius: 8px; color: white; font-weight: bold; cursor: pointer; transition: background 0.2s; } .challenge-btn:hover { background: rgba(255, 255, 255, 0.3); } /* ----------------------------------------- Game Card ----------------------------------------- */ .game-card { background: #ffffff; padding: 1.5rem; border-radius: 12px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); text-align: center; } .game-card img { margin-bottom: 1rem; } .game-difficulty { background-color: lightgray; padding: 5px; border-radius: 5px; display: inline-block; } .game-difficulty.easy { background-color: lightgreen; } .game-difficulty.medium { background-color: #ffb347; } .game-difficulty.hard { background-color: lightcoral; } .game-btn { background: #10b981; color: white; padding: 10px 20px; border: none; border-radius: 8px; font-weight: bold; cursor: pointer; transition: background 0.2s; } .game-btn:hover { background: #059669; } /* ----------------------------------------- Leaderboard ----------------------------------------- */ .leaderboard-card { background: var(--gray-50); padding: 1.5rem; border-radius: 12px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .leaderboard-item { margin-bottom: 0.5rem; } .leaderboard-you { color: var(--brand-green-500); font-weight: bold; } /* ----------------------------------------- Tips ----------------------------------------- */ .tips-card { background: var(--gray-50); padding: 1.5rem; border-radius: 12px; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .tips-item { margin-bottom: 0.5rem; } /* ----------------------------------------- lesson.py CSS ----------------------------------------- */ .stMetric { background-color: #f8f9fa; padding: 1rem; border-radius: 8px; border-left: 4px solid #007bff; } .stProgress > div > div { background-color: #007bff; } .lesson-card { transition: all 0.3s ease; cursor: pointer; } .lesson-card:hover { transform: translateY(-4px) !important; box-shadow: 0 8px 16px rgba(0, 0, 0, 0.15) !important; border-color: #0078d4 !important; } .topic-content { font-size: 1.25rem; line-height: 1.8; padding: 1.5rem; background: #fffef5; border-radius: 16px; border: 2px solid #f0e68c; margin-bottom: 1.5rem; font-family: "Comic Sans MS", "Segoe UI", Arial, sans-serif; } .topic-content p { margin-bottom: 1rem; } .topic-content ul, .topic-content ol { padding-left: 1.5rem; margin-bottom: 1rem; } /* buttons */ .topic-nav-btn button { font-size: 1.3rem; font-weight: 600; padding: 1rem; border-radius: 999px; transition: all 0.2s ease-in-out; border: none; width: 100%; height: 3.5rem; } /* Previous button (pink, left) */ .prev-btn button { background-color: #ff99cc !important; color: white !important; text-align: left; } /* Next button (blue, right) */ .next-btn button { background-color: #66ccff !important; color: white !important; text-align: right; } .topic-nav-btn button:hover { transform: scale(1.05); opacity: 0.9; } /* ----------------------------------------- code.py ----------------------------------------- */ .join-class-container { max-width: 600px; margin: 2rem auto; padding: 0 1rem; } .header-text { text-align: center; color: #605e5c; font-size: 18px; margin-bottom: 2rem; line-height: 1.5; } .join-card { background: white; border: 1px solid #e1e5e9; border-radius: 12px; padding: 2rem; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); margin-bottom: 1rem; } .card-header { display: flex; align-items: center; margin-bottom: 1rem; } .card-icon { font-size: 24px; margin-right: 12px; color: #323130; } .card-title { font-size: 24px; font-weight: 600; color: #323130; margin: 0; } .card-subtitle { color: #605e5c; font-size: 16px; margin-bottom: 1.5rem; line-height: 1.4; } .input-container { margin-bottom: 1.5rem; } .footer-text { text-align: center; color: #605e5c; font-size: 14px; margin-top: 1rem; line-height: 1.4; } .stTextInput > div > div > input { border-radius: 8px; border: 1px solid #d1d5db; padding: 12px 16px; font-size: 16px; } .stTextInput > div > div > input:focus { border-color: #0078d4; box-shadow: 0 0 0 2px rgba(0, 120, 212, 0.2); } /* ----------------------------------------- Teacher Dashboard ----------------------------------------- */ /* Header styling with gradient */ .header-container { background: linear-gradient(135deg, #10b981 0%, #059669 100%); padding: 2rem; border-radius: 1rem; margin-bottom: 2rem; color: white; position: relative; } .header-content { display: flex; justify-content: space-between; align-items: flex-start; width: 100%; } .header-left { flex: 1; } .header-title { font-size: 2rem; font-weight: 700; margin-bottom: 0.5rem; color: white; } .header-subtitle { font-size: 1.1rem; opacity: 0.9; color: white; } /* Metric cards (dashboard version) */ .metric-card { background: white; padding: 1.5rem; border-radius: 1rem; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); border: 1px solid #f3f4f6; text-align: center; margin-bottom: 1rem; } .metric-icon { font-size: 2rem; color: var(--brand-green-500); } .metric-value { font-size: 2rem; font-weight: 700; color: var(--brand-green-500); } .metric-label { font-size: 0.9rem; color: #6b7280; font-weight: 500; } /* Chart containers */ .chart-title { font-size: 1.25rem; font-weight: 600; color: #1f2937; } /* Progress bars */ .progress-label { font-size: 0.9rem; color: #6b7280; } /* Activity section */ .activity-item { padding: 0.75rem; background: #f9fafb; border-radius: 0.5rem; margin-bottom: 0.5rem; border-left: 3px solid var(--brand-green-500); } /* Quick actions */ .quick-action-btn { width: 100%; margin-bottom: 0.5rem; background: #f3f4f6; border: none; padding: 0.75rem; border-radius: 0.5rem; text-align: left; font-weight: 500; } .quick-action-btn:hover { background: #e5e7eb; } .main .block-container { padding-top: 4rem; padding-bottom: 0rem; } /* ----------------------------------------- Debt Dilemma (Game) ----------------------------------------- */ .game-header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 1.5rem; border-radius: 15px; color: white; text-align: center; margin-bottom: 2rem; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1); } .game-title { font-size: 2.5rem; font-weight: bold; margin-bottom: 0.5rem; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3); } .metric-card { background: white; padding: 1rem; border-radius: 8px; text-align: center; margin: 0.5rem 0; border: 1px solid #e0e0e0; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); } .metric-card h2, .metric-card h3, .metric-card h4 { margin: 0.25rem 0; color: #333; } .metric-card small { color: #666; } .stButton > button:hover { transform: translateY(-2px); box-shadow: 0 6px 20px rgba(0, 0, 0, 0.3); } .success-btn > button { background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%) !important; } .warning-btn > button { background: linear-gradient(135deg, #fa709a 0%, #fee140 100%) !important; } .danger-btn > button { background: linear-gradient(135deg, #ff6b6b 0%, #ffa500 100%) !important; } .event-card { background: #f8f9fa; color: #333; padding: 1.5rem; border-radius: 8px; margin: 1rem 0; border: 1px solid #dee2e6; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); } .event-title { font-size: 1.5rem; font-weight: bold; margin-bottom: 0.5rem; color: #495057; } .expense-card { background: white; padding: 1rem; border-radius: 8px; margin: 0.5rem 0; border: 1px solid #e0e0e0; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } .expense-card h4 { margin: 0 0 0.5rem 0; color: #333; } .expense-card p { margin: 0.25rem 0; color: #666; } .achievement-badge { background: #f8f9fa; padding: 0.5rem 1rem; border-radius: 20px; margin: 0.25rem; display: inline-block; font-weight: bold; border: 1px solid #dee2e6; color: #495057; } .stProgress > div > div > div { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 10px; } .stAlert { border-radius: 8px; border: none; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); } /* ---------- Leaderboard styles ---------- */ .leaderboard { --lb-bg: #ffffff; --lb-border: #e5e7eb; /* gray-200 */ --lb-accent: linear-gradient(135deg, #22c55e, #059669); --lb-you-bg: #ecfdf5; /* emerald-50 */ --lb-text: #111827; /* gray-900 */ border: 1px solid var(--lb-border); border-radius: 16px; background: var(--lb-bg); box-shadow: 0 8px 24px rgba(0, 0, 0, 0.06); overflow: hidden; color: var(--lb-text); } .leaderboard .lb-head { display: flex; align-items: center; gap: 10px; padding: 14px 18px; background: var(--lb-accent); color: #fff; font-weight: 800; letter-spacing: 0.2px; } .lb-row { display: grid; grid-template-columns: 56px 1fr auto auto; gap: 12px; align-items: center; padding: 12px 18px; border-top: 1px solid var(--lb-border); } .lb-row:first-of-type { border-top: none; } .lb-row.is-you { background: var(--lb-you-bg); position: relative; } .lb-rank { width: 36px; height: 36px; display: grid; place-items: center; border-radius: 12px; background: #f3f4f6; /* gray-100 */ font-weight: 800; } .lb-rank.medal-1 { background: #f59e0b; color: #fff; } /* gold */ .lb-rank.medal-2 { background: #9ca3af; color: #fff; } /* silver */ .lb-rank.medal-3 { background: #b45309; color: #fff; } /* bronze */ .lb-name { font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .lb-level { font-size: 12px; padding: 4px 10px; border-radius: 999px; background: #eef2ff; /* indigo-50 */ color: #3730a3; /* indigo-800 */ font-weight: 800; } .lb-xp { font-variant-numeric: tabular-nums; font-weight: 700; } .lb-you-pill { position: absolute; right: 10px; top: 10px; background: #10b981; /* emerald-500 */ color: #fff; font-size: 11px; padding: 2px 8px; border-radius: 999px; font-weight: 800; } /* Small screens: tuck columns a bit tighter */ @media (max-width: 640px) { .lb-row { grid-template-columns: 48px 1fr auto; } .lb-xp { display: none; /* hide XP column on very small screens */ } }