Nipun Claude commited on
Commit
73166b8
·
1 Parent(s): d0f303d

Polish UI with compact design and better UX

Browse files

Interface improvements:
- Add clear label for AI model dropdown
- Compact quick queries with smaller text and truncation
- Reduce header vertical space with smaller logo and fonts
- Hide image filename text when displaying charts
- Improve sidebar button styling with custom CSS

UX enhancements:
- Reduce UI jumping by limiting auto-scroll to processing only
- Better spacing throughout with reduced margins
- Cleaner visual hierarchy with appropriate font sizes
- More professional and academic appearance

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <[email protected]>

Files changed (1) hide show
  1. app.py +42 -21
app.py CHANGED
@@ -201,6 +201,23 @@ st.markdown("""
201
  background-color: #0b5ed7;
202
  }
203
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
204
  /* Code container styling */
205
  .code-container {
206
  margin: 1rem 0;
@@ -469,16 +486,17 @@ header_col1, header_col2 = st.columns([2, 1])
469
 
470
  with header_col1:
471
  st.markdown("""
472
- <div style='display: flex; align-items: center; gap: 0.75rem; margin-bottom: 1rem;'>
473
- <div style='width: 32px; height: 32px; background: #3b82f6; border-radius: 8px; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold;'>V</div>
474
  <div>
475
- <h1 style='margin: 0; font-size: 1.25rem; font-weight: 600; color: #1e293b;'>VayuChat</h1>
476
- <p style='margin: 0; font-size: 0.875rem; color: #64748b;'>Environmental Data Analysis</p>
477
  </div>
478
  </div>
479
  """, unsafe_allow_html=True)
480
 
481
  with header_col2:
 
482
  model_name = st.selectbox(
483
  "Model:",
484
  available_models,
@@ -487,7 +505,7 @@ with header_col2:
487
  label_visibility="collapsed"
488
  )
489
 
490
- st.markdown("<hr style='margin: 1rem 0; border: none; border-top: 1px solid #e2e8f0;'>", unsafe_allow_html=True)
491
 
492
 
493
  # Load data with error handling
@@ -528,15 +546,14 @@ with st.sidebar:
528
  "Plot monthly average PM2.5 for 2023"
529
  ]
530
 
531
- # Quick query buttons in sidebar
532
  selected_prompt = None
533
  for i, question in enumerate(questions[:6]): # Show only first 6
534
- if st.button(
535
- question,
536
- key=f"sidebar_prompt_{i}",
537
- help=question,
538
- use_container_width=True
539
- ):
540
  selected_prompt = question
541
 
542
  st.markdown("---")
@@ -606,15 +623,19 @@ def show_custom_response(response):
606
  </div>
607
  """, unsafe_allow_html=True)
608
  elif role == "assistant":
 
 
 
609
  # Assistant message with left alignment - reduced margins
610
- st.markdown(f"""
611
- <div style='display: flex; justify-content: flex-start; margin: 1rem 0;'>
612
- <div class='assistant-message'>
613
- <div class='assistant-info'>VayuChat</div>
614
- {content if isinstance(content, str) else str(content)}
 
 
615
  </div>
616
- </div>
617
- """, unsafe_allow_html=True)
618
 
619
  # Show generated code with Streamlit expander
620
  if response.get("gen_code"):
@@ -792,8 +813,8 @@ if st.session_state.get("processing"):
792
 
793
  st.rerun()
794
 
795
- # Auto-scroll to bottom
796
- if st.session_state.responses:
797
  st.markdown("<script>scrollToBottom();</script>", unsafe_allow_html=True)
798
 
799
  # Beautiful sidebar footer
 
201
  background-color: #0b5ed7;
202
  }
203
 
204
+ /* Sidebar button styling */
205
+ [data-testid="stSidebar"] .stButton > button {
206
+ background-color: #f8fafc;
207
+ color: #475569;
208
+ border: 1px solid #e2e8f0;
209
+ padding: 0.375rem 0.75rem;
210
+ font-size: 0.75rem;
211
+ font-weight: normal;
212
+ text-align: left;
213
+ }
214
+
215
+ [data-testid="stSidebar"] .stButton > button:hover {
216
+ background-color: #e0f2fe;
217
+ border-color: #0ea5e9;
218
+ color: #0c4a6e;
219
+ }
220
+
221
  /* Code container styling */
222
  .code-container {
223
  margin: 1rem 0;
 
486
 
487
  with header_col1:
488
  st.markdown("""
489
+ <div style='display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.5rem;'>
490
+ <div style='width: 28px; height: 28px; background: #3b82f6; border-radius: 6px; display: flex; align-items: center; justify-content: center; color: white; font-weight: bold; font-size: 0.875rem;'>V</div>
491
  <div>
492
+ <h1 style='margin: 0; font-size: 1.125rem; font-weight: 600; color: #1e293b;'>VayuChat</h1>
493
+ <p style='margin: 0; font-size: 0.75rem; color: #64748b;'>Environmental Data Analysis</p>
494
  </div>
495
  </div>
496
  """, unsafe_allow_html=True)
497
 
498
  with header_col2:
499
+ st.markdown("<p style='margin: 0 0 0.25rem 0; font-size: 0.75rem; color: #6b7280;'>AI Model:</p>", unsafe_allow_html=True)
500
  model_name = st.selectbox(
501
  "Model:",
502
  available_models,
 
505
  label_visibility="collapsed"
506
  )
507
 
508
+ st.markdown("<hr style='margin: 0.5rem 0; border: none; border-top: 1px solid #e2e8f0;'>", unsafe_allow_html=True)
509
 
510
 
511
  # Load data with error handling
 
546
  "Plot monthly average PM2.5 for 2023"
547
  ]
548
 
549
+ # Quick query buttons in sidebar - compact style
550
  selected_prompt = None
551
  for i, question in enumerate(questions[:6]): # Show only first 6
552
+ # Truncate long questions for display
553
+ display_text = question[:35] + "..." if len(question) > 35 else question
554
+
555
+ # Use columns to make buttons more compact
556
+ if st.button(display_text, key=f"sidebar_prompt_{i}", help=question, use_container_width=True):
 
557
  selected_prompt = question
558
 
559
  st.markdown("---")
 
623
  </div>
624
  """, unsafe_allow_html=True)
625
  elif role == "assistant":
626
+ # Check if content is an image filename - don't display the filename text
627
+ is_image_path = isinstance(content, str) and any(ext in content for ext in ['.png', '.jpg', '.jpeg'])
628
+
629
  # Assistant message with left alignment - reduced margins
630
+ if not is_image_path:
631
+ st.markdown(f"""
632
+ <div style='display: flex; justify-content: flex-start; margin: 1rem 0;'>
633
+ <div class='assistant-message'>
634
+ <div class='assistant-info'>VayuChat</div>
635
+ {content if isinstance(content, str) else str(content)}
636
+ </div>
637
  </div>
638
+ """, unsafe_allow_html=True)
 
639
 
640
  # Show generated code with Streamlit expander
641
  if response.get("gen_code"):
 
813
 
814
  st.rerun()
815
 
816
+ # Minimal auto-scroll - only scroll when processing
817
+ if st.session_state.get("processing"):
818
  st.markdown("<script>scrollToBottom();</script>", unsafe_allow_html=True)
819
 
820
  # Beautiful sidebar footer