Skip to content

Commit be1d711

Browse files
authored
Merge pull request #228 from boostcampwm-2024/feature-fe-#222
사이드 바, 에디터 UI/UX 수정
2 parents 5026834 + a69cf46 commit be1d711

File tree

12 files changed

+89
-51
lines changed

12 files changed

+89
-51
lines changed

apps/frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
"globals": "^15.11.0",
6565
"prettier": "^3.3.3",
6666
"prettier-plugin-tailwindcss": "^0.6.8",
67+
"tailwind-scrollbar": "^3.1.0",
6768
"typescript": "~5.6.2",
6869
"typescript-eslint": "^8.11.0",
6970
"vite": "^5.4.10",

apps/frontend/public/logo.png

-269 KB
Loading

apps/frontend/src/App.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
22

33
import Sidebar from "./components/sidebar";
4-
import HoverTrigger from "./components/HoverTrigger";
54
import EditorView from "./components/EditorView";
65
import SideWrapper from "./components/layout/SideWrapper";
76
import Canvas from "./components/canvas";
8-
import ScrollWrapper from "./components/layout/ScrollWrapper";
97

108
import { useSyncedUsers } from "./hooks/useSyncedUsers";
119

@@ -17,15 +15,13 @@ function App() {
1715
return (
1816
<QueryClientProvider client={queryClient}>
1917
<div className="fixed inset-0 bg-white">
20-
<SideWrapper side="right">
18+
<SideWrapper side="right" className="z-50">
2119
<EditorView />
2220
</SideWrapper>
2321
<Canvas className="z-0 h-full w-full" />
24-
<HoverTrigger className="absolute inset-0 z-20 w-64">
25-
<ScrollWrapper height={"h-[720px]"} className="overflow-x-clip">
26-
<Sidebar />
27-
</ScrollWrapper>
28-
</HoverTrigger>
22+
<SideWrapper side="left" className="left-4 top-4">
23+
<Sidebar />
24+
</SideWrapper>
2925
</div>
3026
</QueryClientProvider>
3127
);

apps/frontend/src/components/LogoBtn.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import logo from "/logo.png?url";
2-
32
interface LogoBtnProps {
43
onClick?: () => void;
54
}
65
export default function LogoBtn({ onClick }: LogoBtnProps) {
76
return (
8-
<button className="h-8 w-8 overflow-clip rounded-md" onClick={onClick}>
7+
<button
8+
className="h-6 w-6 overflow-clip rounded-md bg-[#231f20] p-1"
9+
onClick={onClick}
10+
>
911
<img src={logo} />
1012
</button>
1113
);

apps/frontend/src/components/WorkspaceNav.tsx

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
11
interface WorkspaceNavProps {
2-
imageUrl: string;
32
workspaceTitle: string;
43
}
54

6-
export default function WorkspaceNav({
7-
imageUrl,
8-
workspaceTitle,
9-
}: WorkspaceNavProps) {
5+
export default function WorkspaceNav({ workspaceTitle }: WorkspaceNavProps) {
106
return (
117
<div className="flex flex-row items-center justify-center gap-2">
12-
<div className="h-5 w-5 overflow-clip rounded-md">
13-
<img src={imageUrl} />
14-
</div>
158
<h1 className="text-md font-semibold">{workspaceTitle}</h1>
169
</div>
1710
);

apps/frontend/src/components/layout/EditorLayout.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ const EditorLayout = ({ children, saveStatus }: EditorLayoutProps) => {
1313
return (
1414
<div
1515
className={cn(
16-
"absolute right-0 h-[720px] w-[520px] rounded-bl-lg rounded-br-lg rounded-tr-lg border bg-white shadow-lg transition-transform duration-100 ease-in-out",
16+
"absolute right-4 top-4 h-[720px] w-[520px] rounded-lg border bg-white shadow-lg transition-transform duration-100 ease-in-out",
1717
isPanelOpen ? "transform-none" : "translate-x-full",
18-
isMaximized ? "h-screen w-screen" : "w-[520px]",
18+
isMaximized ? "right-0 top-0 h-screen w-screen" : "",
1919
)}
2020
>
2121
<EditorActionPanel saveStatus={saveStatus} />

apps/frontend/src/components/layout/SideWrapper.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { cn } from "@/lib/utils";
2+
13
const sideStyle: { readonly [key in Side]: string } = {
24
left: "left-0",
35
right: "right-0 ",
@@ -10,8 +12,17 @@ type Side = "left" | "right" | "top" | "bottom";
1012
type SideWrapperProps = {
1113
side: Side;
1214
children: React.ReactNode;
15+
className?: string;
1316
};
1417

15-
export default function SideWrapper({ side, children }: SideWrapperProps) {
16-
return <div className={`absolute z-50 ${sideStyle[side]} `}>{children}</div>;
18+
export default function SideWrapper({
19+
side,
20+
children,
21+
className,
22+
}: SideWrapperProps) {
23+
return (
24+
<div className={cn(`absolute z-40 ${sideStyle[side]} `, className)}>
25+
{children}
26+
</div>
27+
);
1728
}

apps/frontend/src/components/sidebar/Tools.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,9 @@ export default function Tools() {
1010
const { pages } = usePages();
1111
const createMutation = useCreatePage();
1212

13-
if (!pages) {
14-
return <div>로딩중...</div>;
15-
}
16-
1713
return (
1814
<Button
19-
className="flex flex-row items-center gap-1 rounded-sm px-2 py-1 font-medium hover:bg-neutral-100"
15+
className={`${!pages && "disabled"} flex w-full flex-row items-center gap-1 rounded-sm px-2 py-1 font-medium hover:bg-neutral-100`}
2016
onClick={() => {
2117
createMutation
2218
.mutateAsync({

apps/frontend/src/components/sidebar/TopNav.tsx

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,44 @@ import VerticalDivider from "@/components/commons/divider/VerticalDivider";
22
import WorkspaceNav from "@/components/WorkspaceNav";
33
import LogoBtn from "@/components/LogoBtn";
44
import ProfileModal from "./ProfileModal";
5-
import workspaceLogo from "@/../public/workspace-logo.svg?url";
65
import { useState } from "react";
6+
import { Menu } from "lucide-react";
7+
import { X } from "lucide-react";
78

8-
export default function TopNav() {
9+
interface TopNavProps {
10+
onExpand: () => void;
11+
isExpanded: boolean;
12+
}
13+
export default function TopNav({ onExpand, isExpanded }: TopNavProps) {
914
const [isModalOpen, setIsModalOpen] = useState(false);
1015

1116
return (
12-
<div className="flex items-center gap-2">
13-
<LogoBtn
14-
onClick={() => {
15-
setIsModalOpen(true);
16-
}}
17-
/>
18-
<ProfileModal
19-
isOpen={isModalOpen}
20-
onCloseModal={() => {
21-
setIsModalOpen(false);
22-
}}
23-
onConfirm={() => {
24-
setIsModalOpen(false);
25-
}}
26-
/>
27-
<VerticalDivider className="h-3" />
28-
<WorkspaceNav imageUrl={workspaceLogo} workspaceTitle="프로젝트 Web15" />
17+
<div className="flex w-full flex-row items-center justify-between">
18+
<div className="flex flex-row items-center gap-2">
19+
<LogoBtn
20+
onClick={() => {
21+
setIsModalOpen(true);
22+
}}
23+
/>
24+
<ProfileModal
25+
isOpen={isModalOpen}
26+
onCloseModal={() => {
27+
setIsModalOpen(false);
28+
}}
29+
onConfirm={() => {
30+
setIsModalOpen(false);
31+
}}
32+
/>
33+
<VerticalDivider className="h-3" />
34+
<WorkspaceNav workspaceTitle="프로젝트 Web15" />
35+
</div>
36+
<button onClick={onExpand}>
37+
{isExpanded ? (
38+
<X color="#3F3F3F" />
39+
) : (
40+
<Menu size={24} color="#3F3F3F" />
41+
)}
42+
</button>
2943
</div>
3044
);
3145
}
Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,29 @@
11
import NoteList from "./NoteList";
22
import TopNav from "./TopNav";
33
import Tools from "./Tools";
4+
import { useState } from "react";
5+
import ScrollWrapper from "@/components/layout/ScrollWrapper";
46

57
export default function Sidebar() {
8+
const [isExpanded, setIsExpanded] = useState(false);
9+
10+
const handleExpand = () => {
11+
setIsExpanded(!isExpanded);
12+
};
13+
614
return (
7-
<div className="z-10 flex w-64 flex-col gap-4 rounded-lg border-[1px] border-neutral-200 bg-white p-4 text-black shadow-sm">
8-
<TopNav />
9-
<Tools />
10-
<NoteList className="mx-1" />
15+
<div className="z-10 flex w-64 flex-col rounded-xl border-[1px] border-neutral-200 bg-white text-black shadow-md">
16+
<div className="p-4">
17+
<TopNav onExpand={handleExpand} isExpanded={isExpanded} />
18+
</div>
19+
<div className={`${isExpanded ? "flex flex-col" : "hidden"} gap-3 pb-4`}>
20+
<div className="w-full px-4">
21+
<Tools />
22+
</div>
23+
<ScrollWrapper className="scrollbar scrollbar-thumb-[#d9d9d9] scrollbar-track-transparent max-h-[604px] overflow-x-clip">
24+
<NoteList className="p-4 pb-0 pt-0" />
25+
</ScrollWrapper>
26+
</div>
1127
</div>
1228
);
1329
}

0 commit comments

Comments
 (0)