|
""" |
|
🎨 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" |
|
} |
|
} |