Spaces:
Running
Running
""" | |
CSS styles for UI components in the leaderboard application. | |
""" | |
from src.utils.config import dark_theme | |
def get_container_styles(): | |
""" | |
Get CSS styles for page containers | |
Returns: | |
str: CSS string for containers | |
""" | |
return f""" | |
.title-container {{ | |
padding: 0.75rem 0 1.5rem 0; | |
text-align: center; | |
color: white; | |
margin-bottom: 0.5rem; | |
}} | |
.title {{ | |
font-size: 64px; | |
font-weight: 700; | |
margin-bottom: 15px; | |
color: {dark_theme['title_color']}; | |
}} | |
.subtitle {{ | |
font-size: 20px; | |
font-weight: 400; | |
opacity: 0.9; | |
color: {dark_theme['subtitle_color']}; | |
}} | |
""" | |
def get_links_bar_styles(): | |
""" | |
Get CSS styles for the links bar below the header | |
Returns: | |
str: CSS string for links bar | |
""" | |
return f""" | |
.links-bar {{ | |
text-align: center; | |
padding: 0 0 15px 0; | |
margin-bottom: 25px; | |
font-size: 14px; | |
border-bottom: 1px solid {dark_theme['border']}; | |
}} | |
.link-item {{ | |
color: {dark_theme['primary']}; | |
text-decoration: none; | |
transition: opacity 0.2s ease; | |
margin: 0 3px; | |
font-weight: 500; | |
}} | |
.link-item:hover {{ | |
opacity: 0.8; | |
text-decoration: underline; | |
}} | |
.info-item {{ | |
color: {dark_theme['text_color']}; | |
margin: 0 3px; | |
font-weight: 400; | |
}} | |
""" | |
def get_card_styles(): | |
""" | |
Get CSS styles for cards | |
Returns: | |
str: CSS string for cards | |
""" | |
return f""" | |
.card {{ | |
background-color: {dark_theme['card_bg']}; | |
border-radius: 12px; | |
padding: 24px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.15); | |
margin-bottom: 24px; | |
transition: transform 0.2s, box-shadow 0.2s; | |
}} | |
.card:hover {{ | |
transform: translateY(-2px); | |
box-shadow: 0 8px 15px rgba(0, 0, 0, 0.2); | |
}} | |
.card-title {{ | |
font-size: 20px; | |
font-weight: 600; | |
margin-bottom: 16px; | |
color: {dark_theme['text_color']}; | |
display: flex; | |
align-items: center; | |
}} | |
.card-title-icon {{ | |
margin-right: 10px; | |
font-size: 22px; | |
}} | |
""" | |
def get_task_card_styles(): | |
""" | |
Get CSS styles for task cards | |
Returns: | |
str: CSS string for task cards | |
""" | |
return f""" | |
.task-card {{ | |
background-color: {dark_theme['card_bg']}; | |
border-radius: 12px; | |
padding: 20px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.15); | |
margin-bottom: 16px; | |
border-left: 4px solid {dark_theme['task_border']}; | |
}} | |
.task-title {{ | |
font-size: 18px; | |
font-weight: 600; | |
color: {dark_theme['task_title']}; | |
margin-bottom: 8px; | |
}} | |
.task-description {{ | |
font-size: 15px; | |
color: {dark_theme['text_color']}; | |
line-height: 1.5; | |
}} | |
""" | |
def get_button_styles(): | |
""" | |
Get CSS styles for buttons | |
Returns: | |
str: CSS string for buttons | |
""" | |
return f""" | |
/* Button styling - completely new and modern */ | |
div.stButton > button {{ | |
background-color: {dark_theme['card_bg']}; | |
color: {dark_theme['text_color']}; | |
border: 1px solid {dark_theme['border']}; | |
border-radius: 8px; | |
padding: 8px 16px; | |
font-size: 14px; | |
font-weight: 500; | |
margin: 4px; | |
transition: all 0.2s ease; | |
}} | |
div.stButton > button:hover {{ | |
background-color: {dark_theme['hover']}; | |
border-color: {dark_theme['border']}; | |
transform: translateY(-1px); | |
}} | |
/* Active button styling */ | |
div.stButton > button.selected {{ | |
background-color: {dark_theme['primary']} !important; | |
color: white !important; | |
border-color: {dark_theme['primary']} !important; | |
}} | |
""" | |
def get_tabs_styles(): | |
""" | |
Get CSS styles for tabs | |
Returns: | |
str: CSS string for tabs | |
""" | |
return f""" | |
/* Tabs styling */ | |
.stTabs [data-baseweb="tab-list"] {{ | |
gap: 8px; | |
margin-bottom: 20px; | |
}} | |
.stTabs [data-baseweb="tab"] {{ | |
border-radius: 8px 8px 0 0; | |
padding: 12px 24px; | |
font-weight: 500; | |
background-color: {dark_theme['hover']}; | |
color: {dark_theme['text_color']}; | |
}} | |
.stTabs [data-baseweb="tab"][aria-selected="true"] {{ | |
background-color: {dark_theme['primary']}; | |
color: white; | |
}} | |
.stTabs [data-baseweb="tab-highlight"] {{ | |
background-color: transparent; | |
}} | |
""" | |
def get_alert_styles(): | |
""" | |
Get CSS styles for alerts and information boxes | |
Returns: | |
str: CSS string for alerts | |
""" | |
return f""" | |
/* Alert/info box styling */ | |
.info-box {{ | |
background-color: {dark_theme['info_bg']}; | |
border-left: 4px solid {dark_theme['info_border']}; | |
border-radius: 8px; | |
padding: 16px; | |
margin-bottom: 16px; | |
color: {dark_theme['text_color']}; | |
}} | |
.warning-box {{ | |
background-color: {dark_theme['warning_bg']}; | |
border-left: 4px solid {dark_theme['warning_border']}; | |
border-radius: 8px; | |
padding: 16px; | |
margin-bottom: 16px; | |
color: {dark_theme['text_color']}; | |
}} | |
""" | |
def get_footer_styles(): | |
""" | |
Get CSS styles for the footer | |
Returns: | |
str: CSS string for the footer | |
""" | |
return f""" | |
/* Footer styling */ | |
.footer {{ | |
text-align: center; | |
padding: 24px; | |
margin-top: 40px; | |
color: {dark_theme['footer_color']}; | |
font-size: 14px; | |
border-top: 1px solid {dark_theme['footer_border']}; | |
}} | |
""" | |
def get_all_component_styles(): | |
""" | |
Get all component styles combined | |
Returns: | |
str: Combined CSS string for all components | |
""" | |
styles = [ | |
get_container_styles(), | |
get_links_bar_styles(), | |
get_card_styles(), | |
get_task_card_styles(), | |
get_button_styles(), | |
get_tabs_styles(), | |
get_alert_styles(), | |
get_footer_styles(), | |
get_metric_definition_styles() | |
] | |
return '\n'.join(styles) | |
def get_metric_definition_styles(): | |
""" | |
Get CSS styles for metric definition component | |
Returns: | |
str: CSS string for metric definition | |
""" | |
return f""" | |
/* Metric definition styling */ | |
.metric-definition {{ | |
margin-top: 20px; | |
background-color: {dark_theme['card_bg']}; | |
border-radius: 8px; | |
padding: 16px 20px; | |
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
border-left: 4px solid {dark_theme['secondary']}; | |
}} | |
.metric-definition h4 {{ | |
color: {dark_theme['secondary']}; | |
margin-top: 0; | |
margin-bottom: 8px; | |
font-size: 18px; | |
font-weight: 600; | |
}} | |
.metric-definition p {{ | |
color: {dark_theme['text_color']}; | |
font-size: 14px; | |
line-height: 1.6; | |
margin-bottom: 0; | |
}} | |
""" |