Spaces:
Sleeping
Sleeping
import streamlit as st | |
from settings import TECHNOLOGIES_LIST | |
class Layout: | |
def render_header(): | |
""" | |
Renders the header of the application with a logo and title. | |
""" | |
st.markdown( | |
""" | |
<style> | |
.header { | |
text-align: center; | |
font-size: 28px; /* Reduced size */ | |
font-weight: 600; /* Slightly lighter font weight */ | |
color: #034732; /* Darker green for a more professional look */ | |
margin-top: 15px; | |
margin-bottom: 5px; | |
} | |
.sub-header { | |
text-align: center; | |
font-size: 14px; /* Subtle and smaller font */ | |
color: #5E6472; /* Muted grayish-blue for contrast */ | |
margin-bottom: 20px; | |
} | |
.logo { | |
display: block; | |
margin: 0 auto; | |
max-width: 60px; /* Smaller logo size */ | |
height: auto; | |
margin-bottom: 10px; | |
filter: drop-shadow(0px 4px 4px rgba(0, 0, 0, 0.25)); /* Added subtle shadow */ | |
} | |
.divider { | |
height: 1px; | |
margin: 20px 0; | |
background-color: #D0D0D0; /* Light gray for a clean divider */ | |
border: none; | |
} | |
</style> | |
<div> | |
<img src="https://framerusercontent.com/images/QNgS2NOAyBozR6eFdgzSFhJRbY.png?scale-down-to=512" class="logo" /> | |
<div class="header">NonStop Assessments</div> | |
<div class="sub-header">Empowering talent, one question at a time.</div> | |
<hr class="divider"> | |
</div> | |
""", | |
unsafe_allow_html=True | |
) | |
def render_signup_form(): | |
""" | |
Renders the signup form for candidate details. | |
:return: Tuple containing name, email, experience, and selected technology. | |
""" | |
with st.form("signup_form"): | |
st.header("Sign Up") | |
name = st.text_input("Full Name", help="Please enter your full name") | |
email = st.text_input("Email", help="Please enter your email") | |
experience = st.slider("Total Years of Experience", 0, 20, 0, help="Select your years of experience") | |
technology = st.selectbox("Technology", TECHNOLOGIES_LIST, help="Select your primary technology") | |
submit = st.form_submit_button("Start Test") | |
if submit: | |
if not name or not email: | |
st.error("Name and Email are required! Please fill both fields.") | |
return None, None, None, None, None | |
return name, email, experience, technology, submit | |
return None, None, None, None, None | |
def render_instructions(): | |
""" | |
Renders test instructions for the candidates. | |
""" | |
st.header("Instructions") | |
st.info( | |
""" | |
1. Each question is multiple-choice. | |
""" | |
) | |
def render_progress_bar(current, total): | |
""" | |
Renders a progress bar for the test. | |
:param current: Current progress (integer). | |
:param total: Total progress (integer). | |
""" | |
st.progress(current / total) | |
def render_test_question(question, idx): | |
""" | |
Renders a single test question with multiple-choice options. | |
:param question: Dictionary containing question details. | |
:param idx: Index of the question for unique Streamlit keys. | |
:return: Selected option from the user. | |
""" | |
st.markdown(f""" | |
<div class="question-card"> | |
<b>Question {idx + 1}:</b> {question['question']} | |
</div> | |
""", | |
unsafe_allow_html=True, | |
) | |
selected_option = st.radio( | |
"", | |
[question['option1'], question['option2'], question['option3'], question['option4']], | |
key=f"q{idx}", | |
label_visibility="collapsed", | |
help="Choose the correct answer", | |
index=None | |
) | |
st.markdown("---") | |
return selected_option | |
def render_completion_message(score, total): | |
""" | |
Displays a completion message after the test is submitted. | |
:param score: Total score obtained by the candidate. | |
:param total: Total questions in the test. | |
""" | |
st.success("Test completed successfully! Great job on completing it. Thank you for your effort and dedication.") | |