zdannn2808 commited on
Commit
2cd574e
·
1 Parent(s): 25d32ef

styling dengan css

Browse files
Files changed (3) hide show
  1. .streamlit/config.toml +2 -2
  2. app.py +25 -13
  3. assets/style.css +84 -76
.streamlit/config.toml CHANGED
@@ -1,3 +1,3 @@
1
  [theme]
2
- base="light"
3
- primaryColor="#1f4f6e"
 
1
  [theme]
2
+ base="dark"
3
+ primaryColor="#00adb5"
app.py CHANGED
@@ -57,7 +57,7 @@ st.set_page_config(
57
  # Load custom CSS
58
  with open(os.path.join("assets", "style.css"), encoding="utf-8") as f:
59
  st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)
60
-
61
 
62
  def get_session_id():
63
  """Generate atau retrieve session ID untuk user - PERSISTENT across refresh"""
@@ -307,24 +307,34 @@ st.markdown(
307
  unsafe_allow_html=True
308
  )
309
  st.markdown("")
 
310
 
311
  steps = [
312
- {"icon": "📤", "title": "1. Upload File Excel",
 
313
  "description": "Siapkan dan upload file Excel kritik dan saran yang wajib memiliki kolom `kritik_saran`."},
314
- {"icon": "⏳", "title": "2. Proses Data Otomatis",
315
- "description": "Website akan melakukan preprocessing dan menjalankan model prediksi sentimen."},
316
- {"icon": "📊", "title": "3. Analisis & Visualisasi",
 
 
 
 
317
  "description": "Lihat hasil lengkap berupa tabel data terprediksi, metrik, dan visualisasi sentimen."},
318
- {"icon": "⬇️", "title": "4. Unduh Hasil Analisis",
 
 
319
  "description": "Unduh hasil analisis lengkap Anda dalam format file Excel untuk laporan lebih lanjut."}
320
  ]
 
321
  cols = st.columns(len(steps))
322
 
323
  for i, step in enumerate(steps):
324
  with cols[i]:
 
325
  st.markdown(f"""
326
- <div class='step-card'>
327
- <span class='icon'>{step['icon']}</span>
328
  <div class='step-number'>{step['title']}</div>
329
  <p class='step-description'>{step['description']}</p>
330
  </div>
@@ -677,7 +687,9 @@ if st.session_state.df_predicted is not None:
677
  )
678
 
679
  # Ringkasan Cepat dengan pengecekan kolom
 
680
  st.markdown("### Ringkasan Cepat")
 
681
 
682
  total_pos = (df_filtered[ASPEK_COLUMNS] == "positif").sum().sum()
683
  total_net = (df_filtered[ASPEK_COLUMNS] == "netral").sum().sum()
@@ -700,7 +712,7 @@ if st.session_state.df_predicted is not None:
700
  col4.metric("Jumlah Prodi", prodi_count if prodi_count > 0 else "N/A")
701
  col5.metric("Jumlah Semester",
702
  semester_count if semester_count > 0 else "N/A")
703
-
704
  col6, col7, col8, col9, col10 = st.columns(5)
705
  col6.metric("Sentimen Positif", f"{total_pos:,}")
706
  col7.metric("Sentimen Netral", f"{total_net:,}")
@@ -799,10 +811,10 @@ if st.session_state.df_predicted is not None:
799
  st.error(f"Error menampilkan sentimen top 10 mata kuliah: {str(e)}")
800
 
801
  st.markdown("---")
802
- try:
803
- show_sentiment_stacked_percentage(df_filtered, ASPEK_COLUMNS)
804
- except Exception as e:
805
- st.error(f"Error menampilkan stacked percentage: {str(e)}")
806
 
807
  # Footer
808
  st.caption("""
 
57
  # Load custom CSS
58
  with open(os.path.join("assets", "style.css"), encoding="utf-8") as f:
59
  st.markdown(f"<style>{f.read()}</style>", unsafe_allow_html=True)
60
+ st.markdown('<link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.3/font/bootstrap-icons.css" rel="stylesheet">', unsafe_allow_html=True)
61
 
62
  def get_session_id():
63
  """Generate atau retrieve session ID untuk user - PERSISTENT across refresh"""
 
307
  unsafe_allow_html=True
308
  )
