Skip to content

Commit 08e4da2

Browse files
mikecaoclaude
andcommitted
Move settings nav into SideNav, matching WebsiteNav pattern
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 04c7216 commit 08e4da2

File tree

4 files changed

+79
-29
lines changed

4 files changed

+79
-29
lines changed

src/app/(main)/SideNav.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
TooltipTrigger,
1111
} from '@umami/react-zen';
1212
import Link from 'next/link';
13+
import { SettingsNav } from '@/app/(main)/settings/SettingsNav';
1314
import { WebsiteNav } from '@/app/(main)/websites/[websiteId]/WebsiteNav';
1415
import { IconLabel } from '@/components/common/IconLabel';
1516
import { useGlobalState, useMessages, useNavigation } from '@/components/hooks';
@@ -83,6 +84,8 @@ export function SideNav(props: any) {
8384
</Row>
8485
{websiteId ? (
8586
<WebsiteNav websiteId={websiteId} isCollapsed={isCollapsed} />
87+
) : pathname.includes('/settings') ? (
88+
<SettingsNav isCollapsed={isCollapsed} />
8689
) : (
8790
<Column gap="2">
8891
{links.map(({ id, path, label, icon }) => {
Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,12 @@
11
'use client';
2-
import { Column, Grid } from '@umami/react-zen';
2+
import { Column } from '@umami/react-zen';
33
import type { ReactNode } from 'react';
44
import { PageBody } from '@/components/common/PageBody';
5-
import { SettingsNav } from './SettingsNav';
65

76
export function SettingsLayout({ children }: { children: ReactNode }) {
87
return (
9-
<Grid columns={{ base: '1fr', lg: 'auto 1fr' }} width="100%" height="100%">
10-
<Column
11-
display={{ base: 'none', lg: 'flex' }}
12-
width="240px"
13-
height="100%"
14-
border="right"
15-
marginRight="2"
16-
padding="3"
17-
>
18-
<SettingsNav />
19-
</Column>
20-
<Column gap="6" margin="2">
21-
<PageBody>{children}</PageBody>
22-
</Column>
23-
</Grid>
8+
<Column gap="6" margin="2" width="100%">
9+
<PageBody>{children}</PageBody>
10+
</Column>
2411
);
2512
}

src/app/(main)/settings/SettingsNav.tsx

Lines changed: 63 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
1-
import { NavMenu } from '@/components/common/NavMenu';
1+
import { Column, Focusable, Row, Text, Tooltip, TooltipTrigger } from '@umami/react-zen';
2+
import Link from 'next/link';
3+
import { IconLabel } from '@/components/common/IconLabel';
24
import { useMessages, useNavigation } from '@/components/hooks';
3-
import { Settings2, UserCircle, Users } from '@/components/icons';
5+
import { ArrowLeft, Settings2, UserCircle, Users } from '@/components/icons';
46

5-
export function SettingsNav({ onItemClick }: { onItemClick?: () => void }) {
7+
export function SettingsNav({
8+
isCollapsed,
9+
onItemClick,
10+
}: {
11+
isCollapsed?: boolean;
12+
onItemClick?: () => void;
13+
}) {
614
const { t, labels } = useMessages();
715
const { renderUrl, pathname } = useNavigation();
816

@@ -42,12 +50,57 @@ export function SettingsNav({ onItemClick }: { onItemClick?: () => void }) {
4250
.find(({ path }) => path && pathname.includes(path.split('?')[0]))?.id;
4351

4452
return (
45-
<NavMenu
46-
items={items}
47-
title={t(labels.settings)}
48-
selectedKey={selectedKey}
49-
allowMinimize={false}
50-
onItemClick={onItemClick}
51-
/>
53+
<Column gap="2">
54+
<Link href={renderUrl('/boards', false)} role="button" onClick={onItemClick}>
55+
<TooltipTrigger isDisabled={!isCollapsed} delay={0}>
56+
<Focusable>
57+
<Row
58+
alignItems="center"
59+
hover={{ backgroundColor: 'surface-sunken' }}
60+
borderRadius
61+
minHeight="40px"
62+
>
63+
<IconLabel icon={<ArrowLeft />} label={isCollapsed ? '' : t(labels.back)} padding />
64+
</Row>
65+
</Focusable>
66+
<Tooltip placement="right">{t(labels.back)}</Tooltip>
67+
</TooltipTrigger>
68+
</Link>
69+
{items.map(({ label: sectionLabel, items: sectionItems }, index) => (
70+
<Column key={`${sectionLabel}${index}`} gap="1" marginBottom="1">
71+
{!isCollapsed && (
72+
<Row padding>
73+
<Text weight="bold">{sectionLabel}</Text>
74+
</Row>
75+
)}
76+
{sectionItems.map(({ id, path, label, icon }) => {
77+
const isSelected = selectedKey === id;
78+
return (
79+
<Link key={id} href={path} role="button" onClick={onItemClick}>
80+
<TooltipTrigger isDisabled={!isCollapsed} delay={0}>
81+
<Focusable>
82+
<Row
83+
alignItems="center"
84+
hover={{ backgroundColor: 'surface-sunken' }}
85+
backgroundColor={isSelected ? 'surface-sunken' : undefined}
86+
borderRadius
87+
minHeight="40px"
88+
>
89+
<IconLabel
90+
icon={icon}
91+
label={isCollapsed ? '' : label}
92+
weight={isSelected ? 'bold' : undefined}
93+
padding
94+
/>
95+
</Row>
96+
</Focusable>
97+
<Tooltip placement="right">{label}</Tooltip>
98+
</TooltipTrigger>
99+
</Link>
100+
);
101+
})}
102+
</Column>
103+
))}
104+
</Column>
52105
);
53106
}

src/components/input/TeamsButton.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,16 @@ export function TeamsButton() {
4747
return (
4848
<MenuTrigger>
4949
<Button variant="quiet">
50-
<Row alignItems="center" position="relative" gap maxHeight="40px">
50+
<Row
51+
alignItems="center"
52+
position="relative"
53+
gap
54+
maxHeight="40px"
55+
minWidth="200px"
56+
maxWidth="200px"
57+
>
5158
<Icon>{teamId ? <Users /> : <User />}</Icon>
52-
<Text>{label}</Text>
59+
<Text truncate>{label}</Text>
5360
</Row>
5461
<Icon rotate={90} size="sm">
5562
<ChevronRight />

0 commit comments

Comments
 (0)