Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
a6fa51a
feat(#4): Dashboard νŽ˜μ΄μ§€ 초기 생성 및 κΈ°λ³Έ λΌμš°ν„° μ—°κ²°
Radian06 Jul 5, 2026
163117c
feat((#4): Layout 배치λ₯Ό μœ„ν•œ flex μ„€μ • 적용
Radian06 Jul 5, 2026
c9cf989
style: νŒ¨λ„ λ‘₯κΈ€κΈ° μ‘°μ •
Radian06 Jul 5, 2026
ba3f5e1
feat(#4): SideNav UI κ΅¬ν˜„
Radian06 Jul 5, 2026
162542c
feat(#4): 색상 λ³€μˆ˜ μΆ”κ°€
Radian06 Jul 5, 2026
335fa6d
feat(#4): IDE μƒνƒœ UI μ œμž‘
Radian06 Jul 5, 2026
57bdb90
feat(#4): IDE μƒνƒœ UI 블둝 μ§€μ • λ°©μ§€
Radian06 Jul 5, 2026
7521e15
style(#4): νŒ¨λ„ ν˜Έλ²„ μ„€μ • 및 ν…Œλ‘λ¦¬ κ΅΅κΈ° κ³ μ •
Radian06 Jul 5, 2026
c22c5dc
feat(#4): Dashboard νŽ˜μ΄μ§€ κ΄€λ ¨ 파일 생성 및 μ½”λ“œ μš”μ•½ 컴포 κ΅¬ν˜„
Radian06 Jul 5, 2026
9608a6e
feat(#4): μ½”λ”© μš”μ•½ 컴포 μ—¬λ°± 적용
Radian06 Jul 5, 2026
cdf1069
chore: 개발 ν™˜κ²½ 이동에 λ”°λ₯Έ μ˜μ‘΄μ„± νŒ¨ν‚€μ§€ μ„€μΉ˜
Radian06 Jul 6, 2026
52bf514
refactor(#4): AiCorrectionPanel 파일λͺ… λ³€κ²½
Radian06 Jul 6, 2026
424ce20
feat(#4): 색상 λ³€μˆ˜ μΆ”κ°€
Radian06 Jul 6, 2026
60bea94
feat(#4): μ½”λ“œ 비ꡐ μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„
Radian06 Jul 6, 2026
71e91ba
style(#4): μ½”λ“œ 폰트 μ‚¬μ΄μ¦ˆ μˆ˜μ •
Radian06 Jul 6, 2026
d522458
feat(#4): 색상 λ³€μˆ˜ μΆ”κ°€
Radian06 Jul 6, 2026
bdcd5cb
feat(#4): 취약점TOP2 μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„
Radian06 Jul 6, 2026
1b706d8
chore(#4): CustomQuiz 폴더 생성
Radian06 Jul 6, 2026
b15b750
feat(#4): 색상 λ³€μˆ˜ μΆ”κ°€
Radian06 Jul 6, 2026
fb16305
feat(#4): μ‹€μ‹œκ°„ 맞좀 ν€΄μ¦ˆ νŒ¨λ„ κ΅¬ν˜„
Radian06 Jul 6, 2026
d295503
chore: μ‹€μ‹œκ°„ 맞좀 ν€΄μ¦ˆ λͺ¨λ‹¬ κ΄€λ ¨ 파일 생성
Radian06 Jul 6, 2026
2125e34
feat(#4): IDE λ―Έμ—°κ²° μƒνƒœμ˜ Outlet μ œμž‘
Radian06 Jul 6, 2026
1a14b34
feat(#4): SideNav νŽ˜μ΄μ§€ 이동 κ΅¬ν˜„
Radian06 Jul 6, 2026
12fe6fe
feat(#4): μ‚¬μš©μž λ“œλ‘­μ•„μ›ƒ μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„
Radian06 Jul 6, 2026
ec8ee2d
feat(#4): μ‚¬μš©μž λ“œλ‘­μ•„μ›ƒ λ‹«νžˆλŠ” κΈ°λŠ₯ κ΅¬ν˜„
Radian06 Jul 6, 2026
ec84b6a
feat(#4): μ‚¬μš©μž 인증 X μ»΄ν¬λ„ŒνŠΈ κ΅¬ν˜„
Radian06 Jul 7, 2026
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
72 changes: 72 additions & 0 deletions package-lock.json

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

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"preview": "vite preview"
},
"dependencies": {
"@monaco-editor/react": "^4.7.0",
"@tailwindcss/postcss": "^4.3.2",
"react": "^19.2.7",
"react-dom": "^19.2.7",
Expand Down
12 changes: 11 additions & 1 deletion src/App.jsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
import { BrowserRouter, Routes, Route } from 'react-router-dom';
import MainLayout from './layouts/MainLayout';
import Dashboard from './pages/Dashboard';
import Report from './pages/Report';
import ReviewNote from './pages/ReviewNote';
import AiChat from './pages/AiChat';

function App() {
return (
<BrowserRouter>
<Routes>

<Route element={<MainLayout />}>
<Route path="/" element={<Dashboard />} />
<Route path="/report" element={<Report />} />
<Route path="/review-note" element={<ReviewNote />} />
<Route path="/ai-chat" element={<AiChat />} />
</Route>
</Routes>
</BrowserRouter>
);
Expand Down
Binary file added src/assets/SettingIcon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 14 additions & 0 deletions src/components/IdeDisconnected.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
function IdeDisconnected() {
return (
<div className="flex justify-center items-center w-full h-full select-none">
<div className="panel-base no-hover justify-center w-[33.80vw] h-[29.72vh] gap-[2.04vh]">
<div className="text-white font-bold text-[2.59vh]">
IDE에 μ—°κ²° λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
</div>
<div className="text-gray400 text-[2.22vh]">연결을 확인해 μ£Όμ„Έμš”.</div>
</div>
</div>
);
}

export default IdeDisconnected;
19 changes: 19 additions & 0 deletions src/components/IdeStatus.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
function IdeStatus({ isConnected = false }) {
return (
<div className="flex justify-end w-full h-[6.39vh] select-none">
<div
className={`
flex justify-center items-center w-[11.93vw] h-full rounded-[1.04vw] border text-[2.22vh] font-bold transition-colors
${isConnected
? 'bg-green500-10 border-[0.09vh] border-green500-20 text-green400'
: 'bg-red500-10 border-[0.09vh] border-red500-20 text-red400'
}
`}
>
{isConnected ? '🟒 IDE 연동 쀑' : 'πŸ”΄ IDE 연동 μ „'}
</div>
</div>
);
}

export default IdeStatus;
17 changes: 17 additions & 0 deletions src/components/NotLoggedIn.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
function NotLoggedIn() {
return (
<div className="flex justify-center items-center w-full h-full select-none">
<div className="panel-base no-hover justify-center w-[33.80vw] h-[29.72vh] gap-[2.04vh]">
<div className="text-white font-bold text-[2.59vh]">
둜그인이 λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
</div>
<div className="flex text-gray400 text-[2.22vh]">
<div className="font-bold cursor-pointer underline not-only-of-type:decoration-[0.09vh]">둜그인</div>
<div>을 μ§„ν–‰ν•΄ μ£Όμ„Έμš”.</div>
</div>
</div>
</div>
);
}

export default NotLoggedIn;
93 changes: 93 additions & 0 deletions src/components/SideNav/SideNav.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import { useState, useEffect, useRef } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import SettingIcon from "../../assets/SettingIcon.png";
import UserModal from "./UserModal";

function SideNav() {
const menuItems = [
{ name: 'DASHBOARD', path: '/' },
{ name: 'REPORT', path: '/report' },
{ name: 'REVIEW NOTE', path: '/review-note' },
{ name: 'AI CHAT', path: '/ai-chat' }
];

const location = useLocation();
const navigate = useNavigate();

const [isModalOpen, setIsModalOpen] = useState(false);

const modalRef = useRef(null);

useEffect(() => {
const handleClickOutside = (event) => {
if (modalRef.current && !modalRef.current.contains(event.target)) {
setIsModalOpen(false);
}
};

document.addEventListener('mousedown', handleClickOutside);

return () => {
document.removeEventListener('mousedown', handleClickOutside);
};
}, []);

return (
<div className="panel-base no-hover flex flex-col justify-between w-[17vw] h-full py-[1.67vh] px-[0.94vw] select-none">
<div className="flex flex-col items-center w-[15.10vw] gap-[6.57vh]">
<div className="mt-[5.37vh] text-[3.7vh] font-bold text-purple400">CoFix</div>

<div className="flex flex-col gap-[1.02vh] w-[15.10vw]">
{menuItems.map((item) => {
const isActive = location.pathname === item.path;

return (
<button
key={item.path}
onClick={() => navigate(item.path)}
className={`
flex items-center w-full h-[7.12vh] px-[2.3vw] rounded-[1.04vw]
text-[1.85vh] transition-colors cursor-pointer
${isActive
? 'bg-purple500-10 border-[0.09vh] border-purple500-20 text-purple400 font-bold'
: 'text-gray400 border-[0.09vh] border-transparent hover:bg-white-5'
}
`}
>
{item.name}
</button>
);
})}
</div>
</div>

<div
ref={modalRef}
className="relative flex justify-between items-center w-full h-[7.12vh] px-[2.3vw] bg-gray800-50 rounded-[1.04vw]"
>
{isModalOpen && (
<div className="absolute bottom-[8.5vh] left-[2vw] w-full z-10">
<UserModal />
</div>
)}

<div
className="flex items-center gap-[0.73vw] cursor-pointer"
onClick={() => setIsModalOpen(!isModalOpen)}
>
<div className="w-[1.77vw] h-[1.77vw] rounded-[50%] bg-gray-200"></div>
<div className="text-[1.85vh] font-bold text-gray400">μ‚¬μš©μž</div>
</div>

<img
src={SettingIcon}
alt="settings"
className="w-[1.46vw] cursor-pointer"
onClick={() => setIsModalOpen(!isModalOpen)}
/>
</div>
</div>
);
}

export default SideNav;
44 changes: 44 additions & 0 deletions src/components/SideNav/UserModal.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { useState } from 'react';

function UserModal() {
const [isDarkMode, setIsDarkMode] = useState(true);

return (
<div className="flex flex-col justify-center items-center w-[10.73vw] h-[18vh] bg-gray800-50 border-[0.09vh] border-white-5 rounded-[1.04vw] text-gray400">
<div className="flex flex-col items-center mb-[0.7vh]">
<div className="w-[4.17vh] h-[4.17vh] mb-[0.3vh] bg-gray200 rounded-[50%]"></div>
<div className="font-bold text-[2vh]">μ‚¬μš©μž</div>
</div>

<div
onClick={() => setIsDarkMode(!isDarkMode)}
className="relative flex items-center w-[5vw] h-[2.96vh] mb-[0.9vh] border-[0.09vh] border-gray400 rounded-[1.04vw] cursor-pointer"
>
<div
className={`
absolute flex justify-center items-center w-[1.77vw] h-[2.41vh] bg-gray400 rounded-[1.04vw]
transition-all duration-300 ease-in-out
${isDarkMode ? 'left-[calc(100%-1.77vw-0.15vw)]' : 'left-[0.15vw]'}
`}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
className="w-[1.4vh] h-[1.4vh] text-gray-800"
>
<path fillRule="evenodd" d="M9.528 1.718a.75.75 0 0 1 .162.819A8.97 8.97 0 0 0 9 6a9 9 0 0 0 9 9 8.97 8.97 0 0 0 3.463-.69.75.75 0 0 1 .981.98 10.503 10.503 0 0 1-9.694 6.46c-5.799 0-10.5-4.701-10.5-10.5 0-4.368 2.667-8.112 6.46-9.694a.75.75 0 0 1 .818.162Z" clipRule="evenodd" />
</svg>
</div>
</div>

<div className="flex gap-[0.47vw] text-[1.4vh]">
<div className="cursor-pointer hover:text-white transition-colors">계정관리</div>
<p>|</p>
<div className="cursor-pointer hover:text-white transition-colors">λ‘œκ·Έμ•„μ›ƒ</div>
</div>
</div>
);
}

export default UserModal;
Loading