309
  st.markdown("")
310
+ st.markdown("")
311
 
312
  steps = [
313
+ # Ikon Pengunggahan File
314
+ {"icon": "bi bi-cloud-arrow-up", "title": "1. Upload File Excel",
315
  "description": "Siapkan dan upload file Excel kritik dan saran yang wajib memiliki kolom `kritik_saran`."},
316
+
317
+ # Ikon Proses/Waktu
318
+ {"icon": "bi bi-hourglass-split", "title": "2. Proses Data Otomatis",
319
+ "description": "Website akan melakukan preprocessing dan menjalankan model prediksi sentimen."},
320
+
321
+ # Ikon Analisis/Visualisasi
322
+ {"icon": "bi bi-bar-chart", "title": "3. Analisis & Visualisasi",
323
  "description": "Lihat hasil lengkap berupa tabel data terprediksi, metrik, dan visualisasi sentimen."},
324
+
325
+ # Ikon Pengunduhan File
326
+ {"icon": "bi bi-cloud-arrow-down", "title": "4. Unduh Hasil Analisis",
327
  "description": "Unduh hasil analisis lengkap Anda dalam format file Excel untuk laporan lebih lanjut."}
328
  ]
329
+
330
  cols = st.columns(len(steps))
331
 
332
  for i, step in enumerate(steps):
333
  with cols[i]:
