feat: Move theme toggle to profile dropdown with icon-only SegmentedControl
Changes: - Moved theme toggle from separate DesktopSidebar component into UserMenu dropdown - Replaced simple light/dark toggle with SegmentedControl offering three options: - Light (sun icon) - Dark (moon icon) - System/Auto (desktop icon) - Uses icon-only labels for compact display in dropdown menu - Defaults to 'auto' mode (respects system preference) as configured in layout.tsx - Removed standalone ThemeToggle component from DesktopSidebar Benefits: - Cleaner navigation UI with one less separate control - Better UX with system preference option - More compact dropdown menu layout 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -13,7 +13,6 @@ import { IconMessageCircle, IconEdit, IconChartBubbleFilled } from '@tabler/icon
|
|||||||
import { useSelector } from '@xstate/react';
|
import { useSelector } from '@xstate/react';
|
||||||
import { useAppMachine } from '@/hooks/useAppMachine';
|
import { useAppMachine } from '@/hooks/useAppMachine';
|
||||||
import { UserMenu } from '@/components/UserMenu';
|
import { UserMenu } from '@/components/UserMenu';
|
||||||
import { ThemeToggle } from '@/components/ThemeToggle';
|
|
||||||
import styles from './DesktopSidebar.module.css';
|
import styles from './DesktopSidebar.module.css';
|
||||||
|
|
||||||
export function DesktopSidebar() {
|
export function DesktopSidebar() {
|
||||||
@@ -106,10 +105,7 @@ export function DesktopSidebar() {
|
|||||||
|
|
||||||
<Divider my="md" />
|
<Divider my="md" />
|
||||||
|
|
||||||
{/* Theme Toggle */}
|
{/* User Menu - styled like other nav items, now includes theme toggle */}
|
||||||
<ThemeToggle />
|
|
||||||
|
|
||||||
{/* User Menu - styled like other nav items */}
|
|
||||||
<UserMenu showLabel={true} />
|
<UserMenu showLabel={true} />
|
||||||
|
|
||||||
{/* Development state panel */}
|
{/* Development state panel */}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { Menu, Avatar, NavLink, ActionIcon } from '@mantine/core';
|
import { Menu, Avatar, NavLink, ActionIcon, SegmentedControl, Text } from '@mantine/core';
|
||||||
|
import { useMantineColorScheme } from '@mantine/core';
|
||||||
|
import { IconSun, IconMoon, IconDeviceDesktop } from '@tabler/icons-react';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
|
|
||||||
interface UserProfile {
|
interface UserProfile {
|
||||||
@@ -13,6 +15,7 @@ interface UserProfile {
|
|||||||
|
|
||||||
export function UserMenu({ showLabel = false }: { showLabel?: boolean } = {}) {
|
export function UserMenu({ showLabel = false }: { showLabel?: boolean } = {}) {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
const { colorScheme, setColorScheme } = useMantineColorScheme();
|
||||||
const [profile, setProfile] = useState<UserProfile | null>(null);
|
const [profile, setProfile] = useState<UserProfile | null>(null);
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
|
|
||||||
@@ -129,6 +132,47 @@ export function UserMenu({ showLabel = false }: { showLabel?: boolean } = {}) {
|
|||||||
@{profile.handle}
|
@{profile.handle}
|
||||||
</span>
|
</span>
|
||||||
</Menu.Label>
|
</Menu.Label>
|
||||||
|
<Menu.Divider />
|
||||||
|
|
||||||
|
{/* Theme Selection */}
|
||||||
|
<div style={{ padding: '8px 12px' }}>
|
||||||
|
<Text size="xs" fw={500} c="dimmed" mb={8}>
|
||||||
|
Theme
|
||||||
|
</Text>
|
||||||
|
<SegmentedControl
|
||||||
|
value={colorScheme}
|
||||||
|
onChange={(value) => setColorScheme(value as 'light' | 'dark' | 'auto')}
|
||||||
|
data={[
|
||||||
|
{
|
||||||
|
value: 'light',
|
||||||
|
label: (
|
||||||
|
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
|
||||||
|
<IconSun size={16} />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'dark',
|
||||||
|
label: (
|
||||||
|
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
|
||||||
|
<IconMoon size={16} />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'auto',
|
||||||
|
label: (
|
||||||
|
<div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>
|
||||||
|
<IconDeviceDesktop size={16} />
|
||||||
|
</div>
|
||||||
|
),
|
||||||
|
},
|
||||||
|
]}
|
||||||
|
fullWidth
|
||||||
|
size="xs"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
<Menu.Divider />
|
<Menu.Divider />
|
||||||
<Menu.Item onClick={handleLogout} c="red">
|
<Menu.Item onClick={handleLogout} c="red">
|
||||||
Log out
|
Log out
|
||||||
|
|||||||
Reference in New Issue
Block a user