Theme switcher

This commit is contained in:
Полина 2025-01-18 07:56:58 +03:00
parent fddb93dff9
commit cb9aa57e64
2 changed files with 76 additions and 17 deletions

View file

@ -33,21 +33,23 @@ export function App() {
class="invisible size-0" class="invisible size-0"
src={import.meta.env.VITE_IFRAME_URL} src={import.meta.env.VITE_IFRAME_URL}
/> />
<nav class="relative flex h-auto w-full shrink-0 flex-row items-center overflow-hidden px-4 py-2"> <nav class="relative flex h-auto w-full shrink-0 flex-row items-center justify-between overflow-hidden px-4 py-2">
<h1 class="font-mono text-base"> <h1 class="font-mono text-base">
@mtcute/ @mtcute/
<b>playground</b> <b>playground</b>
</h1> </h1>
<NavbarMenu <div class="flex items-center gap-1">
onShowAccounts={() => { <NavbarMenu
setShowSettings(true) onShowAccounts={() => {
setSettingsTab('accounts') setShowSettings(true)
}} setSettingsTab('accounts')
onShowSettings={() => { }}
setShowSettings(true) onShowSettings={() => {
}} setShowSettings(true)
/> }}
/>
</div>
</nav> </nav>
<div class="h-px shrink-0 bg-border" /> <div class="h-px shrink-0 bg-border" />
<Show <Show

View file

@ -1,7 +1,9 @@
import type { ConfigColorMode, MaybeConfigColorMode } from '@kobalte/core'
import type { DropdownMenuTriggerProps } from '@kobalte/core/dropdown-menu' import type { DropdownMenuTriggerProps } from '@kobalte/core/dropdown-menu'
import { LucideCheck, LucideChevronDown, LucideExternalLink, LucideLogIn, LucideUsers } from 'lucide-solid' import { useColorMode } from '@kobalte/core'
import { LucideCheck, LucideChevronRight, LucideExternalLink, LucideLaptop, LucideLogIn, LucideMoon, LucideSun, LucideUsers } from 'lucide-solid'
import { SiGithub } from 'solid-icons/si' import { SiGithub } from 'solid-icons/si'
import { For, Show } from 'solid-js' import { createSignal, For, Show } from 'solid-js'
import { Button } from '../../lib/components/ui/button.tsx' import { Button } from '../../lib/components/ui/button.tsx'
import { import {
DropdownMenu, DropdownMenu,
@ -10,6 +12,9 @@ import {
DropdownMenuGroupLabel, DropdownMenuGroupLabel,
DropdownMenuItem, DropdownMenuItem,
DropdownMenuSeparator, DropdownMenuSeparator,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuTrigger, DropdownMenuTrigger,
} from '../../lib/components/ui/dropdown-menu.tsx' } from '../../lib/components/ui/dropdown-menu.tsx'
import { cn } from '../../lib/utils.ts' import { cn } from '../../lib/utils.ts'
@ -21,9 +26,17 @@ export function NavbarMenu(props: {
onShowAccounts: () => void onShowAccounts: () => void
onShowSettings: () => void onShowSettings: () => void
}) { }) {
const { setColorMode } = useColorMode()
const [localColorMode, setLocalColorMode] = createSignal(localStorage.getItem('kb-color-mode') as MaybeConfigColorMode)
const activeAccount = useStore($activeAccount) const activeAccount = useStore($activeAccount)
const accounts = useStore($accounts) const accounts = useStore($accounts)
// See: https://github.com/kobaltedev/kobalte/issues/543
function updateColorMode(mode: ConfigColorMode) {
setLocalColorMode(mode)
setColorMode(mode)
}
return ( return (
<Show <Show
when={activeAccount() != null} when={activeAccount() != null}
@ -31,7 +44,7 @@ export function NavbarMenu(props: {
<Button <Button
variant="ghost" variant="ghost"
size="icon" size="icon"
class="ml-auto w-auto px-2" class="w-auto px-2"
onClick={props.onShowAccounts} onClick={props.onShowAccounts}
> >
<LucideLogIn class="mr-2 size-4 shrink-0" /> <LucideLogIn class="mr-2 size-4 shrink-0" />
@ -43,15 +56,14 @@ export function NavbarMenu(props: {
<DropdownMenuTrigger <DropdownMenuTrigger
as={(props: DropdownMenuTriggerProps) => ( as={(props: DropdownMenuTriggerProps) => (
<Button <Button
class="z-10 ml-auto px-2" class="px-3"
variant="ghost" variant="ghost"
{...props} {...props}
> >
<AccountAvatar class="size-6" account={activeAccount()!} /> <span class="mr-3 max-w-[120px] truncate">
<span class="ml-2 max-w-[120px] truncate">
{activeAccount()!.name} {activeAccount()!.name}
</span> </span>
<LucideChevronDown class="ml-2 size-4" /> <AccountAvatar class="size-6" account={activeAccount()!} />
</Button> </Button>
)} )}
/> />
@ -87,6 +99,51 @@ export function NavbarMenu(props: {
<LucideUsers class="mr-2 size-4" /> <LucideUsers class="mr-2 size-4" />
Manage accounts Manage accounts
</DropdownMenuItem> </DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger class="flex items-center justify-between">
<div class="flex flex-row items-center">
<LucideSun class="mr-2 size-4 rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
<LucideMoon class="absolute mr-2 size-4 rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
Theme
</div>
<LucideChevronRight class="size-4" />
</DropdownMenuSubTrigger>
<DropdownMenuSubContent class="w-[128px]">
<DropdownMenuItem onSelect={() => updateColorMode('light')}>
<div class="flex w-full items-center justify-between">
<div class="flex flex-row items-center">
<LucideSun class="mr-2 size-4" />
<span>Light</span>
</div>
<div>
<LucideCheck class={`ml-auto size-4 ${localColorMode() !== 'light' ? 'hidden' : ''}`} />
</div>
</div>
</DropdownMenuItem>
<DropdownMenuItem onSelect={() => updateColorMode('dark')}>
<div class="flex w-full items-center justify-between">
<div class="flex flex-row items-center">
<LucideMoon class="mr-2 size-4" />
<span>Dark</span>
</div>
<div>
<LucideCheck class={`ml-auto size-4 ${localColorMode() !== 'dark' ? 'hidden' : ''}`} />
</div>
</div>
</DropdownMenuItem>
<DropdownMenuItem onSelect={() => updateColorMode('system')}>
<div class="flex w-full items-center justify-between">
<div class="flex flex-row items-center">
<LucideLaptop class="mr-2 size-4" />
<span>System</span>
</div>
<div>
<LucideCheck class={`ml-auto size-4 ${localColorMode() !== 'system' ? 'hidden' : ''}`} />
</div>
</div>
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuSub>
<DropdownMenuItem <DropdownMenuItem
as="a" as="a"
class="cursor-pointer" class="cursor-pointer"