Spaces:
Sleeping
Sleeping
Commit
·
2cd574e
1
Parent(s):
25d32ef
styling dengan css
Browse files- .streamlit/config.toml +2 -2
- app.py +25 -13
- assets/style.css +84 -76
.streamlit/config.toml
CHANGED
|
@@ -1,3 +1,3 @@
|
|
| 1 |
[theme]
|
| 2 |
-
base="
|
| 3 |
-
primaryColor="#
|
|
|
|
| 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 |
-
|
|
|
|
| 313 |
"description": "Siapkan dan upload file Excel kritik dan saran yang wajib memiliki kolom `kritik_saran`."},
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
{"icon": "
|
|
|
|
|
|
|
|
|
|
|
|
|
| 317 |
"description": "Lihat hasil lengkap berupa tabel data terprediksi, metrik, dan visualisasi sentimen."},
|
| 318 |
-
|
|
|
|
|
|
|
| 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 |
-
<
|
| 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 |
-
|
| 804 |
-
except Exception as e:
|
| 805 |
-
|
| 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 |
-
|
| 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%;
|
| 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
|
| 80 |
@media (prefers-color-scheme: dark) {
|
| 81 |
[data-testid="stAppViewContainer"] .step-card {
|
| 82 |
-
background-color: #
|
| 83 |
-
border: 1px solid #
|
| 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: #
|
| 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 |
-
|
| 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 |
-
|
|
|
|
| 134 |
}
|
| 135 |
|
| 136 |
/* Heading */
|
|
@@ -163,18 +165,20 @@ h1.title-center {
|
|
| 163 |
}
|
| 164 |
|
| 165 |
/* ========================================
|
| 166 |
-
|
| 167 |
-
|
| 168 |
.uploadedFile {
|
| 169 |
background: var(--secondary-background-color);
|
| 170 |
-
|
|
|
|
| 171 |
border-radius: 12px;
|
| 172 |
padding: 2rem;
|
| 173 |
transition: all 0.3s ease;
|
| 174 |
}
|
| 175 |
|
| 176 |
.uploadedFile:hover {
|
| 177 |
-
|
|
|
|
| 178 |
background: var(--background-color);
|
| 179 |
}
|
| 180 |
|
|
@@ -187,8 +191,9 @@ h1.title-center {
|
|
| 187 |
}
|
| 188 |
|
| 189 |
[data-testid="stFileUploader"]:hover {
|
| 190 |
-
|
| 191 |
-
|
|
|
|
| 192 |
}
|
| 193 |
|
| 194 |
/* File uploader text color */
|
|
@@ -205,32 +210,32 @@ h1.title-center {
|
|
| 205 |
}
|
| 206 |
|
| 207 |
[data-testid="stFileUploader"] section:hover {
|
| 208 |
-
|
|
|
|
| 209 |
background: var(--background-color);
|
| 210 |
}
|
| 211 |
|
| 212 |
|
| 213 |
|
| 214 |
/* ========================================
|
| 215 |
-
|
| 216 |
-
|
| 217 |
|
| 218 |
.stButton > button {
|
| 219 |
-
background:
|
| 220 |
-
color:
|
| 221 |
-
border:
|
| 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:
|
| 228 |
}
|
| 229 |
|
| 230 |
.stButton > button:hover {
|
| 231 |
-
background:
|
| 232 |
-
|
| 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 |
-
|
| 246 |
-
|
|
|
|
| 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(
|
| 253 |
}
|
| 254 |
|
| 255 |
.stDownloadButton > button:hover {
|
| 256 |
transform: translateY(-2px);
|
| 257 |
-
box-shadow: 0 6px 20px rgba(
|
| 258 |
}
|
| 259 |
|
| 260 |
/* ========================================
|
| 261 |
-
|
| 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 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
/* Removed custom alert styling - using Streamlit default */
|
| 305 |
-
|
| 306 |
-
/* ========================================
|
| 307 |
-
Progress Bar
|
| 308 |
-
======================================== */
|
| 309 |
|
| 310 |
.stProgress > div > div > div > div {
|
| 311 |
-
|
|
|
|
| 312 |
border-radius: 10px;
|
| 313 |
height: 12px;
|
| 314 |
}
|
|
@@ -320,8 +321,8 @@ div[data-testid="metric-container"]:hover {
|
|
| 320 |
}
|
| 321 |
|
| 322 |
/* ========================================
|
| 323 |
-
|
| 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 |
-
|
| 337 |
-
|
|
|
|
| 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 |
-
|
| 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 |
-
|
| 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 |
-
|
| 414 |
-
color: #
|
|
|
|
| 415 |
opacity: 1;
|
| 416 |
}
|
| 417 |
|
|
@@ -425,8 +428,8 @@ div[data-testid="metric-container"]:hover {
|
|
| 425 |
}
|
| 426 |
|
| 427 |
/* ========================================
|
| 428 |
-
|
| 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 |
-
|
|
|
|
| 451 |
opacity: 1;
|
| 452 |
}
|
| 453 |
|
| 454 |
.stTabs [aria-selected="true"] {
|
| 455 |
-
|
| 456 |
-
|
|
|
|
| 457 |
opacity: 1;
|
| 458 |
}
|
| 459 |
|
|
@@ -462,8 +467,8 @@ div[data-testid="metric-container"]:hover {
|
|
| 462 |
}
|
| 463 |
|
| 464 |
/* ========================================
|
| 465 |
-
|
| 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 |
-
|
| 479 |
-
|
|
|
|
| 480 |
opacity: 1;
|
| 481 |
}
|
| 482 |
|
| 483 |
/* ========================================
|
| 484 |
-
|
| 485 |
-
|
| 486 |
|
| 487 |
.stSpinner > div {
|
| 488 |
-
|
|
|
|
| 489 |
}
|
| 490 |
|
| 491 |
/* ========================================
|
| 492 |
-
|
| 493 |
-
|
| 494 |
|
| 495 |
.js-plotly-plot {
|
| 496 |
border-radius: 12px;
|
|
@@ -500,11 +507,12 @@ div[data-testid="metric-container"]:hover {
|
|
| 500 |
}
|
| 501 |
|
| 502 |
/* ========================================
|
| 503 |
-
|
| 504 |
-
|
| 505 |
|
| 506 |
.gradient-text {
|
| 507 |
-
|
|
|
|
| 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 |
-
|
| 555 |
-
|
| 556 |
|
| 557 |
@keyframes fadeIn {
|
| 558 |
from {
|
|
@@ -583,8 +591,8 @@ div[data-testid="metric-container"]:hover {
|
|
| 583 |
}
|
| 584 |
|
| 585 |
/* ========================================
|
| 586 |
-
|
| 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 |
-
|
| 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;
|