334
+ # Mengubah tag <span> menjadi <i> untuk kompatibilitas ikon font
335
  st.markdown(f"""
336
+ <div class='step-card' >
337
+ <i class='icon {step['icon']}'></i>
338
  <div class='step-number'>{step['title']}</div>
339
  <p class='step-description'>{step['description']}</p>
340
  </div>
 
687
  )
688
 
689
  # Ringkasan Cepat dengan pengecekan kolom
690
+ st.markdown("")
691
  st.markdown("### Ringkasan Cepat")
692
+ st.markdown("")
693
 
694
  total_pos = (df_filtered[ASPEK_COLUMNS] == "positif").sum().sum()
695
  total_net = (df_filtered[ASPEK_COLUMNS] == "netral").sum().sum()
 
712
  col4.metric("Jumlah Prodi", prodi_count if prodi_count > 0 else "N/A")
713
  col5.metric("Jumlah Semester",
714
  semester_count if semester_count > 0 else "N/A")
715
+ st.markdown("")
716
  col6, col7, col8, col9, col10 = st.columns(5)
717
  col6.metric("Sentimen Positif", f"{total_pos:,}")
718
  col7.metric("Sentimen Netral", f"{total_net:,}")
 
811
  st.error(f"Error menampilkan sentimen top 10 mata kuliah: {str(e)}")
812
 
813
  st.markdown("---")
814
+ # try:
815
+ # show_sentiment_stacked_percentage(df_filtered, ASPEK_COLUMNS)
816
+ # except Exception as e:
817
+ # st.error(f"Error menampilkan stacked percentage: {str(e)}")
818
 
819
  # Footer
820
  st.caption("""
assets/style.css CHANGED
@@ -1,6 +1,6 @@
1
  /* ========================================
2
- Enhanced Streamlit Custom Styles with Dark Mode Support
3
- ======================================== */
4
 
5
  /* Import Google Fonts */
6
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
@@ -17,10 +17,8 @@ html, body, [class*="css"] {
17
  /* CSS class untuk memusatkan teks */
18
  .title-center {
19
  text-align: center;
20
- /* Opsional: Sesuaikan margin atas/bawah jika diperlukan */
21
  margin-top: 10px;
22
  margin-bottom: 10px;
23
- /* Opsional: Mengatur warna agar tetap konsisten dengan tema Streamlit */
24
  color: inherit;
25
  }
26
 
@@ -49,7 +47,7 @@ html {
49
  border-radius: 10px;
50
  padding: 15px;
51
  text-align: center;
52
- height: 100%; /* Memastikan semua kartu dalam satu baris memiliki tinggi yang sama */
53
  margin-bottom: 15px;
54
  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
55
  transition: background-color 0.3s, border-color 0.3s, box-shadow 0.3s;
@@ -76,17 +74,17 @@ html {
76
  color: #404040; /* Teks gelap untuk light mode */
77
  }
78
 
79
- /* Dark Mode specific styles: Menggunakan abu-abu tua yang lebih jelas dan teks terang */
80
  @media (prefers-color-scheme: dark) {
81
  [data-testid="stAppViewContainer"] .step-card {
82
- background-color: #1f4f6e; /* Abu-abu tua yang sangat gelap, untuk kontras */
83
- border: 1px solid #366d8f; /* Border yang sedikit lebih terang dari latar belakang */
84
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.5);
85
  }
86
 
87
  [data-testid="stAppViewContainer"] .step-card .step-number,
88
  [data-testid="stAppViewContainer"] .step-card .step-description {
89
- color: #f0f0f0; /* Teks terang (hampir putih) untuk keterbacaan optimal */
90
  }
91
  }
92
 
@@ -95,6 +93,9 @@ html {
95
  font-size: 2.5em;
96
  margin-bottom: 10px;
97
  display: block;
 
 
 
98
  }
99
 
100
  /* Step number styling */
@@ -111,8 +112,8 @@ html {
111
  }
112
 
113
  /* ========================================
114
- Typography - Dark Mode Compatible
115
- ======================================== */
116
 
117
  h1, h2, h3, h4, h5, h6 {
118
  font-weight: 700;
@@ -130,7 +131,8 @@ code {
130
  padding: 0.2rem 0.4rem;
131
  border-radius: 4px;
132
  font-size: 0.9em;
133
- color: #1476ff;
 
134
  }
135
 
136
  /* Heading */
@@ -163,18 +165,20 @@ h1.title-center {
163
  }
164
 
165
  /* ========================================
166
- File Uploader - Dark Mode Compatible with Dashed Border
167
- ======================================== */
168
  .uploadedFile {
169
  background: var(--secondary-background-color);
170
- border: 2px dashed 1476ff;
 
171
  border-radius: 12px;
172
  padding: 2rem;
173
  transition: all 0.3s ease;
174
  }
175
 
176
  .uploadedFile:hover {
177
- border-color: 1476ff;
 
178
  background: var(--background-color);
179
  }
180
 
@@ -187,8 +191,9 @@ h1.title-center {
187
  }
188
 
189
  [data-testid="stFileUploader"]:hover {
190
- border-color: #366d8f;
191
- box-shadow: 0 4px 12px rgba(20, 118, 255, 0.2);
 
192
  }
193
 
194
  /* File uploader text color */
@@ -205,32 +210,32 @@ h1.title-center {
205
  }
206
 
207
  [data-testid="stFileUploader"] section:hover {
208
- border-color: #366d8f;
 
209
  background: var(--background-color);
210
  }
211
 
212
 
213
 
214
  /* ========================================
215
- Buttons - Dark Mode Compatible
216
- ======================================== */
217
 
218
  .stButton > button {
219
- background: var(--secondary-background-color);
220
- color: var(--text-color);
221
- border: 1px solid var(--text-color);
222
  border-radius: 8px;
223
  padding: 0.6rem 1.2rem;
224
  font-weight: 500;
225
  font-size: 0.95rem;
226
  transition: all 0.3s ease;
227
- opacity: 0.8;
228
  }
229
 
230
  .stButton > button:hover {
231
- background: var(--background-color);
232
- border-color: #1476ff;
233
- color: #ff1414ff;
234
  transform: translateY(-1px);
235
  box-shadow: 0 4px 12px rgba(255, 20, 20, 0.2);
236
  opacity: 1;
@@ -242,24 +247,25 @@ h1.title-center {
242
 
243
  /* Download Button */
244
  .stDownloadButton > button {
245
- background: linear-gradient(135deg, #1476ff 0%, #0056d2 100%);
246
- color: white !important;
 
247
  border: none;
248
  border-radius: 8px;
249
  padding: 0.7rem 1.5rem;
250
  font-weight: 600;
251
  transition: all 0.3s ease;
252
- box-shadow: 0 4px 12px rgba(20, 118, 255, 0.3);
253
  }
254
 
255
  .stDownloadButton > button:hover {
256
  transform: translateY(-2px);
257
- box-shadow: 0 6px 20px rgba(20, 118, 255, 0.4);
258
  }
259
 
260
  /* ========================================
261
- Metrics - Dark Mode Compatible
262
- ======================================== */
263
 
264
  [data-testid="stMetricValue"] {
265
  font-size: 1.8rem;
@@ -298,17 +304,12 @@ div[data-testid="metric-container"]:hover {
298
  }
299
 
300
  /* ========================================
301
- Alerts & Messages - Use Streamlit Default
302
- ======================================== */
303
-
304
- /* Removed custom alert styling - using Streamlit default */
305
-
306
- /* ========================================
307
- Progress Bar
308
- ======================================== */
309
 
310
  .stProgress > div > div > div > div {
311
- background: linear-gradient(90deg, #1476ff 0%, #0056d2 100%);
 
312
  border-radius: 10px;
313
  height: 12px;
314
  }
@@ -320,8 +321,8 @@ div[data-testid="metric-container"]:hover {
320
  }
321
 
322
  /* ========================================
323
- Dataframe - Dark Mode Compatible
324
- ======================================== */
325
 
326
  [data-testid="stDataFrame"] {
327
  border-radius: 12px;
@@ -333,8 +334,9 @@ div[data-testid="metric-container"]:hover {
333
 
334
  /* Dataframe header */
335
  [data-testid="stDataFrame"] thead tr th {
336
- background: linear-gradient(135deg, #1476ff 0%, #0056d2 100%);
337
- color: white !important;
 
338
  font-weight: 600;
339
  text-transform: uppercase;
340
  font-size: 0.85rem;
@@ -362,8 +364,8 @@ div[data-testid="metric-container"]:hover {
362
  }
363
 
364
  /* ========================================
365
- Sidebar - Dark Mode Compatible
366
- ======================================== */
367
 
368
  [data-testid="stSidebar"] {
369
  background: var(--secondary-background-color);
@@ -396,8 +398,8 @@ div[data-testid="metric-container"]:hover {
396
  }
397
 
398
  /* ========================================
399
- Expander - Dark Mode Compatible
400
- ======================================== */
401
 
402
  .streamlit-expanderHeader {
403
  background: var(--secondary-background-color);
@@ -410,8 +412,9 @@ div[data-testid="metric-container"]:hover {
410
  }
411
 
412
  .streamlit-expanderHeader:hover {
413
- border-color: #1476ff;
414
- color: #1476ff;
 
415
  opacity: 1;
416
  }
417
 
@@ -425,8 +428,8 @@ div[data-testid="metric-container"]:hover {
425
  }
426
 
427
  /* ========================================
428
- Tabs - Dark Mode Compatible
429
- ======================================== */
430
 
431
  .stTabs [data-baseweb="tab-list"] {
432
  gap: 8px;
@@ -447,13 +450,15 @@ div[data-testid="metric-container"]:hover {
447
 
448
  .stTabs [data-baseweb="tab"]:hover {
449
  background: var(--background-color);
450
- color: #1476ff;
 
451
  opacity: 1;
452
  }
453
 
454
  .stTabs [aria-selected="true"] {
455
- background: linear-gradient(135deg, #1476ff 0%, #0056d2 100%);
456
- color: white !important;
 
457
  opacity: 1;
458
  }
459
 
@@ -462,8 +467,8 @@ div[data-testid="metric-container"]:hover {
462
  }
463
 
464
  /* ========================================
465
- Select & Multiselect - Dark Mode Compatible
466
- ======================================== */
467
 
468
  .stSelectbox > div > div,
469
  .stMultiSelect > div > div {
@@ -475,22 +480,24 @@ div[data-testid="metric-container"]:hover {
475
 
476
  .stSelectbox > div > div:hover,
477
  .stMultiSelect > div > div:hover {
478
- border-color: #1476ff;
479
- box-shadow: 0 0 0 1px #1476ff;
 
480
  opacity: 1;
481
  }
482
 
483
  /* ========================================
484
- Spinner
485
- ======================================== */
486
 
487
  .stSpinner > div {
488
- border-top-color: #1476ff !important;
 
489
  }
490
 
491
  /* ========================================
492
- Plotly Charts - Dark Mode Compatible
493
- ======================================== */
494
 
495
  .js-plotly-plot {
496
  border-radius: 12px;
@@ -500,11 +507,12 @@ div[data-testid="metric-container"]:hover {
500
  }
501
 
502
  /* ========================================
503
- Custom Classes - Dark Mode Compatible
504
- ======================================== */
505
 
506
  .gradient-text {
507
- background: linear-gradient(135deg, #1476ff 0%, #0056d2 100%);
 
508
  -webkit-background-clip: text;
509
  -webkit-text-fill-color: transparent;
510
  background-clip: text;
@@ -551,8 +559,8 @@ div[data-testid="metric-container"]:hover {
551
  }
552
 
553
  /* ========================================
554
- Animations
555
- ======================================== */
556
 
557
  @keyframes fadeIn {
558
  from {
@@ -583,8 +591,8 @@ div[data-testid="metric-container"]:hover {
583
  }
584
 
585
  /* ========================================
586
- Responsive Design
587
- ======================================== */
588
 
589
  @media (max-width: 768px) {
590
  .main .block-container {
@@ -602,8 +610,8 @@ div[data-testid="metric-container"]:hover {
602
  }
603
 
604
  /* ========================================
605
- Utility Classes
606
- ======================================== */
607
 
608
  .text-center {
609
  text-align: center;
 
1
  /* ========================================
2
+ Enhanced Streamlit Custom Styles with Dark Mode Support
3
+ ======================================== */
4
 
5
  /* Import Google Fonts */
6
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
 
17
  /* CSS class untuk memusatkan teks */
18
  .title-center {
19
  text-align: center;
 
20
  margin-top: 10px;
21
  margin-bottom: 10px;
 
22
  color: inherit;
23
  }
24
 
 
47
  border-radius: 10px;
48
  padding: 15px;
49
  text-align: center;
50
+ height: 100%;
51
  margin-bottom: 15px;
52
  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
53
  transition: background-color 0.3s, border-color 0.3s, box-shadow 0.3s;
 
74
  color: #404040; /* Teks gelap untuk light mode */
75
  }
76
 
77
+ /* Dark Mode specific styles: Menggunakan palet #222831, #393E46, dan #EEEEEE */
78
  @media (prefers-color-scheme: dark) {
79
  [data-testid="stAppViewContainer"] .step-card {
80
+ background-color: #393E46; /* Abu-abu Sekunder Baru */
81
+ border: 1px solid #222831; /* Border Sangat Gelap Baru */
82
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.5);
83
  }
84
 
85
  [data-testid="stAppViewContainer"] .step-card .step-number,
86
  [data-testid="stAppViewContainer"] .step-card .step-description {
87
+ color: #EEEEEE; /* Teks terang baru */
88
  }
89
  }
90
 
 
93
  font-size: 2.5em;
94
  margin-bottom: 10px;
95
  display: block;
96
+ /* WARNA IKON DARI PALET BARU */
97
+ color: #00ADB5;
98
+ transition: color 0.3s ease;
99
  }
100
 
101
  /* Step number styling */
 
112
  }
113
 
114
  /* ========================================
115
+ Typography - Dark Mode Compatible
116
+ ======================================== */
117
 
118
  h1, h2, h3, h4, h5, h6 {
119
  font-weight: 700;
 
131
  padding: 0.2rem 0.4rem;
132
  border-radius: 4px;
133
  font-size: 0.9em;
134
+ /* WARNA CODE BARU */
135
+ color: #00ADB5;
136
  }
137
 
138
  /* Heading */
 
165
  }
166
 
167
  /* ========================================
168
+ File Uploader - Dark Mode Compatible with Dashed Border
169
+ ======================================== */
170
  .uploadedFile {
171
  background: var(--secondary-background-color);
172
+ /* WARNA BORDER BARU */
173
+ border: 2px dashed #00ADB5;
174
  border-radius: 12px;
175
  padding: 2rem;
176
  transition: all 0.3s ease;
177
  }
178
 
179
  .uploadedFile:hover {
180
+ /* WARNA BORDER BARU */
181
+ border-color: #00ADB5;
182
  background: var(--background-color);
183
  }
184
 
 
191
  }
192
 
193
  [data-testid="stFileUploader"]:hover {
194
+ /* WARNA BORDER & SHADOW BARU */
195
+ border-color: #00ADB5;
196
+ box-shadow: 0 4px 12px rgba(0, 173, 181, 0.2);
197
  }
198
 
199
  /* File uploader text color */
 
210
  }
211
 
212
  [data-testid="stFileUploader"] section:hover {
213
+ /* WARNA BORDER BARU */
214
+ border-color: #00ADB5;
215
  background: var(--background-color);
216
  }
217
 
218
 
219
 
220
  /* ========================================
221
+ Buttons - Dark Mode Compatible
222
+ ======================================== */
223
 
224
  .stButton > button {
225
+ background: #ff1414ff;
226
+ color: #ffffff;
227
+ border: 2px solid #ff1414ff;
228
  border-radius: 8px;
229
  padding: 0.6rem 1.2rem;
230
  font-weight: 500;
231
  font-size: 0.95rem;
232
  transition: all 0.3s ease;
233
+ opacity: 1;
234
  }
235
 
236
  .stButton > button:hover {
237
+ background: #ff1414ff;
238
+ color: #ffffff;
 
239
  transform: translateY(-1px);
240
  box-shadow: 0 4px 12px rgba(255, 20, 20, 0.2);
241
  opacity: 1;
 
247
 
248
  /* Download Button */
249
  .stDownloadButton > button {
250
+ /* GRADIENT BARU */
251
+ background: linear-gradient(135deg, #00ADB5 0%, #008D93 100%);
252
+ color: #ffffff !important; /* Teks sangat gelap untuk kontras */
253
  border: none;
254
  border-radius: 8px;
255
  padding: 0.7rem 1.5rem;
256
  font-weight: 600;
257
  transition: all 0.3s ease;
258
+ box-shadow: 0 4px 12px rgba(0, 173, 181, 0.3);
259
  }
260
 
261
  .stDownloadButton > button:hover {
262
  transform: translateY(-2px);
263
+ box-shadow: 0 6px 20px rgba(0, 173, 181, 0.4);
264
  }
265
 
266
  /* ========================================
267
+ Metrics - Dark Mode Compatible
268
+ ======================================== */
269
 
270
  [data-testid="stMetricValue"] {
271
  font-size: 1.8rem;
 
304
  }
305
 
306
  /* ========================================
307
+ Progress Bar
308
+ ======================================== */
 
 
 
 
 
 
309
 
310
  .stProgress > div > div > div > div {
311
+ /* GRADIENT BARU */
312
+ background: linear-gradient(90deg, #00ADB5 0%, #008D93 100%);
313
  border-radius: 10px;
314
  height: 12px;
315
  }
 
321
  }
322
 
323
  /* ========================================
324
+ Dataframe - Dark Mode Compatible
325
+ ======================================== */
326
 
327
  [data-testid="stDataFrame"] {
328
  border-radius: 12px;
 
334
 
335
  /* Dataframe header */
336
  [data-testid="stDataFrame"] thead tr th {
337
+ /* GRADIENT BARU */
338
+ background: linear-gradient(135deg, #00ADB5 0%, #008D93 100%);
339
+ color: #222831 !important; /* Teks sangat gelap untuk kontras */
340
  font-weight: 600;
341
  text-transform: uppercase;
342
  font-size: 0.85rem;
 
364
  }
365
 
366
  /* ========================================
367
+ Sidebar - Dark Mode Compatible
368
+ ======================================== */
369
 
370
  [data-testid="stSidebar"] {
371
  background: var(--secondary-background-color);
 
398
  }
399
 
400
  /* ========================================
401
+ Expander - Dark Mode Compatible
402
+ ======================================== */
403
 
404
  .streamlit-expanderHeader {
405
  background: var(--secondary-background-color);
 
412
  }
413
 
414
  .streamlit-expanderHeader:hover {
415
+ /* WARNA HOVER BARU */
416
+ border-color: #00ADB5;
417
+ color: #00ADB5;
418
  opacity: 1;
419
  }
420
 
 
428
  }
429
 
430
  /* ========================================
431
+ Tabs - Dark Mode Compatible
432
+ ======================================== */
433
 
434
  .stTabs [data-baseweb="tab-list"] {
435
  gap: 8px;
 
450
 
451
  .stTabs [data-baseweb="tab"]:hover {
452
  background: var(--background-color);
453
+ /* WARNA HOVER BARU */
454
+ color: #00ADB5;
455
  opacity: 1;
456
  }
457
 
458
  .stTabs [aria-selected="true"] {
459
+ /* GRADIENT BARU */
460
+ background: linear-gradient(135deg, #00ADB5 0%, #008D93 100%);
461
+ color: #222831 !important; /* Teks sangat gelap untuk kontras */
462
  opacity: 1;
463
  }
464
 
 
467
  }
468
 
469
  /* ========================================
470
+ Select & Multiselect - Dark Mode Compatible
471
+ ======================================== */
472
 
473
  .stSelectbox > div > div,
474
  .stMultiSelect > div > div {
 
480
 
481
  .stSelectbox > div > div:hover,
482
  .stMultiSelect > div > div:hover {
483
+ /* WARNA HOVER BARU */
484
+ border-color: #00ADB5;
485
+ box-shadow: 0 0 0 1px #00ADB5;
486
  opacity: 1;
487
  }
488
 
489
  /* ========================================
490
+ Spinner
491
+ ======================================== */
492
 
493
  .stSpinner > div {
494
+ /* WARNA SPINNER BARU */
495
+ border-top-color: #00ADB5 !important;
496
  }
497
 
498
  /* ========================================
499
+ Plotly Charts - Dark Mode Compatible
500
+ ======================================== */
501
 
502
  .js-plotly-plot {
503
  border-radius: 12px;
 
507
  }
508
 
509
  /* ========================================
510
+ Custom Classes - Dark Mode Compatible
511
+ ======================================== */
512
 
513
  .gradient-text {
514
+ /* GRADIENT BARU */
515
+ background: linear-gradient(135deg, #00ADB5 0%, #008D93 100%);
516
  -webkit-background-clip: text;
517
  -webkit-text-fill-color: transparent;
518
  background-clip: text;
 
559
  }
560
 
561
  /* ========================================
562
+ Animations
563
+ ======================================== */
564
 
565
  @keyframes fadeIn {
566
  from {
 
591
  }
592
 
593
  /* ========================================
594
+ Responsive Design
595
+ ======================================== */
596
 
597
  @media (max-width: 768px) {
598
  .main .block-container {
 
610
  }
611
 
612
  /* ========================================
613
+ Utility Classes
614
+ ======================================== */
615
 
616
  .text-center {
617
  text-align: center;