A standalone, framework-agnostic dark mode toggle component for Laravel. Supports Tailwind CSS, Bootstrap 5, and Bootstrap 4, with Blade, Livewire, Vue, React, and Svelte frontend options.
localStorage (instant, no flash)<html class="dark">)config/darkmode.phpcomposer require jeremykenedy/laravel-darkmode-toggle
php artisan darkmode:install --css=tailwind --frontend=blade
| Flag | Values | Default |
|---|---|---|
--css |
tailwind, bootstrap5, bootstrap4 |
tailwind |
--frontend |
blade, livewire, vue, react, svelte |
blade |
--no-config |
Skip publishing config | - |
<head>This prevents a flash of the wrong theme on page load:
<head>
@include('darkmode::init-script')
</head>
Blade (with Alpine.js):
<x-darkmode-toggle />
Livewire:
<livewire:darkmode-toggle />
Vue:
<script setup>
import DarkmodeToggle from './vendor/darkmode-toggle/DarkmodeToggle.vue'
</script>
<template>
<DarkmodeToggle persist-url="/darkmode/preference" />
</template>
React:
import DarkmodeToggle from './vendor/darkmode-toggle/DarkmodeToggle'
export default function Nav() {
return <DarkmodeToggle persistUrl="/darkmode/preference" />
}
Svelte:
<script>
import DarkmodeToggle from './vendor/darkmode-toggle/DarkmodeToggle.svelte'
</script>
<DarkmodeToggle persistUrl="/darkmode/preference" />
php artisan darkmode:install --frontend=vue
php artisan darkmode:install --frontend=react
php artisan darkmode:install --frontend=svelte
php artisan vendor:publish --tag=darkmode-config
Key options in config/darkmode.php:
return [
'strategy' => 'class', // Dark mode strategy
'class_name' => 'dark', // Class added to <html>
'default' => 'system', // Default mode
'storage_key' => 'theme', // localStorage key
'persist_to_server' => true, // Save to DB when authenticated
'persist_route' => '/profile/dark-mode',
'persist_method' => 'PUT',
'persist_field' => 'dark_mode',
'css_framework' => null, // null = inherit from ui-kit config
'routes' => [
'enabled' => true,
'prefix' => 'darkmode',
'middleware' => ['web', 'auth'],
],
];
The package includes a route PUT /darkmode/preference that saves the preference. To use your own route (e.g., from laravel-profiles), set in config:
'persist_route' => '/profile/dark-mode',
'routes' => ['enabled' => false], // disable package route
The toggle sends a JSON request:
{ "dark_mode": "dark" }
Switch CSS framework at any time:
# In .env
UI_KIT_CSS=bootstrap5
Or set directly in config/darkmode.php:
'css_framework' => 'bootstrap5',
The component automatically renders with the correct framework's classes.
<head>, reads localStorage, adds dark class before paintlocalStorage, toggles HTML class, optionally PUTs to serverprefers-color-scheme media query changes in real timeMIT