sizzlebop's picture
Upload 35 files
94ecb74 verified
"""
🎨 Styling and CSS for CourseCrafter UI
Custom styling for Gradio components.
"""
def get_custom_css() -> str:
"""Get custom CSS for the CourseCrafter interface"""
return """
/* CourseCrafter AI Custom Styling - Dark Theme */
/* Global dark theme overrides */
.gradio-container {
background: #1a1a2e !important;
color: #e0e7ff !important;
}
.header-container {
text-align: center;
padding: 2rem;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border-radius: 10px;
margin-bottom: 2rem;
box-shadow: 0 4px 8px rgba(0,0,0,0.3);
}
.header-container h1 {
font-size: 2.5rem;
margin-bottom: 0.5rem;
font-weight: bold;
text-shadow: 0 2px 4px rgba(0,0,0,0.3);
}
.header-container p {
font-size: 1.1rem;
opacity: 0.9;
}
.progress-container {
padding: 1rem;
background: #2d2d54;
border-radius: 8px;
border-left: 4px solid #667eea;
margin: 1rem 0;
color: #e0e7ff;
}
.success {
color: #28a745 !important;
font-weight: bold;
padding: 0.5rem;
background: #1e4d2b;
border-radius: 4px;
border: 1px solid #28a745;
}
.error {
color: #dc3545 !important;
font-weight: bold;
padding: 0.5rem;
background: #4d1e1e;
border-radius: 4px;
border: 1px solid #dc3545;
}
.warning {
color: #ffc107 !important;
font-weight: bold;
padding: 0.5rem;
background: #4d3d1e;
border-radius: 4px;
border: 1px solid #ffc107;
}
.progress {
color: #17a2b8 !important;
font-weight: bold;
padding: 0.5rem;
background: #1e3d4d;
border-radius: 4px;
border: 1px solid #17a2b8;
}
.flashcard {
background: #fff;
border: 1px solid #dee2e6;
border-radius: 8px;
padding: 1rem;
margin: 0.5rem 0;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.quiz {
background: #e3f2fd;
border: 1px solid #bbdefb;
border-radius: 8px;
padding: 1rem;
margin: 0.5rem 0;
}
/* Dark theme form inputs */
.gradio-textbox, .gradio-dropdown, .gradio-slider {
background: #2d2d54 !important;
border: 2px solid #4a4a7a !important;
border-radius: 8px !important;
color: #e0e7ff !important;
transition: border-color 0.3s ease !important;
}
.gradio-textbox:focus, .gradio-dropdown:focus {
border-color: #667eea !important;
box-shadow: 0 0 0 0.2rem rgba(102, 126, 234, 0.25) !important;
background: #3a3a6b !important;
}
.gradio-textbox::placeholder {
color: #8b9dc3 !important;
}
/* Button styling */
.gradio-button {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
border: none !important;
border-radius: 8px !important;
color: white !important;
font-weight: bold !important;
transition: all 0.3s ease !important;
box-shadow: 0 4px 8px rgba(0,0,0,0.3) !important;
}
.gradio-button:hover {
transform: translateY(-2px) !important;
box-shadow: 0 6px 12px rgba(0,0,0,0.4) !important;
}
/* Ensure all buttons use the same blue theme */
button {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
border: none !important;
border-radius: 8px !important;
color: white !important;
font-weight: bold !important;
transition: all 0.3s ease !important;
box-shadow: 0 4px 8px rgba(0,0,0,0.3) !important;
}
button:hover {
transform: translateY(-2px) !important;
box-shadow: 0 6px 12px rgba(0,0,0,0.4) !important;
}
/* Tab styling */
.gradio-tabs {
border-radius: 8px !important;
overflow: hidden !important;
background: #2d2d54 !important;
}
.gradio-tab {
background: #3a3a6b !important;
border: 1px solid #4a4a7a !important;
padding: 0.75rem 1.5rem !important;
font-weight: 500 !important;
color: #b8c5d6 !important;
transition: all 0.3s ease !important;
}
.gradio-tab.selected {
background: #667eea !important;
color: white !important;
border-color: #667eea !important;
}
.gradio-tab:hover:not(.selected) {
background: #4a4a7a !important;
color: #e0e7ff !important;
}
/* Labels and text */
label {
color: #e0e7ff !important;
font-weight: 500 !important;
}
/* Slider styling */
.gradio-slider input[type="range"] {
background: #4a4a7a !important;
}
.gradio-slider input[type="range"]::-webkit-slider-thumb {
background: #667eea !important;
}
.gradio-slider input[type="range"]::-moz-range-thumb {
background: #667eea !important;
}
/* Course content styling */
.lessons-container {
max-height: 600px;
overflow-y: auto;
padding: 1rem;
}
.lesson-card {
background: white;
border: 1px solid #dee2e6;
border-radius: 8px;
padding: 1.5rem;
margin: 1rem 0;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.lesson-card h3 {
color: #667eea;
margin-bottom: 1rem;
}
.flashcards-container {
max-height: none !important;
overflow: visible !important;
padding: 1rem;
}
.quiz-container {
max-height: none !important;
overflow: visible !important;
padding: 1rem;
}
/* Chat interface styling - Dark Theme */
.chat-window {
background: #2d2d54 !important;
border-radius: 12px !important;
padding: 1rem !important;
margin: 1rem 0 !important;
border: 1px solid #4a4a7a !important;
}
.chat-messages {
max-height: 400px !important;
overflow-y: auto !important;
padding: 0.5rem !important;
}
.chat-message {
margin: 1rem 0 !important;
display: flex !important;
align-items: flex-start !important;
gap: 0.75rem !important;
}
.chat-message.user-message {
flex-direction: row-reverse !important;
}
.chat-message.assistant-message {
flex-direction: row !important;
}
.message-avatar {
width: 40px !important;
height: 40px !important;
border-radius: 50% !important;
background: #667eea !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
font-size: 1.2rem !important;
flex-shrink: 0 !important;
}
.user-message .message-avatar {
background: #764ba2 !important;
}
.message-content {
flex: 1 !important;
max-width: 70% !important;
}
.message-text {
background: #3a3a6b !important;
color: #e0e7ff !important;
padding: 0.75rem 1rem !important;
border-radius: 12px !important;
line-height: 1.5 !important;
word-wrap: break-word !important;
}
.user-message .message-text {
background: #667eea !important;
color: white !important;
}
.assistant-message .message-text {
background: #4a4a7a !important;
color: #e0e7ff !important;
}
.info {
background: #2d3748 !important;
border: 1px solid #4a5568 !important;
border-radius: 8px !important;
padding: 1rem !important;
color: #a0aec0 !important;
text-align: center !important;
font-style: italic !important;
}
/* Note: Flashcard styling is now handled inline in the format_flashcards function */
/* Note: Quiz styling is now handled inline in the format_quiz function */
/* Note: Lesson styling is now handled inline in the format_lessons function */
/* Enhanced Course Header Styling */
.course-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important;
color: white !important;
padding: 2rem !important;
border-radius: 12px !important;
margin: 1rem 0 !important;
box-shadow: 0 4px 8px rgba(0,0,0,0.3) !important;
text-align: center !important;
}
.course-header h1 {
font-size: 2.2rem !important;
margin-bottom: 1rem !important;
font-weight: bold !important;
text-shadow: 0 2px 4px rgba(0,0,0,0.3) !important;
color: white !important;
}
.course-stats {
display: flex !important;
justify-content: center !important;
gap: 1.5rem !important;
flex-wrap: wrap !important;
margin-top: 1rem !important;
}
.course-stats .stat {
background: rgba(255,255,255,0.2) !important;
padding: 0.5rem 1rem !important;
border-radius: 20px !important;
font-size: 0.9rem !important;
font-weight: 500 !important;
color: white !important;
backdrop-filter: blur(10px) !important;
}
/* Progress Tracker Styling */
.step-indicator {
background: #2d2d54 !important;
border: 2px solid #4a4a7a !important;
border-radius: 12px !important;
padding: 1.5rem !important;
margin: 1rem 0 !important;
color: #e0e7ff !important;
text-align: center !important;
}
.step-indicator.active {
border-color: #667eea !important;
background: #3a3a6b !important;
}
.step-indicator.complete {
border-color: #28a745 !important;
background: #1e4d2b !important;
color: #28a745 !important;
}
.step-icon {
font-size: 2rem !important;
margin-bottom: 0.5rem !important;
}
.step-text {
font-size: 1.2rem !important;
font-weight: bold !important;
margin-bottom: 0.5rem !important;
}
.step-message {
font-size: 0.9rem !important;
opacity: 0.8 !important;
}
/* Note: All component-specific styling is now handled inline for better dark theme support */
/* Responsive design */
@media (max-width: 768px) {
.header-container h1 {
font-size: 2rem;
}
.header-container p {
font-size: 1rem;
}
.lesson-card {
padding: 1rem;
}
}
"""
def get_theme_colors() -> dict:
"""Get theme color palette"""
return {
"primary": "#d068a5",
"secondary": "#764ba2",
"success": "#37cb5a",
"error": "#dc3545",
"warning": "#eec54c",
"info": "#09a6be",
"light": "#f5f7e6",
"dark": "#343a40"
}
def get_component_styles() -> dict:
"""Get component-specific styles"""
return {
"button_primary": {
"background": "linear-gradient(135deg, #667eea 0%, #764ba2 100%)",
"color": "white",
"border": "none",
"border_radius": "8px",
"font_weight": "bold"
},
"card": {
"background": "white",
"border": "1px solid #dee2e6",
"border_radius": "8px",
"padding": "1rem",
"box_shadow": "0 2px 4px rgba(0,0,0,0.1)"
},
"progress_bar": {
"background": "#d1f0e7",
"border_radius": "4px",
"height": "8px"
}
}