File size: 19,371 Bytes
314fac4
65bd2d8
e7dc437
65bd2d8
 
e7dc437
65bd2d8
0d77848
ea1092e
65bd2d8
 
8ca2f9f
e7dc437
 
 
 
 
 
 
65bd2d8
314fac4
075a523
65bd2d8
075a523
41d5de2
314fac4
431d541
41d5de2
2b8aece
65bd2d8
 
41d5de2
 
075a523
41d5de2
 
 
e7dc437
 
74bd5a5
65bd2d8
 
41d5de2
 
 
1ae38f2
e7dc437
1ae38f2
74bd5a5
65bd2d8
 
41d5de2
65bd2d8
075a523
e7dc437
41d5de2
075a523
e7dc437
74bd5a5
65bd2d8
 
 
075a523
 
41d5de2
075a523
e7dc437
075a523
74bd5a5
65bd2d8
 
 
075a523
 
 
 
 
65bd2d8
075a523
65bd2d8
e7dc437
075a523
 
 
74bd5a5
65bd2d8
 
075a523
 
e7dc437
075a523
74bd5a5
65bd2d8
 
41d5de2
 
075a523
 
 
41d5de2
e7dc437
41d5de2
 
075a523
41d5de2
 
0d77848
 
1ae38f2
075a523
 
41d5de2
 
075a523
41d5de2
e7dc437
075a523
 
 
0d77848
41d5de2
 
075a523
 
 
 
41d5de2
 
075a523
e7dc437
 
075a523
65bd2d8
 
0d77848
075a523
 
0d77848
 
 
74bd5a5
 
075a523
 
41d5de2
075a523
41d5de2
075a523
e7dc437
 
 
075a523
 
 
 
 
 
41d5de2
 
075a523
 
 
 
 
 
 
 
74bd5a5
65bd2d8
075a523
 
 
e7dc437
 
075a523
 
 
 
e7dc437
 
075a523
 
 
1ae38f2
 
65bd2d8
 
075a523
1ae38f2
 
 
 
 
 
075a523
 
1ae38f2
 
 
0d77848
 
 
74bd5a5
65bd2d8
 
431d541
65bd2d8
 
 
0d77848
41d5de2
 
 
 
 
 
 
 
 
075a523
65bd2d8
314fac4
075a523
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65bd2d8
314fac4
e7dc437
 
1ae38f2
 
 
e7dc437
 
0d77848
 
 
 
 
 
 
e7dc437
 
 
0d77848
 
e7dc437
075a523
 
65bd2d8
e7dc437
075a523
 
 
e7dc437
075a523
e7dc437
075a523
e7dc437
 
 
41d5de2
e7dc437
 
0d77848
41d5de2
075a523
e7dc437
06d7e14
e7dc437
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
06d7e14
e7dc437
 
 
 
 
 
 
 
 
41d5de2
e7dc437
 
 
 
 
 
41d5de2
e7dc437
 
2b8aece
65bd2d8
 
 
 
 
075a523
 
65bd2d8
 
74bd5a5
41d5de2
 
 
 
 
 
075a523
 
 
74bd5a5
075a523
 
74bd5a5
075a523
 
 
4ad4653
075a523
 
 
 
 
 
1ae38f2
075a523
 
1ae38f2
075a523
 
 
 
 
1ae38f2
075a523
0d77848
1ae38f2
 
075a523
1ae38f2
 
 
 
 
 
075a523
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1ae38f2
075a523
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4ad4653
075a523
 
 
 
 
 
 
 
 
 
4ad4653
075a523
 
41d5de2
075a523
 
41d5de2
075a523
 
 
 
 
41d5de2
075a523
 
 
 
 
 
41d5de2
075a523
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41d5de2
075a523
 
 
 
 
 
 
 
 
 
41d5de2
075a523
 
 
 
 
 
 
 
 
4ad4653
075a523
 
 
 
 
1ae38f2
075a523
 
 
 
 
65bd2d8
075a523
 
 
 
 
 
 
 
 
 
65bd2d8
 
 
 
075a523
 
 
65bd2d8
 
4ad4653
65bd2d8
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
# app.py
import streamlit as st
import os
import time
import plotly.express as px
from groq import Groq
from dotenv import load_dotenv
import pycountry

# Load environment variables
load_dotenv()

# Initialize Groq client
try:
    client = Groq(api_key=os.getenv("GROQ_API_KEY"))
except:
    st.error("Failed to initialize Groq client. Please check your API key.")
    st.stop()

