پیادهسازی دارک مود با Alpine.js
برای فعالسازی حالت دارک مود در پروژههایی که با Alpine.js توسعه داده میشن، میتوانید از Alpine Store به همراه پلاگین persist
استفاده کنید تا حالت دارک مود حتی بعد از رفرش صفحه حفظ بشه.
ابتدا مطمئن بشید که پلاگین @alpinejs/persist
رو نصب و به پروژه خودتون اضافه کرده باشید.
نصب Alpine.js و پلاگین Persist
npm install alpinejs
npm install @alpinejs/persist
راهاندازی دارک مود
سپس کد زیر رو برای ایجاد یک store مخصوص دارک مود اضافه کنید:
document.addEventListener("alpine:init", () => {
Alpine.store("darkMode", {
on: Alpine.$persist(false).as("is_dark"),
toggle() {
this.on = !this.on;
},
});
});
در این کد:
یک store به نام darkMode
ساخته میشه.
پراپرتی on مشخص میکنه که دارک مود فعاله یا نه.
متد toggle()
وظیفه تغییر وضعیت روشن/خاموش دارک مود را برعهده داره.
حالت دارک مود در localStorage
با کلید is_dark
ذخیره میشه و بعد از رفرش صفحه حفظ میشه.
استفاده در HTML
برای فعال یا غیرفعال کردن دارک مود در کل پروژه، میتوانید تگ html
را به صورت زیر تنظیم کنید:
<html
lang="fa"
dir="rtl"
x-bind:class="{ 'dark': $store.darkMode.on }"
x-data
></html>
سپس برای اضافه کردن یک دکمه جهت تغییر وضعیت دارک مود میتوانید از کد زیر استفاده کنید:
<button
type="button"
class="inline-flex items-center justify-center sm:size-10 size-8 cursor-pointer transition-transform active:scale-95"
x-on:click="$store.darkMode.toggle()"
>
<!-- icon:sun -->
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
class="size-5 hidden dark:block"
>
<path
fill="none"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M8 12a4 4 0 1 0 8 0a4 4 0 1 0-8 0m-4 0h.01M12 4v.01M20 12h.01M12 20v.01M6.31 6.31L6.3 6.3m11.41.01l-.01-.01m0 11.4l.01.01M6.3 17.7l.01.01"
/>
</svg>
<!-- icon:moon -->
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
class="size-5 dark:hidden"
>
<path
fill="none"
stroke="currentColor"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="2"
d="M12 3h.393a7.5 7.5 0 0 0 7.92 12.446A9 9 0 1 1 12 2.992zm5 1a2 2 0 0 0 2 2a2 2 0 0 0-2 2a2 2 0 0 0-2-2a2 2 0 0 0 2-2m2 7h2m-1-1v2"
/>
</svg>
</button>