/* Layout skeleton only. All visual styling → public/themes/.css */ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: inherit; min-height: 100vh; } /* ─── App shell ──────────────────────────────────────────────────────────── */ .app-wrapper { display: flex; min-height: 100vh; } .main-content { flex: 1; min-width: 0; } .container { max-width: 100%; min-height: 100vh; } /* ─── Sidebar ────────────────────────────────────────────────────────────── */ .sidebar { width: 280px; position: sticky; top: 0; height: 100vh; overflow-y: auto; flex-shrink: 0; } .sidebar-item { cursor: pointer; } /* ─── Header ─────────────────────────────────────────────────────────────── */ .header-content { display: flex; justify-content: space-between; align-items: center; max-width: 1200px; margin: 0 auto; } .header-right { display: flex; align-items: center; gap: 20px; } .user-display { display: flex; flex-direction: column; align-items: flex-end; gap: 6px; } .user-buttons { display: flex; gap: 6px; } .logout-button { cursor: pointer; font-family: inherit; } /* ─── Progress ───────────────────────────────────────────────────────────── */ .progress-content { max-width: 1200px; margin: 0 auto; } .progress-bar-container { width: 100%; overflow: hidden; } .progress-bar { height: 100%; width: 0%; transition: width 0.5s ease; } /* ─── Tasks ──────────────────────────────────────────────────────────────── */ .task-section { max-width: 1200px; margin: 0 auto; } .task-container { display: grid; } .task-card { position: relative; overflow: hidden; } .task-header { display: flex; justify-content: space-between; align-items: center; } .task-input-group { display: flex; align-items: center; } .task-input { font-family: inherit; text-align: center; } .task-button { border: none; cursor: pointer; font-family: inherit; } .task-question { white-space: pre-line; } .task-status { min-height: 1.2em; } /* ─── Confetti (JS-driven) ───────────────────────────────────────────────── */ .task-card.confetti-animation { animation: taskFadeOut 1.5s ease forwards; } @keyframes taskFadeOut { 0% { opacity: 1; transform: scale(1); } 100% { opacity: 0; transform: scale(0.96) translateY(-10px); } } .confetti { position: absolute; pointer-events: none; z-index: 1000; animation: confettiFall linear forwards; } @keyframes confettiFall { 0% { transform: translateY(0) translateX(0) rotate(0deg); opacity: 1; } 100% { transform: translateY(380px) translateX(calc(var(--random-x, 0) * 100px)) rotate(720deg); opacity: 0; } } /* ─── Toast (JS-driven) ──────────────────────────────────────────────────── */ .message { position: fixed; top: 20px; right: 20px; z-index: 9000; transform: translateX(440px); transition: transform 0.3s ease; } .message.show { transform: translateX(0); } /* ─── Overlays ───────────────────────────────────────────────────────────── */ .auth-overlay { position: fixed; inset: 0; display: flex; align-items: center; justify-content: center; z-index: 9999; } .class-picker-overlay { position: fixed; inset: 0; display: flex; align-items: center; justify-content: center; z-index: 9998; padding: 20px; } /* ─── Auth form ──────────────────────────────────────────────────────────── */ .auth-card { width: 100%; max-width: 360px; } .auth-tabs { display: flex; } .auth-tab { background: none; border: none; cursor: pointer; font-family: inherit; } .auth-input { display: block; width: 100%; font-family: inherit; } .auth-error { min-height: 1.2em; } .auth-button { width: 100%; border: none; cursor: pointer; font-family: inherit; } .reset-button { width: 100%; display: block; cursor: pointer; font-family: inherit; } /* ─── Class picker ───────────────────────────────────────────────────────── */ .class-picker-card { width: 100%; max-width: 560px; } .class-list { display: grid; } .class-card { display: flex; align-items: center; cursor: pointer; } .class-card-icon { flex-shrink: 0; } .class-card-info { flex: 1; } /* ─── Responsive ─────────────────────────────────────────────────────────── */ @media (max-width: 900px) { .app-wrapper { flex-direction: column; } .sidebar { width: 100%; position: relative; height: auto; max-height: 280px; } .header-content { flex-direction: column; align-items: flex-start; } } @media (max-width: 600px) { .task-input-group { flex-direction: column; align-items: stretch; } .task-input { width: 100%; } .task-button { width: 100%; } }