# Set up Streamlit page
st.set_page_config(
    page_title="LexGuardian",
    page_icon="โš–๏ธ",
    layout="wide",
    initial_sidebar_state="collapsed"
)

# Custom CSS for professional styling
st.markdown("""
<style>
    :root {
        --primary: #2c3e50;
        --secondary: #3498db;
        --accent: #e74c3c;
        --light: #ecf0f1;
        --dark: #2c3e50;
        --success: #27ae60;
        --card-shadow: 0 6px 20px rgba(0,0,0,0.08);
        --transition: all 0.3s ease;
    }
    
    .stApp {
        background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
        color: #333;
        font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
        max-width: 1200px;
        margin: 0 auto;
        padding: 0 20px;
    }
    
    .header {
        background: linear-gradient(90deg, var(--primary) 0%, var(--secondary) 100%);
        color: white;
        padding: 2rem 1.5rem;
        border-radius: 0 0 25px 25px;
        box-shadow: var(--card-shadow);
        margin-bottom: 2rem;
        text-align: center;
    }
    
    .card {
        background: white;
        border-radius: 15px;
        padding: 1.8rem;
        box-shadow: var(--card-shadow);
        margin-bottom: 1.8rem;
        transition: var(--transition);
        border-left: 4px solid var(--accent);
    }
    
    .scenario-btn {
        width: 100%;
        padding: 1.1rem;
        background: white;
        color: var(--primary);
        border: 2px solid var(--secondary);
        border-radius: 12px;
        font-weight: 600;
        margin: 0.7rem 0;
        cursor: pointer;
        transition: var(--transition);
        text-align: center;
        font-size: 1rem;
        box-shadow: 0 2px 8px rgba(0,0,0,0.1);
    }
    
    .scenario-btn:hover {
        background: linear-gradient(135deg, var(--secondary) 0%, #2980b9 100%);
        color: white;
        transform: translateY(-3px);
        box-shadow: 0 6px 15px rgba(0,0,0,0.15);
    }
    
    .response-card {
        background: white;
        border-left: 5px solid var(--success);
        border-radius: 12px;
        padding: 2rem;
        margin-top: 2rem;
        box-shadow: var(--card-shadow);
        animation: fadeIn 0.8s ease;
    }
    
    .country-card {
        display: flex;
        align-items: center;
        justify-content: flex-start;
        gap: 12px;
        width: 100%;
        padding: 1rem;
        border-radius: 12px;
        background: white;
        box-shadow: var(--card-shadow);
        margin-bottom: 12px;
        cursor: pointer;
        transition: var(--transition);
        border: 2px solid #e0e0e0;
        font-weight: 500;
        font-size: 1rem;
        text-align: left;
    }
    
    .country-card:hover {
        transform: translateY(-3px);
        box-shadow: 0 8px 20px rgba(0,0,0,0.12);
        border-color: var(--secondary);
    }
    
    .country-card.selected {
        background: linear-gradient(135deg, var(--light) 0%, #d6eaf8 100%);
        border: 2px solid var(--accent);
        box-shadow: 0 6px 15px rgba(0,0,0,0.1);
    }
    
    .country-flag {
        font-size: 1.5rem;
        min-width: 35px;
        text-align: center;
    }
    
    .footer {
        text-align: center;
        padding: 2rem;
        margin-top: 3rem;
        color: var(--dark);
        font-size: 0.9rem;
        background: rgba(236, 240, 241, 0.7);
        border-radius: 15px;
        box-shadow: var(--card-shadow);
    }
    
    .section-title {
        font-size: 1.4rem;
        color: var(--primary);
        margin-bottom: 1.2rem;
        padding-bottom: 0.5rem;
        border-bottom: 2px solid var(--accent);
    }
    
    .feature-card {
        background: white;
        border-radius: 12px;
        padding: 1.5rem;
        box-shadow: var(--card-shadow);
        margin-bottom: 1.5rem;
        transition: var(--transition);
        text-align: center;
    }
    
    .feature-card:hover {
        transform: translateY(-5px);
        box-shadow: 0 10px 25px rgba(0,0,0,0.12);
    }
    
    .feature-icon {
        font-size: 2.5rem;
        color: var(--accent);
        margin-bottom: 1rem;
    }
    
    @keyframes fadeIn {
        from { opacity: 0; transform: translateY(20px); }
        to { opacity: 1; transform: translateY(0); }
    }
    
    @media (max-width: 768px) {
        .header {
            padding: 1.5rem 1rem;
        }
        
        .card {
            padding: 1.2rem;
        }
        
        .country-card {
            padding: 0.8rem;
            font-size: 0.95rem;
        }
        
        .country-flag {
            font-size: 1.3rem;
        }
    }
</style>
""", unsafe_allow_html=True)

