Lompat ke konten
dokumentasi.id
Commit 6ea47ab
v2
Star3,1 rb

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-21. 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-7. Setelah font dan perfect-scrollbar, berkas ditutup dengan ./mazer src/assets/scss/app.scss:20-21.

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.
Fig. 1: Urutan import app.scssVariabel dimuat lebih dulu, lalu Bootstrap dan aset pihak ketiga, dan terakhir _mazer.scss yang memecah lapisan komponen.
LangkahIsiRujukan
1@import "./variables"src/assets/scss/app.scss:1-21
2~bootstrap/scss/bootstrap dan ~bootstrap-icons/font/bootstrap-iconssrc/assets/scss/app.scss:4-7
3./fontssrc/assets/scss/app.scss:14-15
4~perfect-scrollbar/css/perfect-scrollbar.csssrc/assets/scss/app.scss:17-18
5./mazersrc/assets/scss/app.scss:20-21

_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-47.

⚠️ _variables.scss mengimport ~bootstrap/scss/functions dua kali pada dua blok berurutan src/assets/scss/_variables.scss:8-16. 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-17. 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-42. Import sebenarnya mengikuti urutan itu, dimulai dari mixin lalu komponen.

LapisanIsiRujukan
Mixinsmixins/_navbar.scsssrc/assets/scss/_mazer.scss:44-45
Bootstrap Components Overridedua puluh berkas components/*.scsssrc/assets/scss/_mazer.scss:47-107
Layout dan Utilitieslayouts/main.scss, lalu _utilities.scsssrc/assets/scss/_mazer.scss:109-113

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-68. Berkas yang sama juga membaca map tema lewat map-get($theme-colors, 'success') src/assets/scss/components/_card.scss:96.

_sidebar.scss memakai variabel khusus sidebar: .sidebar-wrapper berlebar 300px, position: fixed, dan background-color: $sidebar-bg src/assets/scss/components/_sidebar.scss:36-45. Di sisi lain, layouts/main.scss menetapkan #main { margin-left: 300px } sebagai angka literal src/assets/scss/layouts/main.scss:1-19.

⚠️ Lebar sidebar 300px muncul di dua tempat tanpa variabel bersama: $sidebar-* di _variables.scss dan angka 300px di _sidebar.scss serta layouts/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-44. Cabang yang sama dipakai _alert.scss src/assets/scss/components/_alert.scss:25. Nilai $dark-mode sendiri dideklarasikan false di berkas variabel src/assets/scss/_variables.scss:12, dan mekanisme pengubahannya dibahas di Mode Gelap dan Persistensi Tema.

Variabel tema di _variables.scss

VariabelNilai awalRujukan
$theme-colors-lightmap tujuh kunci: primary #ebf3ff, secondary #E6EAEE, success #D2FFE8, danger #FFDEDE, warning #fffdd8, info #e6fdff, dark #e3e3e3src/assets/scss/_variables.scss:18-26
$assets-path'/assets'src/assets/scss/_variables.scss:63
$body-bg dan $body-color#f2f7ff dan #607080src/assets/scss/_variables.scss:98-99
$blue#435ebesrc/assets/scss/_variables.scss:131
$primary dan $sidebar-bg$primary: $blue; $sidebar-bg: #fff; $sidebar-link-color: #25396fsrc/assets/scss/_variables.scss:160-182
$theme-colorsmap delapan kunci dengan "dark": #131313src/assets/scss/_variables.scss:204-217
$font-family-base"Nunito"src/assets/scss/_variables.scss:597-601
$card-cap-padding-y dan $card-cap-padding-x1.5remsrc/assets/scss/_variables.scss:1259-1276

$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-182, sementara kunci dark di $theme-colors bernilai #131313 src/assets/scss/_variables.scss:204-217. 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.
Fig. 2: Stylesheet halaman dimuat di luar bundel intiHalaman tertentu menautkan berkas di pages/ atau widgets/ lewat tag link, dan berkas itu mengimport ulang _variables.scss sendiri.
HalamanStylesheet yang dimuatRujukan
src/layouts/auth.htmlpages/auth.scsssrc/layouts/auth.html:10
src/ui-widgets-chatbox.htmlwidgets/chat.scsssrc/ui-widgets-chatbox.html:82
src/table-datatable.htmlpages/simple-datatables.scsssrc/table-datatable.html:286

pages/auth.scss membuka berkasnya dengan @import "../variables" src/assets/scss/pages/auth.scss:1-13, 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-50. Pola serupa dipakai widgets/chat.scss, yang mengimport ./../variables di baris pertama sebelum menata .chat-message src/assets/scss/widgets/chat.scss:1-26.

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-57. Yang berubah hanyalah nilai variabel: _variables-dark.scss menetapkan $dark-mode: true src/assets/scss/themes/dark/_variables-dark.scss:3, 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-107. 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.