Skip to content

Commit a46e852

Browse files
committed
Add manual dark/light mode toggle to the user menu
1 parent f07dd47 commit a46e852

File tree

4 files changed

+39
-2
lines changed

4 files changed

+39
-2
lines changed

resources/css/app.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
@import 'tailwindcss';
22

3+
@custom-variant dark (&:where(.dark, .dark *));
4+
35
@plugin "@tailwindcss/typography";
46
@plugin "@tailwindcss/forms";
57

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<svg {{ $attributes }} viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
2+
<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"
3+
d="M12 3h.393a7.5 7.5 0 0 0 7.92 12.446A9 9 0 1 1 12 2.992z" />
4+
</svg>

resources/views/components/layouts/app.blade.php

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,34 @@
11
<!DOCTYPE html>
2-
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
2+
<html
3+
lang="{{ str_replace('_', '-', app()->getLocale()) }}"
4+
x-data="{ darkMode: document.documentElement.classList.contains('dark') }"
5+
x-init="$watch('darkMode', val => localStorage.setItem('darkMode', val))"
6+
x-bind:class="{ 'dark': darkMode }"
7+
>
38

49
<head>
10+
<script>
11+
(function() {
12+
const darkMode = localStorage.getItem('darkMode');
13+
const windowPrefersDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches;
14+
15+
if (darkMode === 'true' || (darkMode === null && windowPrefersDarkMode)) {
16+
document.documentElement.classList.add('dark');
17+
} else {
18+
document.documentElement.classList.remove('dark');
19+
}
20+
})();
21+
</script>
22+
523
<meta charset="utf-8">
624
<meta name="viewport" content="width=device-width, initial-scale=1.0, interactive-widget=resizes-content">
25+
<meta name="apple-mobile-web-app-title" content="Many Notes">
726
<title>{{ $title ?? 'Many Notes' }}</title>
827
<link rel="icon" type="image/png" href="/assets/icon-16x16.png" sizes="16x16">
928
<link rel="icon" type="image/png" href="/assets/icon-32x32.png" sizes="32x32">
1029
<link rel="icon" type="image/svg+xml" href="/assets/icon.svg" sizes="any">
1130
<link rel="shortcut icon" href="/assets/favicon.ico">
1231
<link rel="apple-touch-icon" href="/assets/icon-180x180.png" sizes="180x180">
13-
<meta name="apple-mobile-web-app-title" content="Many Notes">
1432
<link rel="manifest" href="/manifest.json">
1533

1634
@vite('resources/css/app.css')

resources/views/livewire/layout/userMenu.blade.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,19 @@
8181
</x-menu.itemLink>
8282
</x-menu.close>
8383

84+
<x-menu.item @click="darkMode = !darkMode">
85+
<span class="flex items-center justify-between w-full">
86+
<span class="flex items-center gap-2">
87+
<x-icons.moon class="w-4 h-4" />
88+
{{ __('Dark mode') }}
89+
</span>
90+
<label class="inline-flex items-center cursor-pointer">
91+
<input type="checkbox" class="sr-only peer" x-model="darkMode">
92+
<span class="relative w-9 h-5 bg-gray-200 peer-focus:outline-none rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-primary-300 dark:peer-checked:bg-primary-600"></span>
93+
</label>
94+
</span>
95+
</x-menu.item>
96+
8497
<x-menu.itemDivider></x-menu.itemDivider>
8598

8699
@if (auth()->user()->isAdmin())

0 commit comments

Comments
 (0)