# Country data with flags
COUNTRIES = {
    "๐Ÿ‡บ๐Ÿ‡ธ United States": "US",
    "๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom": "GB",
    "๐Ÿ‡จ๐Ÿ‡ฆ Canada": "CA",
    "๐Ÿ‡ฆ๐Ÿ‡บ Australia": "AU",
    "๐Ÿ‡ฎ๐Ÿ‡ณ India": "IN",
    "๐Ÿ‡ฉ๐Ÿ‡ช Germany": "DE",
    "๐Ÿ‡ซ๐Ÿ‡ท France": "FR",
    "๐Ÿ‡ฏ๐Ÿ‡ต Japan": "JP",
    "๐Ÿ‡ง๐Ÿ‡ท Brazil": "BR",
    "๐Ÿ‡ฟ๐Ÿ‡ฆ South Africa": "ZA",
    "๐Ÿ‡ช๐Ÿ‡ธ Spain": "ES",
    "๐Ÿ‡ธ๐Ÿ‡ฌ Singapore": "SG"
}

# Common legal scenarios for students
STUDENT_SCENARIOS = [
    "Academic Rights & Responsibilities",
    "Campus Housing Issues",
    "Discrimination & Harassment",
    "Freedom of Speech on Campus",
    "Student Privacy Rights",
    "Disciplinary Proceedings",
    "Financial Aid & Scholarships",
    "Intellectual Property Rights",
    "Internship & Employment Rights",
    "Student Loan Concerns",
    "Campus Safety & Security",
    "Consumer Protection as a Student"
]

# Student legal topics
LEGAL_TOPICS = [
    "Academic Integrity Policies",
    "Title IX & Gender Equity",
    "Disability Accommodations",
    "Student Privacy (FERPA)",
    "Campus Free Speech",
    "Student Organization Rights",
    "Financial Aid Regulations",
    "Plagiarism & Copyright",
    "Tenant Rights for Students",
    "Student Employment Laws",
    "Campus Police Interactions",
    "Student Loan Borrower Rights"
]

# LLM models available on Groq
MODELS = {
    "Llama3-70b (Highest Accuracy)": "llama3-70b-8192",
    "Llama3-8b (Fast Response)": "llama3-8b-8192",
    "Mixtral-8x7b (Balanced)": "mixtral-8x7b-32768"
}

# Function to get country name from code
def get_country_name(code):
    try:
        return pycountry.countries.get(alpha_2=code).name
    except:
        return code

# Function to get rights information from Groq API
def get_legal_rights(country, scenario, model_name):
    """Get legal rights information using Groq API"""
    country_name = get_country_name(country)
    
    system_prompt = f"""
    You are an expert legal assistant specializing in student rights in {country_name}. 
    Provide clear, accurate information about student rights in the given scenario.
    
    Guidelines:
    - Focus specifically on student rights and responsibilities
    - List 5-7 key points as bullet points
    - Use plain language understandable to students
    - Include relevant legal references when appropriate
    - Highlight practical steps students can take
    - Mention any country-specific variations
    - Keep response under 300 words
    - Format with emojis for readability
    - End with important disclaimers
    """
    
    user_prompt = f"""
    Scenario: {scenario}
    Country: {country_name}
    
    Please provide student-specific rights information for this situation in {country_name}.
    """
    
    try:
        chat_completion = client.chat.completions.create(
            messages=[
                {
                    "role": "system",
                    "content": system_prompt
                },
                {
                    "role": "user",
                    "content": user_prompt
                }
            ],
            model=model_name,
            temperature=0.3,
            max_tokens=1024,
            top_p=1,
            stream=False,
            stop=None,
        )
        
        return chat_completion.choices[0].message.content
    
    except Exception as e:
        st.error(f"Error fetching data: {str(e)}")
        return None

# Function to display response with animation
def display_response(response):
    """Display the response with typing animation effect"""
    message_placeholder = st.empty()
    full_response = ""
    
    # Simulate stream of response with milliseconds delay
    for chunk in response.split():
        full_response += chunk + " "
        time.sleep(0.03)
        # Add a blinking cursor to simulate typing
        message_placeholder.markdown(f'<div class="response-card">{full_response}โ–Œ</div>', unsafe_allow_html=True)
    
    # Display final message without the cursor
    message_placeholder.markdown(f'<div class="response-card">{response}</div>', unsafe_allow_html=True)

