/* ================= BASE THEME ================= */ :root { /* Primary colors */ --primary-color: #5e4b8b; /* Rich purple */ --primary-light: #8a77b5; /* Lighter purple */ --primary-dark: #3b2e63; /* Darker purple */ /* Secondary colors */ --secondary-color: #444444; --secondary-dark: #222222; /* Text colors */ --text-color: #333333; --light-text: #666666; --editor-text: #d4d4d4; --white-text: #ffffff; /* Background colors */ --bg-color: #f8f7fc; /* Subtle purple tint */ --panel-bg: #ffffff; --code-bg: #f7f5fa; /* Very light purple */ --editor-bg: #1e1e1e; --editor-highlight: #303030; /* Border colors */ --border-color: #e0e0e0; /* Status colors */ --info-color: #7a93fe; --info-color-dark: #4a6bfd; --success-color: #58b890; /* Muted teal green */ --success-color-dark: #3d8d6a; --success-color-light: #a3e6c8; --error-color: #cb6e75; /* Muted red */ /* Special colors */ --primary-bg-light: rgba(94, 75, 139, 0.05); --primary-bg-medium: rgba(94, 75, 139, 0.1); --primary-bg-instruction: rgba(94, 75, 139, 0.05); --success-bg-light: rgba(88, 184, 144, 0.1); --success-bg-medium: rgba(88, 184, 144, 0.4); --error-bg-light: rgba(244, 244, 244, 0.8); --modal-bg: rgba(0, 0, 0, 0.5); /* Additional colors */ --badge-bg: var(--success-color); --black-transparent-10: rgba(0, 0, 0, 0.1); --black-transparent-20: rgba(0, 0, 0, 0.2); --black-transparent-05: rgba(0, 0, 0, 0.05); --white-transparent-80: rgba(255, 255, 255, 0.8); --primary-transparent-05: rgba(94, 75, 139, 0.05); --primary-transparent-10: rgba(94, 75, 139, 0.1); --success-transparent-10: rgba(88, 184, 144, 0.1); --success-transparent-40: rgba(88, 184, 144, 0.4); /* Typography */ --font-main: "Playfair Display", "Inter", "Segoe UI", Roboto, sans-serif; --font-code: "JetBrains Mono", "Fira Code", monospace; /* Effects */ --shadow: 0 2px 10px rgba(0, 0, 0, 0.03); --shadow-modal: 0 4px 16px rgba(0, 0, 0, 0.15); --text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.05); /* Sizes and spacing */ --header-height: 60px; --sidebar-width: 240px; --border-radius-sm: 4px; --border-radius-md: 6px; --border-radius-lg: 8px; --border-accent: 4px; --spacing-xs: 0.5rem; --spacing-sm: 0.75rem; --spacing-md: 1rem; --spacing-lg: 1.5rem; --spacing-xl: 2rem; } /* Reset */ * { margin: 0; padding: 0; box-sizing: border-box; } /* Base styles */ body { font-family: var(--font-main); background-color: var(--bg-color); color: var(--text-color); line-height: 1.6; } .app-container { display: flex; flex-direction: column; min-height: 100vh; } code { font-family: var(--font-code); } /* Header Styles */ .header { background-color: var(--panel-bg); padding: var(--spacing-md) var(--spacing-xl); display: flex; justify-content: space-between; align-items: center; box-shadow: var(--shadow); position: sticky; top: 0; z-index: 100; height: var(--header-height); } .logo { display: flex; align-items: center; gap: 0.6rem; } .logo h1 { color: var(--text-color); font-size: 1.1rem; line-height: 0.8; font-weight: 900; } .logo h1 span { color: var(--primary-color); } .main-nav ul { display: flex; list-style: none; gap: var(--spacing-md); } /* Main Content Layout */ .main-content { display: flex; flex: 1; min-height: calc(100vh - var(--header-height)); } .sidebar { width: var(--sidebar-width); background-color: var(--panel-bg); border-right: 1px solid var(--border-color); padding: var(--spacing-lg) var(--spacing-md); overflow-y: auto; height: calc(100vh - var(--header-height)); position: sticky; top: var(--header-height); } .content-area { flex: 1; padding: var(--spacing-xl); max-width: calc(100% - var(--sidebar-width)); } /* Module List Styles */ .module-list { margin-bottom: var(--spacing-xl); } .module-list h3 { margin-bottom: var(--spacing-md); font-size: 0.7rem; letter-spacing: 1px; font-weight: 800; padding: var(--spacing-xs) var(--spacing-md); text-transform: uppercase; border-left: var(--border-accent) solid var(--primary-color); border-radius: 2px; } .module-list-item { padding: var(--spacing-sm) var(--spacing-md); margin-bottom: var(--spacing-xs); border-radius: var(--border-radius-md); cursor: pointer; transition: background-color 0.2s; } .module-list-item:hover { background-color: var(--primary-bg-light); } .module-list-item.active { background-color: var(--primary-bg-medium); color: var(--primary-color); } .module-list-item.completed { position: relative; padding-right: 2rem; } .module-list-item.completed::after { content: "✓"; position: absolute; right: 0.8rem; top: 50%; transform: translateY(-50%); color: var(--primary-color); font-weight: bold; } /* Lesson Container */ .lesson-container { display: flex; flex-flow: column; align-items: stretch; justify-content: flex-start; gap: 1.4rem; background-color: var(--panel-bg); border-radius: var(--border-radius-lg); box-shadow: var(--shadow); padding: var(--spacing-xl); height: 100%; margin-bottom: var(--spacing-xl); } #lesson-title { color: var(--primary-dark); } .lesson-description { color: var(--text-color); line-height: 1.7; font-size: 1.1rem; width: 72%; } .lesson-description pre { display: inline-block; font-family: var(--font-code); font-size: 0.9rem; background-color: var(--code-bg); padding: var(--spacing-xl) calc(var(--spacing-xl) + var(--spacing-md)) var(--spacing-xl) var(--spacing-xl); border-radius: var(--border-radius-md); overflow-x: auto; margin-bottom: var(--spacing-lg); } /* Challenge Container */ .challenge-container { display: flex; flex: 1; flex-direction: column; gap: var(--spacing-lg); margin-bottom: var(--spacing-xl); } @media (min-width: 1024px) { .challenge-container { flex-direction: row; } .preview-area, .editor-container { width: 48%; } } .preview-area { background-color: var(--panel-bg); border: 1px solid var(--border-color); border-radius: var(--border-radius-md); padding: var(--spacing-md); overflow: hidden; min-height: 300px; display: flex; justify-content: center; align-items: center; } .editor-container { display: flex; flex-direction: column; gap: var(--spacing-md); } .task-instruction { background-color: var(--primary-bg-instruction); border-left: var(--border-accent) solid var(--primary-color); padding: var(--spacing-md); border-radius: var(--border-radius-sm); } .code-editor { display: flex; flex-direction: column; flex: 1; position: relative; border: 1px solid var(--border-color); border-radius: var(--border-radius-md); overflow: hidden; } .editor-header { background-color: var(--code-bg); padding: var(--spacing-xs) var(--spacing-md); display: flex; justify-content: space-between; min-height: 2rem; align-items: center; font-size: 0.9rem; color: var(--light-text); border-bottom: 1px solid var(--border-color); } .editor-content { display: flex; flex: 1; flex-direction: column; background-color: var(--editor-bg); color: var(--editor-text); padding: 0; font-family: var(--font-code); font-size: 14px; line-height: 1.5; cursor: text; /* Add text cursor to indicate it's editable */ } /* Style for when editor is clicked - pulse effect */ .editor-focused { animation: focus-pulse 0.3s ease; } /* Pulse animation */ @keyframes focus-pulse { 0% { background-color: var(--editor-bg); } 50% { background-color: var(--editor-highlight); } 100% { background-color: var(--editor-bg); } } .code-input { flex: 1; display: block; background-color: transparent; color: var(--editor-text); border: none; width: 100%; min-height: 14px; /* Ensure minimum height */ font-family: var(--font-code); font-size: 14px; line-height: 1.5; padding: var(--spacing-md); outline: none; overflow-y: scroll; /* Ensure scrolling works */ resize: none; /* Disable textarea resize */ caret-color: var(--primary-light); transition: background-color 0.2s ease; } /* Controls */ .controls { display: flex; justify-content: space-between; align-items: center; margin-top: var(--spacing-lg); } .level-indicator { font-size: 0.9rem; color: var(--light-text); } /* Buttons */ .btn { padding: var(--spacing-xs) var(--spacing-md); border-radius: var(--border-radius-sm); border: 1px solid var(--border-color); background-color: var(--panel-bg); color: var(--text-color); cursor: pointer; font-family: var(--font-main); font-size: 0.9rem; transition: background, color 0.2s; text-shadow: var(--text-shadow); } .btn:hover { background-color: var(--code-bg); } .btn-primary { background-color: var(--primary-color); color: var(--white-text); border: 1px solid var(--primary-dark); } .btn-primary:hover { background-color: var(--primary-dark); } .btn-secondary { background-color: var(--secondary-color); color: var(--white-text); border: 1px solid var(--secondary-dark); } .btn-secondary:hover { background-color: var(--secondary-dark); } .btn img { width: 0.8rem; height: 0.8rem; margin-right: 0.3rem; } /* Button states */ .btn-disabled { opacity: 0.6; cursor: not-allowed; } .success { background-color: var(--success-color); border: 1px solid var(--success-color); } .success:hover, .success:focus { background-color: var(--success-color-dark); border: 1px solid var(--success-color-dark); } .validation-indicators-container { /*position: absolute;*/ /*top: 1rem;*/ /*right: 8rem;*/ display: flex; gap: 5px; z-index: 5; } .validation-success-indicator { background-color: var(--success-color); color: var(--white-text); width: 20px; height: 20px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; } /* Module selector button with progress */ #module-selector-btn { overflow: hidden; } /* Modal */ .modal-container { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: var(--modal-bg); display: flex; justify-content: center; align-items: center; z-index: 1000; } .modal { background-color: var(--panel-bg); border-radius: var(--border-radius-lg); box-shadow: var(--shadow-modal); width: 90%; max-width: 600px; max-height: 80vh; overflow-y: auto; } .modal-header { padding: var(--spacing-md); border-bottom: 1px solid var(--border-color); display: flex; justify-content: space-between; align-items: center; } .modal-content { padding: var(--spacing-lg); } .modal-content ol, .modal-content ul { margin-left: var(--spacing-lg); margin-bottom: var(--spacing-md); } .modal-content h3 { margin-bottom: 0.2rem; font-size: 1.2rem; } .modal-content h4 { margin-bottom: 0.1rem; font-size: 1rem; } .modal-content p { margin-bottom: var(--spacing-md); } .modal-close { background: none; border: none; font-size: 1.5rem; cursor: pointer; color: var(--light-text); } /* Feedback styles */ .feedback-success { position: absolute; bottom: 0.8rem; right: 1.6rem; color: var(--success-color-light); font-weight: 800; padding: var(--spacing-xs); border-radius: var(--border-radius-sm); background-color: var(--success-bg-medium); border-left: 3px solid var(--success-color); transition: all 0.3s ease; } .feedback-error { position: absolute; bottom: 0.8rem; right: 1.6rem; color: var(--text-color); font-weight: 500; padding: var(--spacing-xs); border-radius: var(--border-radius-sm); background-color: var(--error-bg-light); border-left: 3px solid var(--white-text); } .feedback-error kbd { background-color: var(--error-bg-light); color: var(--text-color); border-radius: var(--border-radius-sm); padding: calc(var(--spacing-xs) / 2); font-size: 0.7rem; letter-spacing: -0.75px; } /* Success states */ .success-highlight { border-left: var(--border-accent) solid var(--success-color); transition: all 0.3s ease; } .success-text { color: var(--success-color); transition: color 0.3s ease; } .success-instruction { background-color: var(--success-bg-light); border-left: var(--border-accent) solid var(--success-color); padding: var(--spacing-md); border-radius: var(--border-radius-sm); } /* Utility classes */ .hidden { display: none; } /* Completed lesson indicators */ .completion-badge { display: inline-block; margin-left: 0.8rem; padding: 0.2rem 0.6rem; font-size: 0.7rem; font-weight: 600; color: var(--white-text); background-color: var(--badge-bg); border-radius: 1rem; vertical-align: middle; text-transform: uppercase; letter-spacing: 0.5px; } /* Update run button styling when in re-run state */ #run-btn.re-run { background-color: var(--success-color); border-color: var(--success-color); } #run-btn.re-run:hover { background-color: var(--success-color-dark); border-color: var(--success-color-dark); }