Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added mkdir
Empty file.
43 changes: 43 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
"preview": "vite preview"
},
"dependencies": {
"@fullcalendar/daygrid": "^6.1.20",
"@fullcalendar/react": "^6.1.20",
"@tanstack/react-query": "^5.90.20",
"react": "^19.2.0",
"react-dom": "^19.2.0",
Expand Down
61 changes: 56 additions & 5 deletions src/App.tsx
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기 라우팅 경로 설정 지우시면 안되고 메인 화면은 페이지 따로 생성해서 구현하셔야 할 것 같아요!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사이드바 컴포넌트만 만들어주시고 페이지는 제가 생성할게요!

Original file line number Diff line number Diff line change
@@ -1,11 +1,62 @@
import { Routes, Route } from 'react-router-dom';
import LoginPage from './pages/LoginPage';
import { useState } from 'react';
import Sidebar from './components/sidebar';

function App() {
const dummyStudents = ["김제현", "이슬아", "박지민", "최유진"];
const [selectedStudent, setSelectedStudent] = useState<string | null>(dummyStudents[0]);

return (
<Routes>
<Route path="/login" element={<LoginPage />} />
</Routes>
<div className="flex min-h-screen bg-[#F9FAFB]">
{/* 좌측 사이드바: Sidebar.tsx 내부에 'sticky top-0'과 'h-screen'이 있어야 고정됩니다. */}
<Sidebar
role="mentor"
userName="김정엽"
students={dummyStudents}
selectedStudent={selectedStudent}
onStudentSelect={setSelectedStudent}
/>

{/* 우측 메인 콘텐츠 영역: 세로로 아주 길게 설정 */}
<main className="flex-1 p-12 overflow-y-auto">
<div className="max-w-5xl mx-auto space-y-12">
{/* 상단 섹션 */}
<header>
<h2 className="text-2xl font-bold text-gray-900">
{selectedStudent} 학생 학습 관리 대시보드
</h2>
<p className="text-gray-400 mt-2">스크롤을 내려서 사이드바 고정을 확인해보세요. ↓</p>
</header>

{/* 테스트용 긴 콘텐츠 박스들 */}
<div className="grid gap-8">
<section className="bg-white h-[600px] rounded-2xl shadow-sm border border-gray-100 p-8">
<h3 className="text-lg font-bold mb-4">오늘 할 일 (상단)</h3>
<div className="w-full h-full bg-gray-50 rounded-xl border border-dashed border-gray-200 flex items-center justify-center text-gray-400">
콘텐츠 1
</div>
</section>

<section className="bg-white h-[600px] rounded-2xl shadow-sm border border-gray-100 p-8">
<h3 className="text-lg font-bold mb-4">주간 학습 리포트 (중간)</h3>
<div className="w-full h-full bg-gray-50 rounded-xl border border-dashed border-gray-200 flex items-center justify-center text-gray-400">
콘텐츠 2
</div>
</section>

<section className="bg-white h-[800px] rounded-2xl shadow-sm border border-gray-100 p-8">
<h3 className="text-lg font-bold mb-4">월간 계획표 (하단)</h3>
<div className="w-full h-full bg-gray-50 rounded-xl border border-dashed border-gray-200 flex items-center justify-center text-gray-400">
콘텐츠 3
</div>
</section>
</div>

<footer className="py-10 text-center text-gray-300">
끝까지 내려왔습니다! 여전히 사이드바가 왼쪽에 보이나요?
</footer>
</div>
</main>
</div>
);
}

Expand Down
3 changes: 3 additions & 0 deletions src/assets/logoutIcon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions src/assets/profileIcon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
92 changes: 92 additions & 0 deletions src/components/Sidebar.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import React from 'react';
// 아이콘 파일 import
import profileIcon from '../assets/profileIcon.svg';
import logoutIcon from '../assets/logoutIcon.svg';

interface SidebarProps {
role: 'mentor' | 'mentee';
userName: string;
students?: string[];
selectedStudent?: string | null;
onStudentSelect?: (name: string) => void;
}

const Sidebar: React.FC<SidebarProps> = ({
role,
userName,
students = [],
selectedStudent,
onStudentSelect,
}) => {
return (
<aside className="w-[12.5vw] h-screen bg-white border-r border-gray-200 flex flex-col p-[2.22vh_1.25vw] sticky top-0 shadow-sm overflow-x-hidden">
{/* 상단 프로필 영역 */}
<div className="mb-[3.7vh]">
<div className="text-[0.78vw] text-[#FF6738] font-bold mb-[1.48vh]">설 스터디</div>
<div className="flex items-center gap-[0.625vw] mb-[0.09vh]">
<div className="w-[1.45vw] h-[2.59vh] flex items-center justify-center overflow-hidden">
<img src={profileIcon} alt="프로필" className="w-full h-full object-contain" />
</div>
<span className="text-[1.25vw] font-bold text-[#111111] tracking-tight">{userName}</span>
</div>

{role !== 'mentor' && (
<button className="text-[0.78vw] text-[#505050] mt-[0.09vh] ml-[2.08vw] transition-colors">
마이페이지 &gt;
</button>
)}
</div>

{/* 중앙 영역 */}
<div className="flex-1 overflow-y-auto overflow-x-hidden [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden">

{/* 학생 목록 영역 (멘토 전용) */}
{role === 'mentor' && (
<div className="mb-[4.44vh]">
<div className="text-[0.67vw] text-[#111111] font-extrabold mb-[1.85vh] uppercase tracking-wider">학생 목록</div>
<ul className="space-y-[1.85vh] pl-[0.41vw]">
{students.map((student) => (
<li
key={student}
onClick={() => onStudentSelect?.(student)}
className={`cursor-pointer text-[0.78vw] ${
student === selectedStudent
? 'text-[#FF6738] font-bold'
: 'text-[#505050]'
}`}
>
{student}
</li>
))}
</ul>
</div>
)}

{/* 메뉴 영역 */}
<nav>
<div className="text-[0.67vw] text-[#111111] font-extrabold mb-[1.85vh] uppercase tracking-wider">메뉴</div>
<ul className="space-y-[2.59vh] pl-[0.41vw]">
{['질의응답', '서울대생칼럼', '줌미팅 피드백', '약점 맞춤 솔루션'].map((menu) => (
<li
key={menu}
className="text-[0.78vw] text-[#505050] cursor-pointer font-medium transition-colors"
>
{menu}
</li>
))}
</ul>
</nav>
</div>

{/* 로그아웃 */}
<div className="mt-auto">
<button className="flex items-center gap-[0.41vw] text-[0.78vw] text-[#111111]">
<img src={logoutIcon} alt="로그아웃" className="w-[0.93vw] h-[0.93vw]" />
로그아웃
</button>
</div>
</aside>
);
};

export default Sidebar;