# Main app
def main():
    # Header section
    st.markdown("""
    <div class="header">
        <h1 style="margin:0;font-size:2.5rem;">LexGuardian</h1>
        <p style="margin:0;font-size:1.2rem;opacity:0.9;margin-top:10px;">Empowering Students with Legal Knowledge</p>
    </div>
    """, unsafe_allow_html=True)
    
    # Initialize session state
    if 'selected_country' not in st.session_state:
        st.session_state.selected_country = "๐Ÿ‡บ๐Ÿ‡ธ United States"
    
    if 'selected_scenario' not in st.session_state:
        st.session_state.selected_scenario = None
        
    if 'active_tab' not in st.session_state:
        st.session_state.active_tab = "explorer"
    
    # Navigation tabs
    tab1, tab2, tab3 = st.tabs(["Rights Explorer", "Legal Topics", "Student Resources"])
    
    with tab1:
        st.markdown("### โš–๏ธ Know Your Rights")
        st.markdown("Select your country and a situation to understand your legal rights as a student")
        
        # Model selection
        model_col = st.columns([1,1,2])
        with model_col[0]:
            selected_model = st.selectbox("Choose AI Model", list(MODELS.keys()), index=0)
        with model_col[1]:
            st.markdown(f"**Selected Country:** {st.session_state.selected_country}")
        
        # Main content columns
        col1, col2 = st.columns([1, 1.3], gap="large")
        
        with col1:
            st.markdown("#### ๐ŸŒ Select Your Country")
            
            # Country selection cards
            for country_display in COUNTRIES.keys():
                is_selected = st.session_state.selected_country == country_display
                card_class = "country-card selected" if is_selected else "country-card"
                flag, name = country_display.split(" ", 1)
                
                if st.button(
                    f'{flag} {name}',
                    key=f"btn_{country_display}",
                    use_container_width=True
                ):
                    st.session_state.selected_country = country_display
                    st.session_state.selected_scenario = None
                    st.rerun()
            
            st.markdown("#### ๐Ÿ“Š Student Rights Awareness")
            countries = list(COUNTRIES.values())
            awareness = [85, 82, 80, 78, 75, 83, 81, 79, 76, 74, 80, 77]  # Simulated data
            
            fig = px.pie(
                names=[get_country_name(code) for code in countries],
                values=awareness,
                title="Global Student Rights Awareness",
                height=300
            )
            fig.update_layout(
                plot_bgcolor='rgba(0,0,0,0)',
                paper_bgcolor='rgba(0,0,0,0)',
                margin=dict(l=0, r=0, t=40, b=0),
                showlegend=False
            )
            fig.update_traces(textposition='inside', textinfo='percent+label')
            st.plotly_chart(fig, use_container_width=True)
            
        with col2:
            st.markdown("#### ๐ŸŽ“ Student Scenarios")
            st.markdown("Select a situation relevant to student life")
            
            # Create buttons for each scenario in 2 columns
            scenario_cols = st.columns(2)
            for i, scenario in enumerate(STUDENT_SCENARIOS):
                with scenario_cols[i % 2]:
                    if st.button(
                        f"{scenario}",
                        key=f"scen_{scenario}",
                        use_container_width=True,
                        help=f"Click to see student rights for {scenario}"
                    ):
                        st.session_state.selected_scenario = scenario
            
            # Custom scenario input
            custom_scenario = st.text_input(
                "**Describe your specific concern:**",
                placeholder="e.g., 'Rights during campus protest', 'Academic appeal process'"
            )
            if custom_scenario:
                st.session_state.selected_scenario = custom_scenario
            
            # Response area
            if st.session_state.selected_scenario:
                country_code = COUNTRIES[st.session_state.selected_country]
                
                with st.spinner(f"๐Ÿ” Analyzing student rights for '{st.session_state.selected_scenario}'..."):
                    response = get_legal_rights(
                        country_code, 
                        st.session_state.selected_scenario,
                        MODELS[selected_model]
                    )
                    
                    if response:
                        display_response(response)
                    else:
                        st.error("Failed to get response. Please try again.")
            else:
                st.info("๐Ÿ‘† Select a student scenario to see your rights information")
                st.markdown("""
                <div style="text-align:center; margin:20px 0;">
                    <img src="https://images.unsplash.com/photo-1523050854058-8df90110c9f1?auto=format&fit=crop&w=600&h=400" 
                         style="width:100%; border-radius:15px; box-shadow:0 6px 20px rgba(0,0,0,0.1);">
                    <p style="margin-top:10px;font-style:italic;color:#666;">Knowledge is your best legal defense</p>
                </div>
                """, unsafe_allow_html=True)
    
    with tab2:
        st.markdown("### ๐Ÿ“š Essential Legal Topics for Students")
        st.markdown("Explore key legal concepts every student should understand")
        
        # Topics in 3 columns
        cols = st.columns(3)
        for i, topic in enumerate(LEGAL_TOPICS):
            with cols[i % 3]:
                with st.expander(f"**{topic}**", expanded=True):
                    st.info(f"Learn about your rights and responsibilities regarding {topic.lower()}")
                    if st.button("Explore Topic", key=f"topic_{topic}"):
                        st.session_state.active_tab = "explorer"
                        st.session_state.selected_scenario = topic
                        st.rerun()
        
        st.markdown("### ๐Ÿง  Legal Knowledge Quiz")
        st.markdown("Test your understanding of student rights")
        
        quiz_cols = st.columns(2)
        with quiz_cols[0]:
            st.markdown("""
            **Question 1:** Can your college share your academic records without permission?  
            A) Always  
            B) Only with parents  
            C) Only with your consent  
            D) Only in emergencies  
            """)
            
            answer1 = st.radio("Select answer:", ["A", "B", "C", "D"], key="q1", index=None)
            if answer1 == "C":
                st.success("Correct! FERPA requires your consent for most record disclosures.")
            elif answer1:
                st.error("Incorrect. The correct answer is C - Only with your consent.")
        
        with quiz_cols[1]:
            st.markdown("""
            **Question 2:** What should you do if you face discrimination on campus?  
            A) Ignore it  
            B) Report to Title IX coordinator  
            C) Post about it on social media  
            D) Confront the person directly  
            """)
            
            answer2 = st.radio("Select answer:", ["A", "B", "C", "D"], key="q2", index=None)
            if answer2 == "B":
                st.success("Correct! Reporting to the Title IX coordinator is the proper step.")
            elif answer2:
                st.error("Incorrect. The correct answer is B - Report to Title IX coordinator.")
    
    with tab3:
        st.markdown("### ๐Ÿ›ก๏ธ Student Legal Resources")
        st.markdown("Essential tools and information for student legal matters")
        
        # Resources in cards
        resource_cols = st.columns(3)
        resources = [
            {"icon": "๐Ÿ“", "title": "Legal Templates", "desc": "Downloadable templates for common student legal documents"},
            {"icon": "๐Ÿ“š", "title": "Legal Glossary", "desc": "Understand legal terminology with our student-friendly dictionary"},
            {"icon": "๐Ÿ“ฑ", "title": "Campus Legal Apps", "desc": "Mobile applications for legal assistance on campus"},
            {"icon": "๐Ÿ‘จโ€โš–๏ธ", "title": "Find Legal Aid", "desc": "Locate free or low-cost legal services for students"},
            {"icon": "๐Ÿ“…", "title": "Workshops & Events", "desc": "Upcoming legal education sessions on campus"},
            {"icon": "๐Ÿ“–", "title": "Legal Handbook", "desc": "Comprehensive guide to student rights and responsibilities"}
        ]
        
        for i, resource in enumerate(resources):
            with resource_cols[i % 3]:
                st.markdown(f"""
                <div class="feature-card">
                    <div class="feature-icon">{resource['icon']}</div>
                    <h3>{resource['title']}</h3>
                    <p>{resource['desc']}</p>
                </div>
                """, unsafe_allow_html=True)
        
        st.markdown("### ๐Ÿ“ž Emergency Contacts")
        st.markdown("Important contacts for immediate legal assistance")
        
        contacts = st.columns(3)
        with contacts[0]:
            st.markdown("""
            **Campus Security**  
            Emergency: (555) 123-4567  
            Non-emergency: (555) 123-4000  
            """)
        with contacts[1]:
            st.markdown("""
            **Student Legal Services**  
            Phone: (555) 987-6543  
            Email: [email protected]  
            """)
        with contacts[2]:
            st.markdown("""
            **National Legal Aid**  
            Hotline: 1-800-LEGAL-AID  
            Website: legalaid.org  
            """)
    
    # Footer
    st.markdown("""
    <div class="footer">
        <h4>LexGuardian - Student Legal Empowerment</h4>
        <p>ยฉ 2025 โ€ข For Educational Purposes Only โ€ข Not Legal Advice</p>
        <p style="font-size:0.9rem;margin-top:10px;">Always consult qualified legal counsel for your specific situation</p>
    </div>
    """, unsafe_allow_html=True)

if __name__ == "__main__":
    main()