Skip to content

Commit 8396d07

Browse files
IceWolf0110icewolf0110developermithu
authored
add theme toggle component (#37)
* add simple theme toggle component * remove x-init as init function executes automatically * Update TallCraftUiServiceProvider.php * Add class support --------- Co-authored-by: icewolf0110 <icewolf0110@gmail.com> Co-authored-by: Mithu Das <64677211+developermithu@users.noreply.github.com>
1 parent 9971a59 commit 8396d07

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

src/TallCraftUiServiceProvider.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
use Developermithu\Tallcraftui\View\Components\Table\Th;
5252
use Developermithu\Tallcraftui\View\Components\Table\Tr;
5353
use Developermithu\Tallcraftui\View\Components\Textarea;
54+
use Developermithu\Tallcraftui\View\Components\ThemeToggle;
5455
use Developermithu\Tallcraftui\View\Components\Toast;
5556
use Developermithu\Tallcraftui\View\Components\Toggle;
5657
use Developermithu\Tallcraftui\View\Components\Tooltip;
@@ -144,6 +145,7 @@ private function registerComponents(): void
144145
'markdown' => Markdown::class,
145146
'progress' => Progress::class,
146147
'progress-radial' => ProgressRadial::class,
148+
'theme-toggle' => ThemeToggle::class,
147149
];
148150

149151
foreach ($components as $name => $class) {
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
namespace Developermithu\Tallcraftui\View\Components;
4+
5+
use Closure;
6+
use Illuminate\Contracts\View\View;
7+
use Illuminate\View\Component;
8+
9+
class ThemeToggle extends Component
10+
{
11+
public function render(): View|Closure|string
12+
{
13+
return <<<'HTML'
14+
<div x-data="{
15+
isDarkMode: false,
16+
init() {
17+
this.isDarkMode = localStorage.getItem('dark-mode') === 'true' ||
18+
(!('dark-mode' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches);
19+
this.applyTheme();
20+
},
21+
toggleDarkMode() {
22+
this.isDarkMode = !this.isDarkMode;
23+
localStorage.setItem('dark-mode', this.isDarkMode);
24+
this.applyTheme();
25+
},
26+
applyTheme() {
27+
if (this.isDarkMode) {
28+
document.documentElement.classList.add('dark');
29+
} else {
30+
document.documentElement.classList.remove('dark');
31+
}
32+
}
33+
}">
34+
<label class="sr-only">Theme</label>
35+
<button
36+
@click="toggleDarkMode()"
37+
aria-label="Theme"
38+
{{ $attributes
39+
->withoutTwMergeClasses()
40+
->twMerge([
41+
'flex items-center justify-center w-6 h-6 p-1 xxs:w-10 xxs:h-10 xxs:p-1.5 bg-transparent rounded-full hover:bg-gray-100 dark:hover:bg-slate-700 dark:ring-inset dark:ring-white/5',
42+
])
43+
}}
44+
>
45+
<x-tc-icon
46+
x-cloak
47+
name="sun"
48+
x-show="!isDarkMode"
49+
{{ $attributes->twMergeFor('icon-light', 'text-teal-500 dark:text-teal-500') }}
50+
/>
51+
<x-tc-icon
52+
x-cloak
53+
name="moon"
54+
x-show="isDarkMode"
55+
{{ $attributes->twMergeFor('icon-dark', 'text-teal-500 dark:text-teal-500') }}
56+
/>
57+
</button>
58+
</div>
59+
HTML;
60+
}
61+
}

0 commit comments

Comments
 (0)