Nischal Subedi
commited on
Commit
·
cc72c3f
1
Parent(s):
cccb1ef
UI update
Browse files
app.py
CHANGED
|
@@ -249,7 +249,7 @@ Answer:"""
|
|
| 249 |
if not api_key or not api_key.strip() or not api_key.startswith("sk-"):
|
| 250 |
return "<div class='error-message'><span class='error-icon'>⚠️</span>Please provide a valid OpenAI API key (starting with 'sk-'). <a href='https://platform.openai.com/api-keys' target='_blank'>OpenAI</a>.</div>"
|
| 251 |
if not state or state == "Select a state..." or "Error" in state:
|
| 252 |
-
return "<div class='error-message'><span class='error-icon'>⚠️</span>Please select a valid state from the list.</div>"
|
| 253 |
if not query or not query.strip():
|
| 254 |
return "<div class='error-message'><span class='error-icon'>⚠️</span>Please enter your question in the text box.</div>"
|
| 255 |
|
|
@@ -271,7 +271,6 @@ Answer:"""
|
|
| 271 |
# DEBUG: Print states to console to verify if data is loaded
|
| 272 |
print(f"DEBUG: States loaded for selection: {available_states_list}")
|
| 273 |
# Ensure "Select a state..." is always the first option
|
| 274 |
-
# For Radio, we might want a distinct initial "no selection" state
|
| 275 |
radio_choices = ["Select a state..."] + (available_states_list if available_states_list and "Error" not in available_states_list[0] else ["Error: States unavailable"])
|
| 276 |
initial_value_radio = radio_choices[0] # Set initial value to the prompt
|
| 277 |
except Exception as e: # Catch-all for safety
|
|
@@ -306,12 +305,12 @@ Answer:"""
|
|
| 306 |
/* Import legible fonts from Google Fonts */
|
| 307 |
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Poppins:wght@600;700;800&display=swap');
|
| 308 |
|
| 309 |
-
/* Root variables for consistent theming - adjusted for
|
| 310 |
:root {
|
| 311 |
--primary-color: #FF8C00; /* Darker Orange for buttons/accents */
|
| 312 |
--primary-hover: #E07B00; /* Slightly darker orange for hover */
|
| 313 |
-
--background-primary: hsl(30, 100%, 99%); /* Very bright, almost white,
|
| 314 |
-
--background-secondary: hsl(30, 100%, 96%); /* Slightly deeper,
|
| 315 |
--text-primary: #4A3C32; /* Dark warm brown/charcoal for main text */
|
| 316 |
--text-secondary: #8C7B6F; /* Muted warm gray/brown for secondary text */
|
| 317 |
--border-color: hsl(30, 70%, 85%); /* Light, warm orange-brown for borders */
|
|
@@ -353,7 +352,7 @@ Answer:"""
|
|
| 353 |
background-color: var(--background-secondary) !important; /* Overall background of the container */
|
| 354 |
box-shadow: none !important; /* Remove default gradio container shadow */
|
| 355 |
}
|
| 356 |
-
/* Ensure all main content sections
|
| 357 |
.main-dashboard-container > * {
|
| 358 |
background: linear-gradient(145deg, var(--background-primary) 0%, var(--background-secondary) 100%) !important;
|
| 359 |
}
|
|
@@ -378,8 +377,8 @@ Answer:"""
|
|
| 378 |
left: 0;
|
| 379 |
width: 100%;
|
| 380 |
height: 100%;
|
| 381 |
-
background: radial-gradient(circle at top left, rgba(255,140,0,0.
|
| 382 |
-
radial-gradient(circle at bottom right, rgba(255,140,0,0.
|
| 383 |
z-index: 0;
|
| 384 |
opacity: 0.8;
|
| 385 |
pointer-events: none;
|
|
@@ -446,7 +445,7 @@ Answer:"""
|
|
| 446 |
transform: translateY(-3px) !important; /* More pronounced lift */
|
| 447 |
}
|
| 448 |
|
| 449 |
-
/*
|
| 450 |
.full-width-center {
|
| 451 |
display: flex !important;
|
| 452 |
justify-content: center !important;
|
|
@@ -456,7 +455,7 @@ Answer:"""
|
|
| 456 |
}
|
| 457 |
|
| 458 |
/* Section titles (h3 inside markdown) */
|
| 459 |
-
.section-title {
|
| 460 |
font-family: 'Poppins', sans-serif !important;
|
| 461 |
font-size: 1.7rem !important; /* Slightly larger */
|
| 462 |
font-weight: 700 !important; /* Bolder */
|
|
@@ -464,10 +463,10 @@ Answer:"""
|
|
| 464 |
margin: 0 0 1.25rem 0 !important; /* More space below title */
|
| 465 |
padding-bottom: 0.75rem !important;
|
| 466 |
border-bottom: 2px solid var(--border-color) !important; /* Underline effect */
|
| 467 |
-
display: block !important;
|
| 468 |
-
text-align: center !important;
|
| 469 |
-
width: fit-content !important;
|
| 470 |
-
margin-left: auto !important;
|
| 471 |
margin-right: auto !important;
|
| 472 |
letter-spacing: -0.01em !important;
|
| 473 |
}
|
|
@@ -510,7 +509,7 @@ Answer:"""
|
|
| 510 |
/* Styling for the radio button group (state selection) */
|
| 511 |
.gradio-radio {
|
| 512 |
padding: 0 !important; /* Remove any default padding */
|
| 513 |
-
margin-top:
|
| 514 |
}
|
| 515 |
/* Hide default radio circle/dot */
|
| 516 |
.gradio-radio input[type="radio"] {
|
|
@@ -585,14 +584,16 @@ Answer:"""
|
|
| 585 |
margin-top: 0.4rem !important; /* More space for info text */
|
| 586 |
text-align: left !important; /* Ensure info text is left aligned */
|
| 587 |
}
|
| 588 |
-
/* Input
|
| 589 |
-
.input-row
|
| 590 |
display: flex !important;
|
| 591 |
-
|
|
|
|
| 592 |
margin-bottom: 0.5rem !important;
|
| 593 |
}
|
| 594 |
.input-field {
|
| 595 |
-
flex:
|
|
|
|
| 596 |
}
|
| 597 |
|
| 598 |
/* Button styling improvements with active state for dynamism */
|
|
@@ -814,8 +815,8 @@ Answer:"""
|
|
| 814 |
.section-title {
|
| 815 |
font-size: 1.4rem !important;
|
| 816 |
}
|
| 817 |
-
.input-
|
| 818 |
-
flex-direction: column !important;
|
| 819 |
}
|
| 820 |
.button-row {
|
| 821 |
flex-direction: column !important; /* Stack buttons vertically */
|
|
@@ -883,8 +884,10 @@ Answer:"""
|
|
| 883 |
with gr.Group(elem_classes="dashboard-card-section"):
|
| 884 |
# Apply 'full-width-center' for section titles
|
| 885 |
gr.Markdown("<h3 class='section-title'>Ask Your Question</h3>", elem_classes="full-width-center")
|
| 886 |
-
|
| 887 |
-
|
|
|
|
|
|
|
| 888 |
query_input = gr.Textbox(
|
| 889 |
label="Your Question",
|
| 890 |
placeholder="E.g., What are the rules for security deposit returns in my state?",
|
|
@@ -892,13 +895,14 @@ Answer:"""
|
|
| 892 |
max_lines=15, # Increased max height
|
| 893 |
elem_classes=["input-field-group"]
|
| 894 |
)
|
| 895 |
-
with gr.Column(elem_classes="input-field", scale=
|
| 896 |
state_input = gr.Radio(
|
| 897 |
label="Select State",
|
| 898 |
choices=radio_choices,
|
| 899 |
value=initial_value_radio,
|
| 900 |
elem_classes=["input-field-group", "gradio-radio-custom"] # Added custom class for specific styling
|
| 901 |
)
|
|
|
|
| 902 |
with gr.Row(elem_classes="button-row"): # Row for action buttons
|
| 903 |
clear_button = gr.Button("Clear", variant="secondary", elem_classes=["gr-button-secondary"])
|
| 904 |
submit_button = gr.Button("Submit Query", variant="primary", elem_classes=["gr-button-primary"])
|
|
|
|
| 249 |
if not api_key or not api_key.strip() or not api_key.startswith("sk-"):
|
| 250 |
return "<div class='error-message'><span class='error-icon'>⚠️</span>Please provide a valid OpenAI API key (starting with 'sk-'). <a href='https://platform.openai.com/api-keys' target='_blank'>OpenAI</a>.</div>"
|
| 251 |
if not state or state == "Select a state..." or "Error" in state:
|
| 252 |
+
return "<div class='error-message'><span class='error-icon'>⚠️</span>Please select a valid state from the list.</div>"
|
| 253 |
if not query or not query.strip():
|
| 254 |
return "<div class='error-message'><span class='error-icon'>⚠️</span>Please enter your question in the text box.</div>"
|
| 255 |
|
|
|
|
| 271 |
# DEBUG: Print states to console to verify if data is loaded
|
| 272 |
print(f"DEBUG: States loaded for selection: {available_states_list}")
|
| 273 |
# Ensure "Select a state..." is always the first option
|
|
|
|
| 274 |
radio_choices = ["Select a state..."] + (available_states_list if available_states_list and "Error" not in available_states_list[0] else ["Error: States unavailable"])
|
| 275 |
initial_value_radio = radio_choices[0] # Set initial value to the prompt
|
| 276 |
except Exception as e: # Catch-all for safety
|
|
|
|
| 305 |
/* Import legible fonts from Google Fonts */
|
| 306 |
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Poppins:wght@600;700;800&display=swap');
|
| 307 |
|
| 308 |
+
/* Root variables for consistent theming - adjusted for a very warm, clean palette */
|
| 309 |
:root {
|
| 310 |
--primary-color: #FF8C00; /* Darker Orange for buttons/accents */
|
| 311 |
--primary-hover: #E07B00; /* Slightly darker orange for hover */
|
| 312 |
+
--background-primary: hsl(30, 100%, 99%); /* Very bright, almost white, distinctly warm cream */
|
| 313 |
+
--background-secondary: hsl(30, 100%, 96%); /* Slightly deeper, clear, warm peach/cream */
|
| 314 |
--text-primary: #4A3C32; /* Dark warm brown/charcoal for main text */
|
| 315 |
--text-secondary: #8C7B6F; /* Muted warm gray/brown for secondary text */
|
| 316 |
--border-color: hsl(30, 70%, 85%); /* Light, warm orange-brown for borders */
|
|
|
|
| 352 |
background-color: var(--background-secondary) !important; /* Overall background of the container */
|
| 353 |
box-shadow: none !important; /* Remove default gradio container shadow */
|
| 354 |
}
|
| 355 |
+
/* Ensure all main content sections have the gradient background */
|
| 356 |
.main-dashboard-container > * {
|
| 357 |
background: linear-gradient(145deg, var(--background-primary) 0%, var(--background-secondary) 100%) !important;
|
| 358 |
}
|
|
|
|
| 377 |
left: 0;
|
| 378 |
width: 100%;
|
| 379 |
height: 100%;
|
| 380 |
+
background: radial-gradient(circle at top left, rgba(255,140,0,0.25) 0%, transparent 60%), /* More vibrant orange tint */
|
| 381 |
+
radial-gradient(circle at bottom right, rgba(255,140,0,0.25) 0%, transparent 60%);
|
| 382 |
z-index: 0;
|
| 383 |
opacity: 0.8;
|
| 384 |
pointer-events: none;
|
|
|
|
| 445 |
transform: translateY(-3px) !important; /* More pronounced lift */
|
| 446 |
}
|
| 447 |
|
| 448 |
+
/* Class for Markdown blocks to center their content */
|
| 449 |
.full-width-center {
|
| 450 |
display: flex !important;
|
| 451 |
justify-content: center !important;
|
|
|
|
| 455 |
}
|
| 456 |
|
| 457 |
/* Section titles (h3 inside markdown) */
|
| 458 |
+
.section-title {
|
| 459 |
font-family: 'Poppins', sans-serif !important;
|
| 460 |
font-size: 1.7rem !important; /* Slightly larger */
|
| 461 |
font-weight: 700 !important; /* Bolder */
|
|
|
|
| 463 |
margin: 0 0 1.25rem 0 !important; /* More space below title */
|
| 464 |
padding-bottom: 0.75rem !important;
|
| 465 |
border-bottom: 2px solid var(--border-color) !important; /* Underline effect */
|
| 466 |
+
display: block !important;
|
| 467 |
+
text-align: center !important;
|
| 468 |
+
width: fit-content !important;
|
| 469 |
+
margin-left: auto !important;
|
| 470 |
margin-right: auto !important;
|
| 471 |
letter-spacing: -0.01em !important;
|
| 472 |
}
|
|
|
|
| 509 |
/* Styling for the radio button group (state selection) */
|
| 510 |
.gradio-radio {
|
| 511 |
padding: 0 !important; /* Remove any default padding */
|
| 512 |
+
margin-top: 1rem !important; /* More space above radio buttons when below query */
|
| 513 |
}
|
| 514 |
/* Hide default radio circle/dot */
|
| 515 |
.gradio-radio input[type="radio"] {
|
|
|
|
| 584 |
margin-top: 0.4rem !important; /* More space for info text */
|
| 585 |
text-align: left !important; /* Ensure info text is left aligned */
|
| 586 |
}
|
| 587 |
+
/* Input column layout improvements */
|
| 588 |
+
.input-column { /* Renamed from .input-row */
|
| 589 |
display: flex !important;
|
| 590 |
+
flex-direction: column !important; /* Stack items vertically */
|
| 591 |
+
gap: 1.25rem !important; /* Consistent gap between query and state input */
|
| 592 |
margin-bottom: 0.5rem !important;
|
| 593 |
}
|
| 594 |
.input-field {
|
| 595 |
+
flex: none !important; /* Remove flex sizing as items are stacked */
|
| 596 |
+
width: 100% !important; /* Ensure each field takes full width */
|
| 597 |
}
|
| 598 |
|
| 599 |
/* Button styling improvements with active state for dynamism */
|
|
|
|
| 815 |
.section-title {
|
| 816 |
font-size: 1.4rem !important;
|
| 817 |
}
|
| 818 |
+
.input-column { /* Apply vertical stacking for columns */
|
| 819 |
+
flex-direction: column !important;
|
| 820 |
}
|
| 821 |
.button-row {
|
| 822 |
flex-direction: column !important; /* Stack buttons vertically */
|
|
|
|
| 884 |
with gr.Group(elem_classes="dashboard-card-section"):
|
| 885 |
# Apply 'full-width-center' for section titles
|
| 886 |
gr.Markdown("<h3 class='section-title'>Ask Your Question</h3>", elem_classes="full-width-center")
|
| 887 |
+
|
| 888 |
+
# Changed from gr.Row to gr.Column for vertical stacking
|
| 889 |
+
with gr.Column(elem_classes="input-column"): # New column to stack inputs
|
| 890 |
+
with gr.Column(elem_classes="input-field", scale=None): # Query box takes full width
|
| 891 |
query_input = gr.Textbox(
|
| 892 |
label="Your Question",
|
| 893 |
placeholder="E.g., What are the rules for security deposit returns in my state?",
|
|
|
|
| 895 |
max_lines=15, # Increased max height
|
| 896 |
elem_classes=["input-field-group"]
|
| 897 |
)
|
| 898 |
+
with gr.Column(elem_classes="input-field", scale=None): # State radio buttons take full width below
|
| 899 |
state_input = gr.Radio(
|
| 900 |
label="Select State",
|
| 901 |
choices=radio_choices,
|
| 902 |
value=initial_value_radio,
|
| 903 |
elem_classes=["input-field-group", "gradio-radio-custom"] # Added custom class for specific styling
|
| 904 |
)
|
| 905 |
+
|
| 906 |
with gr.Row(elem_classes="button-row"): # Row for action buttons
|
| 907 |
clear_button = gr.Button("Clear", variant="secondary", elem_classes=["gr-button-secondary"])
|
| 908 |
submit_button = gr.Button("Submit Query", variant="primary", elem_classes=["gr-button-primary"])
|