feat: Dark/Light mode switcher

This commit is contained in:
April Hall 2025-02-05 19:07:31 -05:00
parent 422682125c
commit da933c04d7
Signed by: arithefirst
GPG Key ID: 4508A15C4DB91C5B
7 changed files with 23 additions and 6 deletions

BIN
bun.lockb

Binary file not shown.

View File

@ -39,11 +39,12 @@
"vite": "^6.0.0" "vite": "^6.0.0"
}, },
"dependencies": { "dependencies": {
"lucide-svelte": "^0.474.0",
"socket.io": "^4.8.1",
"@types/express": "^5.0.0", "@types/express": "^5.0.0",
"cassandra-driver": "^4.7.2", "cassandra-driver": "^4.7.2",
"express": "^4.21.2", "express": "^4.21.2",
"lucide-svelte": "^0.474.0",
"mode-watcher": "^0.5.1",
"socket.io": "^4.8.1",
"socket.io-client": "^4.8.1", "socket.io-client": "^4.8.1",
"tsm": "^2.3.0", "tsm": "^2.3.0",
"uuid": "^11.0.4" "uuid": "^11.0.4"

View File

@ -1,5 +1,6 @@
<script lang="ts"> <script lang="ts">
import MessagesSquare from 'lucide-svelte/icons/messages-square'; import MessagesSquare from 'lucide-svelte/icons/messages-square';
import ModeSwitcher from './modeSwitcher.svelte';
import Channel from './channel.svelte'; import Channel from './channel.svelte';
import type { Snippet } from 'svelte'; import type { Snippet } from 'svelte';
@ -19,6 +20,7 @@
<MessagesSquare class="h-6 w-6" /> <MessagesSquare class="h-6 w-6" />
<span class="">SVChat</span> <span class="">SVChat</span>
</a> </a>
<ModeSwitcher />
</div> </div>
<div class="flex-1"> <div class="flex-1">
<nav class="grid items-start px-2 text-sm font-medium lg:px-4"> <nav class="grid items-start px-2 text-sm font-medium lg:px-4">

View File

@ -3,9 +3,9 @@
const { message, imageSrc, user }: TypeMessage = $props(); const { message, imageSrc, user }: TypeMessage = $props();
</script> </script>
<div class="w-full hover:bg-base-300 bg-base-200 flex py-2"> <div class="w-full hover:bg-gray-200 flex py-2 dark:hover:bg-stone-900">
<div class="avatar mx-2"> <div class="avatar mx-2 rounded-sm">
<div class="w-12 h-12 rounded"> <div class="w-12 h-12 overflow-hidden rounded-lg border bg-white">
<img src={imageSrc} alt="Profile image for {user}" /> <img src={imageSrc} alt="Profile image for {user}" />
</div> </div>
</div> </div>

View File

@ -0,0 +1,12 @@
<script lang="ts">
import Sun from 'lucide-svelte/icons/sun';
import Moon from 'lucide-svelte/icons/moon-star';
import { toggleMode } from 'mode-watcher';
import { Button } from '$lib/components/ui/button/index';
</script>
<Button on:click={toggleMode} variant="outline" size="icon" class="ml-auto">
<Sun class="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
<Moon class="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
<span class="sr-only">Toggle theme</span>
</Button>

View File

@ -2,10 +2,12 @@
import '../app.css'; import '../app.css';
import type { LayoutProps } from './$types'; import type { LayoutProps } from './$types';
import MainLayout from '$lib/components/mainLayout.svelte'; import MainLayout from '$lib/components/mainLayout.svelte';
import { ModeWatcher } from 'mode-watcher';
let { data, children }: LayoutProps = $props(); let { data, children }: LayoutProps = $props();
const channels = data.channels; const channels = data.channels;
</script> </script>
<ModeWatcher />
<MainLayout {channels}> <MainLayout {channels}>
{@render children()} {@render children()}
</MainLayout> </MainLayout>

View File

@ -47,7 +47,7 @@
{/each} {/each}
{/snippet} {/snippet}
<div class="flex flex-1 flex-col items-center justify-center rounded-lg shadow-sm gap-1 h-full"> <div class="flex flex-1 flex-col items-center justify-center rounded-lg shadow-sm gap-1 h-full">
<div class="flex-grow flex-col-reverse flex flex-auto overflow-y-scroll overflow-x-hidden rounded-lg border-2 w-full"> <div class="flex-grow flex-col-reverse flex flex-auto overflow-y-scroll overflow-x-hidden rounded-lg border w-full">
{@render message(log)} {@render message(log)}
{@render message(data.messages)} {@render message(data.messages)}
</div> </div>