@import url('https://fonts.googleapis.com/css2?family=Instrument+Sans:ital,wght@0,400;0,500;0,600;0,700;1,400&family=IBM+Plex+Mono:wght@400;500;600&display=swap'); :root { /* === DW Brand — Light === */ --accent: #2952CC; --accent-dark: #1e3fa8; --accent-light: #4A78E0; --accent-bg: #edf1fc; --accent-glow: rgba(41, 82, 204, 0.18); --green: #0d7d5a; --green-dark: #065c40; --green-light: #30C090; --green-bg: rgba(13, 125, 90, 0.08); --red: #C62828; --red-bg: rgba(198, 40, 40, 0.06); --amber: #b07800; --amber-bg: rgba(176, 120, 0, 0.08); --text: #1a1f2e; --text-2: #3d4660; --text-3: #6b7490; --text-inv: #FFFFFF; --bg: #fafbfe; --bg-warm: linear-gradient(170deg, #f0f2fa 0%, #fafbfe 50%, #f5f7fd 100%); --card: #FFFFFF; --card-border: rgba(216, 220, 232, 0.6); --divider: rgba(216, 220, 232, 0.8); --shadow-1: 0 1px 3px rgba(26, 31, 46, 0.06); --shadow-2: 0 4px 16px rgba(26, 31, 46, 0.08); --shadow-3: 0 12px 40px rgba(26, 31, 46, 0.12); --shadow-accent: 0 4px 20px rgba(41, 82, 204, 0.20); --shadow-green: 0 4px 20px rgba(13, 125, 90, 0.20); --r: 8px; --r-sm: 6px; --r-lg: 12px; --r-full: 999px; --font: 'Instrument Sans', -apple-system, sans-serif; --font-display: 'Instrument Sans', -apple-system, sans-serif; --font-mono: 'IBM Plex Mono', monospace; } /* === Reset === */ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: var(--font); background: var(--bg); color: var(--text); min-height: 100dvh; -webkit-font-smoothing: antialiased; font-size: 15px; line-height: 1.5; } /* === Typography === */ h1, h2, h3 { font-family: var(--font-display); letter-spacing: -0.02em; line-height: 1.2; } a { color: var(--accent); text-decoration: none; font-weight: 600; } a:hover { opacity: 0.8; } /* === Buttons === */ button { font-family: var(--font); cursor: pointer; border: none; border-radius: var(--r); padding: 12px 24px; font-size: 0.88rem; font-weight: 700; letter-spacing: 0.01em; transition: all 0.2s cubic-bezier(.4,0,.2,1); -webkit-tap-highlight-color: transparent; } button:active { transform: scale(0.97); } .btn-primary { background: var(--accent); color: var(--text-inv); box-shadow: var(--shadow-accent); } .btn-primary:hover { background: var(--accent-dark); } .btn-primary:disabled { opacity: 0.4; cursor: not-allowed; transform: none; box-shadow: none; } .btn-success { background: var(--green); color: var(--text-inv); box-shadow: var(--shadow-green); } .btn-outline { background: var(--card); border: 2px solid var(--divider); color: var(--text); } .btn-outline:hover { border-color: var(--accent); color: var(--accent); } .btn-ghost { background: transparent; color: var(--text-2); padding: 10px 16px; } .btn-ghost:hover { background: var(--accent-bg); color: var(--accent); } .btn-danger { background: var(--red); color: var(--text-inv); } .btn-sm { padding: 8px 16px; font-size: 0.82rem; border-radius: var(--r-sm); } .btn-full { width: 100%; } /* === Inputs === */ input, select, textarea { font-family: var(--font); background: var(--card); color: var(--text); border: 2px solid var(--divider); border-radius: var(--r); padding: 12px 16px; font-size: 0.88rem; font-weight: 500; width: 100%; outline: none; transition: border-color 0.2s; } input:focus, select:focus, textarea:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); } input::placeholder, textarea::placeholder { color: var(--text-3); font-weight: 400; } /* === Cards === */ .card { background: var(--card); border: 1px solid var(--card-border); border-radius: var(--r-lg); padding: 20px; margin-bottom: 14px; box-shadow: var(--shadow-1); } /* === Page Layout === */ .page { max-width: 440px; margin: 0 auto; padding: 16px; padding-bottom: 96px; min-height: 100dvh; background: var(--bg-warm); } .page-title { font-family: var(--font-display); font-size: 1.5rem; font-weight: 600; margin-bottom: 18px; } /* === Progress Bars === */ .progress-bar { width: 100%; height: 10px; background: rgba(0,0,0,0.05); border-radius: var(--r-full); overflow: hidden; } .progress-bar-fill { height: 100%; border-radius: var(--r-full); transition: width 0.6s cubic-bezier(.4,0,.2,1); } /* === Status Helpers === */ .status-earned { color: var(--green); } .status-locked { color: var(--red); } /* === Section Title (small label) === */ .section-label { font-family: var(--font-mono); font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-3); margin-bottom: 10px; } /* === Checklist === */ .checklist-item { display: flex; align-items: center; gap: 12px; padding: 11px 0; border-bottom: 1px solid var(--divider); font-size: 0.9rem; font-weight: 500; } .checklist-item:last-child { border-bottom: none; } .checklist-check { font-size: 1.15rem; min-width: 26px; } .checklist-points { margin-left: auto; font-family: var(--font-mono); font-size: 0.78rem; font-weight: 700; color: var(--text-3); background: rgba(0,0,0,0.04); padding: 3px 10px; border-radius: var(--r-full); } /* === Bottom Navigation === */ .nav-bar { position: fixed; bottom: 0; left: 0; right: 0; background: rgba(255,255,255,0.92); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border-top: 1px solid var(--divider); display: flex; justify-content: space-around; padding: 4px 0 env(safe-area-inset-bottom, 6px); z-index: 100; } .nav-item { display: flex; flex-direction: column; align-items: center; gap: 1px; color: var(--text-3); font-size: 0.62rem; font-weight: 700; letter-spacing: 0.03em; padding: 6px 14px; text-decoration: none; transition: color 0.15s; border-radius: var(--r-sm); position: relative; } .nav-item.active { color: var(--accent); } .nav-item.active::before { content: ''; position: absolute; top: -4px; left: 50%; transform: translateX(-50%); width: 20px; height: 3px; background: var(--accent); border-radius: 2px; } .nav-icon { font-size: 1.2rem; margin-bottom: 1px; } /* === Forms === */ .form-group { margin-bottom: 16px; } .form-label { display: block; font-size: 0.78rem; font-weight: 700; color: var(--text-2); margin-bottom: 6px; letter-spacing: 0.02em; } /* === Option Grid === */ .option-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; } .option-btn { background: var(--card); border: 2px solid var(--divider); border-radius: var(--r-lg); padding: 18px 12px; text-align: center; color: var(--text); font-size: 0.88rem; font-weight: 600; cursor: pointer; transition: all 0.2s; box-shadow: var(--shadow-1); } .option-btn:hover { border-color: var(--accent-light); transform: translateY(-2px); box-shadow: var(--shadow-2); } .option-btn.selected { border-color: var(--accent); background: var(--accent-bg); box-shadow: 0 0 0 3px var(--accent-glow); } /* === Chips === */ .chip-grid { display: flex; flex-wrap: wrap; gap: 8px; } .chip { background: var(--card); border: 2px solid var(--divider); border-radius: var(--r-full); padding: 8px 18px; font-size: 0.84rem; font-weight: 600; cursor: pointer; transition: all 0.2s; } .chip:hover { border-color: var(--accent-light); } .chip.selected { border-color: var(--accent); background: var(--accent); color: var(--text-inv); } /* === Reward Cards === */ .reward-card { display: flex; align-items: center; justify-content: space-between; padding: 14px 0; border-bottom: 1px solid var(--divider); } .reward-card:last-child { border-bottom: none; } /* === Likert Scale === */ .likert-row { display: flex; align-items: center; gap: 10px; margin: 8px 0 18px; justify-content: center; } .likert-btn { width: 44px; height: 44px; border-radius: 50%; background: var(--card); border: 2px solid var(--divider); color: var(--text); font-weight: 600; font-size: 0.88rem; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s; box-shadow: var(--shadow-1); } .likert-btn:hover { border-color: var(--accent); transform: scale(1.1); } .likert-btn.selected { border-color: transparent; background: var(--accent); color: var(--text-inv); box-shadow: var(--shadow-accent); transform: scale(1.1); } .likert-labels { display: flex; justify-content: space-between; font-size: 0.68rem; color: var(--text-3); font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; } /* === Gate Banner === */ .gate-banner { text-align: center; padding: 28px 20px; border-radius: var(--r-lg); margin-bottom: 14px; position: relative; } .gate-earned { background: linear-gradient(135deg, #E8F5E9 0%, #C8E6C9 50%, #E0F2F1 100%); border: 2px solid rgba(0,200,83,0.2); } .gate-locked { background: linear-gradient(135deg, #FFF3E0 0%, #FFE0B2 50%, #FFF8E1 100%); border: 2px solid rgba(255,87,34,0.15); } .gate-pts { font-family: var(--font-mono); font-size: 2.8rem; font-weight: 700; letter-spacing: -0.04em; line-height: 1; margin: 8px 0; } /* === Meal Sections === */ .meal-section { margin-bottom: 18px; } .meal-title { font-size: 0.72rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--text-3); margin-bottom: 6px; padding-bottom: 6px; border-bottom: 2px solid var(--divider); } /* === States === */ .loading { display: flex; justify-content: center; padding: 60px; color: var(--text-3); font-weight: 600; } .error-msg { background: var(--red-ghost); border: 2px solid rgba(255,23,68,0.15); padding: 12px 16px; border-radius: var(--r); color: var(--red); font-weight: 600; font-size: 0.88rem; margin-bottom: 14px; } /* === Animations === */ @keyframes fadeUp { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } } @keyframes popIn { from { opacity: 0; transform: scale(0.92); } to { opacity: 1; transform: scale(1); } } @keyframes countUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } } .page > .card:nth-child(1) { animation: fadeUp 0.3s ease-out both; } .page > .card:nth-child(2) { animation: fadeUp 0.3s ease-out 0.06s both; } .page > .card:nth-child(3) { animation: fadeUp 0.3s ease-out 0.12s both; } .page > .card:nth-child(4) { animation: fadeUp 0.3s ease-out 0.18s both; } .gate-banner { animation: popIn 0.35s cubic-bezier(.4,0,.2,1) both; } .gate-pts { animation: countUp 0.4s ease-out 0.15s both; } /* === Dark Mode === */ @media (prefers-color-scheme: dark) { :root { --accent: #6B9BFF; --accent-dark: #4A78E0; --accent-light: #8BB5FF; --accent-bg: #101630; --accent-glow: rgba(107, 155, 255, 0.18); --green: #30C090; --green-dark: #20A070; --green-light: #50D8A8; --green-bg: rgba(48, 192, 144, 0.10); --red: #EF5350; --red-bg: rgba(239, 83, 80, 0.10); --amber: #F0B040; --amber-bg: rgba(240, 176, 64, 0.10); --text: #eaecf4; --text-2: #b0b8d0; --text-3: #7882a0; --text-inv: #0a0b12; --bg: #0a0b12; --bg-warm: linear-gradient(170deg, #0e1020 0%, #0a0b12 50%, #0c0e1a 100%); --card: #12131d; --card-border: rgba(34, 40, 64, 0.8); --divider: rgba(34, 40, 64, 0.8); --shadow-1: 0 1px 3px rgba(0, 0, 0, 0.3); --shadow-2: 0 4px 16px rgba(0, 0, 0, 0.4); --shadow-3: 0 12px 40px rgba(0, 0, 0, 0.5); --shadow-accent: 0 4px 20px rgba(107, 155, 255, 0.15); --shadow-green: 0 4px 20px rgba(48, 192, 144, 0.15); } body { background: var(--bg); color: var(--text); } .nav-bar { background: rgba(10, 11, 18, 0.92); } input, select, textarea { background: var(--bg); color: var(--text); } .gate-earned { background: linear-gradient(135deg, rgba(48,192,144,0.12) 0%, rgba(48,192,144,0.06) 100%); border-color: rgba(48,192,144,0.25); } .gate-locked { background: linear-gradient(135deg, rgba(107,155,255,0.10) 0%, rgba(107,155,255,0.05) 100%); border-color: rgba(107,155,255,0.15); } .option-btn, .chip { background: var(--card); } .likert-btn { background: var(--card); } } /* === Manual theme override === */ :root[data-theme="dark"] { --accent: #6B9BFF; --accent-dark: #4A78E0; --accent-light: #8BB5FF; --accent-bg: #101630; --accent-glow: rgba(107, 155, 255, 0.18); --green: #30C090; --green-dark: #20A070; --green-light: #50D8A8; --green-bg: rgba(48, 192, 144, 0.10); --red: #EF5350; --red-bg: rgba(239, 83, 80, 0.10); --amber: #F0B040; --amber-bg: rgba(240, 176, 64, 0.10); --text: #eaecf4; --text-2: #b0b8d0; --text-3: #7882a0; --text-inv: #0a0b12; --bg: #0a0b12; --bg-warm: linear-gradient(170deg, #0e1020 0%, #0a0b12 50%, #0c0e1a 100%); --card: #12131d; --card-border: rgba(34, 40, 64, 0.8); --divider: rgba(34, 40, 64, 0.8); --shadow-1: 0 1px 3px rgba(0, 0, 0, 0.3); --shadow-2: 0 4px 16px rgba(0, 0, 0, 0.4); --shadow-3: 0 12px 40px rgba(0, 0, 0, 0.5); --shadow-accent: 0 4px 20px rgba(107, 155, 255, 0.15); --shadow-green: 0 4px 20px rgba(48, 192, 144, 0.15); } /* === Scrollbar === */ ::-webkit-scrollbar { width: 4px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--divider); border-radius: 4px; } /* === Mobile === */ @media (max-width: 380px) { .page { padding: 12px 10px 96px; } .gate-pts { font-size: 2.2rem; } .option-grid { gap: 8px; } .option-btn { padding: 14px 10px; } }