7
Arsitektur SCSS dan Variabel Tema
Bundel CSS Mazer berakar pada satu entry, src/assets/scss/app.scss. Berkas itu hampir tidak menulis aturan style sendiri; isinya urutan @import: variabel lebih dulu, lalu Bootstrap dan Bootstrap Icons, lalu _mazer.scss src/assets/scss/app.scss:1-211. Urutan ini menentukan nilai akhir setiap variabel, karena Sass memakai nilai yang berlaku pada saat aturan ditulis.
Urutan import app.scss
app.scss mengimport ./variables di baris pertama, baru kemudian Bootstrap dan Bootstrap Icons src/assets/scss/app.scss:4-72. Setelah font dan perfect-scrollbar, berkas ditutup dengan ./mazer src/assets/scss/app.scss:20-213.
graph TD
app["app.scss"] --> vars["_variables.scss"]
app --> bs["~bootstrap/scss/bootstrap"]
app --> icons["~bootstrap-icons/font/bootstrap-icons"]
app --> fonts["_fonts.scss"]
app --> ps["~perfect-scrollbar/css/perfect-scrollbar.css"]
app --> mazer["_mazer.scss"]
mazer --> mixins["mixins/_navbar.scss"]
mazer --> comps["components/*.scss (20 berkas)"]
mazer --> layouts["layouts/main.scss"]
mazer --> utils["_utilities.scss"]
style vars fill:#f59e0b,color:#000
style mazer fill:#f59e0b,color:#000
style comps fill:#8b5cf6,color:#fff
style utils fill:#8b5cf6,color:#fff
%% fig: Urutan import app.scss
%% desc: Variabel dimuat lebih dulu, lalu Bootstrap dan aset pihak ketiga, dan terakhir _mazer.scss yang memecah lapisan komponen.| Langkah | Isi | Rujukan |
|---|---|---|
| 1 | @import "./variables" | src/assets/scss/app.scss:1-211 |
| 2 | ~bootstrap/scss/bootstrap dan ~bootstrap-icons/font/bootstrap-icons | src/assets/scss/app.scss:4-72 |
| 3 | ./fonts | src/assets/scss/app.scss:14-154 |
| 4 | ~perfect-scrollbar/css/perfect-scrollbar.css | src/assets/scss/app.scss:17-185 |
| 5 | ./mazer | src/assets/scss/app.scss:20-213 |
_fonts.scss adalah kumpulan lima blok @font-face untuk keluarga Nunito pada bobot 300, 400, 600, 700, dan 800. Semuanya memakai font-display: swap dan menunjuk berkas .woff2/.woff di @/assets/static/fonts/ src/assets/scss/_fonts.scss:1-476.
⚠️
_variables.scssmengimport~bootstrap/scss/functionsdua kali pada dua blok berurutan src/assets/scss/_variables.scss:8-167. Import ganda itu tidak mengubah hasil, tetapi menandakan berkas ini disusun bertahap. Jangan menyimpulkan bahwa urutan import di berkas lain juga bebas.
Ada entry kedua, bootstrap.scss, yang memuat variabel Bootstrap lalu mengimport variables di tengah import-stack-nya src/assets/scss/bootstrap.scss:8-178. Karena hampir semua variabel Mazer memakai !default, nilai akhir pada jalur ini bergantung pada siapa yang mendefinisikan lebih dulu, bukan pada berkas mana yang dianggap utama.
Lapisan di _mazer.scss
Komentar kepala _mazer.scss mencantumkan table of contents bernomor 1 sampai 5 src/assets/scss/_mazer.scss:9-429. Import sebenarnya mengikuti urutan itu, dimulai dari mixin lalu komponen.
| Lapisan | Isi | Rujukan |
|---|---|---|
| Mixins | mixins/_navbar.scss | src/assets/scss/_mazer.scss:44-4510 |
| Bootstrap Components Override | dua puluh berkas components/*.scss | src/assets/scss/_mazer.scss:47-10711 |
| Layout dan Utilities | layouts/main.scss, lalu _utilities.scss | src/assets/scss/_mazer.scss:109-11312 |
Setiap berkas komponen menimpa selector Bootstrap dengan variabel dari _variables.scss. Contohnya _card.scss membuang border kartu, memakai $card-cap-padding-y dan $card-cap-padding-x untuk .card-body, serta $card-title-font-size untuk judul src/assets/scss/components/_card.scss:1-6813. Berkas yang sama juga membaca map tema lewat map-get($theme-colors, 'success') src/assets/scss/components/_card.scss:9614.
_sidebar.scss memakai variabel khusus sidebar: .sidebar-wrapper berlebar 300px, position: fixed, dan background-color: $sidebar-bg src/assets/scss/components/_sidebar.scss:36-4515. Di sisi lain, layouts/main.scss menetapkan #main { margin-left: 300px } sebagai angka literal src/assets/scss/layouts/main.scss:1-1916.
⚠️ Lebar sidebar 300px muncul di dua tempat tanpa variabel bersama:
$sidebar-*di_variables.scssdan angka300pxdi_sidebar.scsssertalayouts/main.scss. Mengubah lebar sidebar menuntut perubahan di kedua berkas itu.
_utilities.scss menunjukkan bagaimana satu variabel menyebar ke output: ia mengiterasi $theme-colors-light dengan @each, lalu memilih nilai background-color berbeda ketika $dark-mode bernilai benar src/assets/scss/_utilities.scss:24-4417. Cabang yang sama dipakai _alert.scss src/assets/scss/components/_alert.scss:2518. Nilai $dark-mode sendiri dideklarasikan false di berkas variabel src/assets/scss/_variables.scss:1219, dan mekanisme pengubahannya dibahas di Mode Gelap dan Persistensi Tema.
Variabel tema di _variables.scss
| Variabel | Nilai awal | Rujukan |
|---|---|---|
$theme-colors-light | map tujuh kunci: primary #ebf3ff, secondary #E6EAEE, success #D2FFE8, danger #FFDEDE, warning #fffdd8, info #e6fdff, dark #e3e3e3 | src/assets/scss/_variables.scss:18-2620 |
$assets-path | '/assets' | src/assets/scss/_variables.scss:6321 |
$body-bg dan $body-color | #f2f7ff dan #607080 | src/assets/scss/_variables.scss:98-9922 |
$blue | #435ebe | src/assets/scss/_variables.scss:13123 |
$primary dan $sidebar-bg | $primary: $blue; $sidebar-bg: #fff; $sidebar-link-color: #25396f | src/assets/scss/_variables.scss:160-18224 |
$theme-colors | map delapan kunci dengan "dark": #131313 | src/assets/scss/_variables.scss:204-21725 |
$font-family-base | "Nunito" | src/assets/scss/_variables.scss:597-60126 |
$card-cap-padding-y dan $card-cap-padding-x | 1.5rem | src/assets/scss/_variables.scss:1259-127627 |
$font-family-base: "Nunito" sejalan dengan @font-face di _fonts.scss, sehingga mengganti keluarga font menuntut perubahan di dua berkas. Perhatikan juga bahwa $dark didefinisikan sebagai $body-bg src/assets/scss/_variables.scss:160-18224, sementara kunci dark di $theme-colors bernilai #131313 src/assets/scss/_variables.scss:204-21725. Keduanya bukan warna yang sama.
Lapisan pages dan widgets
Tidak semua SCSS masuk ke bundel inti. Berkas di pages/ dan widgets/ dimuat per halaman lewat tag <link> di HTML, dan masing-masing mengimport ulang variabel agar tetap mandiri.
graph LR
authHtml["src/layouts/auth.html"] --> authScss["pages/auth.scss"]
chatHtml["src/ui-widgets-chatbox.html"] --> chatScss["widgets/chat.scss"]
dtHtml["src/table-datatable.html"] --> dtScss["pages/simple-datatables.scss"]
authScss --> vars["_variables.scss"]
chatScss --> vars
style vars fill:#f59e0b,color:#000
style authScss fill:#8b5cf6,color:#fff
style chatScss fill:#8b5cf6,color:#fff
style dtScss fill:#8b5cf6,color:#fff
%% fig: Stylesheet halaman dimuat di luar bundel inti
%% desc: Halaman tertentu menautkan berkas di pages/ atau widgets/ lewat tag link, dan berkas itu mengimport ulang _variables.scss sendiri.| Halaman | Stylesheet yang dimuat | Rujukan |
|---|---|---|
src/layouts/auth.html | pages/auth.scss | src/layouts/auth.html:1028 |
src/ui-widgets-chatbox.html | widgets/chat.scss | src/ui-widgets-chatbox.html:8229 |
src/table-datatable.html | pages/simple-datatables.scss | src/table-datatable.html:28630 |
pages/auth.scss membuka berkasnya dengan @import "../variables" src/assets/scss/pages/auth.scss:1-1331, jadi variabel Mazer tetap tersedia walau berkas itu tidak melewati app.scss. Berkas yang sama juga memuat blok html[data-bs-theme="dark"] yang mengimport ../themes/dark/variables-dark lalu menyusun ulang latar #auth-right src/assets/scss/pages/auth.scss:44-5032. Pola serupa dipakai widgets/chat.scss, yang mengimport ./../variables di baris pertama sebelum menata .chat-message src/assets/scss/widgets/chat.scss:1-2633.
Mengubah tema tanpa merusak lapisan
Bundel gelap tidak menyalin komponen. app-dark.scss memuat variabel gelap, lalu mengimport ulang mazer dan menambahkan mazer-dark sebelum utilities Bootstrap src/assets/scss/themes/dark/app-dark.scss:53-5734. Yang berubah hanyalah nilai variabel: _variables-dark.scss menetapkan $dark-mode: true src/assets/scss/themes/dark/_variables-dark.scss:335, dan cabang @if($dark-mode) di komponen menghasilkan output berbeda.
Untuk menambah komponen, letakkan berkas baru di src/assets/scss/components/ dan daftarkan import-nya pada blok komponen src/assets/scss/_mazer.scss:47-10711. Untuk style yang hanya dipakai satu halaman, letakkan di pages/ atau widgets/ dan muat lewat <link> seperti tabel di atas. Alur build yang menggabungkan semuanya dijelaskan di Alur Build Vite dan Nunjucks, sedangkan build rtlcss dibahas di Layout RTL dan Build rtlcss.