From a6fa51adb40ca2c71d62185ed5a4d8aed7b86280 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Sun, 5 Jul 2026 14:34:53 +0900 Subject: [PATCH 01/26] =?UTF-8?q?feat(#4):=20Dashboard=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EC=B4=88=EA=B8=B0=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B8=B0=EB=B3=B8=20=EB=9D=BC=EC=9A=B0=ED=84=B0=20?= =?UTF-8?q?=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.jsx | 4 +++- src/pages/.gitkeep | 0 src/pages/Dashboard.jsx | 7 +++++++ 3 files changed, 10 insertions(+), 1 deletion(-) delete mode 100644 src/pages/.gitkeep create mode 100644 src/pages/Dashboard.jsx diff --git a/src/App.jsx b/src/App.jsx index 97b394d..8b25262 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,10 +1,12 @@ import { BrowserRouter, Routes, Route } from 'react-router-dom'; +import Dashboard from './pages/Dashboard.jsx'; + function App() { return ( - + } /> ); diff --git a/src/pages/.gitkeep b/src/pages/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/pages/Dashboard.jsx b/src/pages/Dashboard.jsx new file mode 100644 index 0000000..a1c83da --- /dev/null +++ b/src/pages/Dashboard.jsx @@ -0,0 +1,7 @@ +function Dashboard() { + return ( + <> + ) +} + +export default Dashboard \ No newline at end of file From 163117c8234bc0bd5e30ffbf00a70c5c67189667 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Sun, 5 Jul 2026 15:54:22 +0900 Subject: [PATCH 02/26] =?UTF-8?q?feat((#4):=20Layout=20=EB=B0=B0=EC=B9=98?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20flex=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.css b/src/index.css index 534a63a..076e2e9 100644 --- a/src/index.css +++ b/src/index.css @@ -65,7 +65,7 @@ @layer base { html, body { - @apply bg-background text-gray400; + @apply flex w-screen h-screen bg-background text-gray400; } } From c9cf989ffa1a7d11fd70bc370e77970557dc8a86 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Sun, 5 Jul 2026 16:02:07 +0900 Subject: [PATCH 03/26] =?UTF-8?q?style:=20=ED=8C=A8=EB=84=90=20=EB=91=A5?= =?UTF-8?q?=EA=B8=80=EA=B8=B0=20=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.css b/src/index.css index 076e2e9..170900f 100644 --- a/src/index.css +++ b/src/index.css @@ -71,7 +71,7 @@ @layer components { .panel-base { - @apply flex flex-col items-center bg-white-3 border border-white-5 rounded-[5vh]; + @apply flex flex-col items-center bg-white-3 border border-white-5 rounded-[1.04vw]; } .panel-title { @apply text-[2.5vh] font-bold text-white; From ba3f5e1f35c6e1f3f61887101caaefe05b3aa6f2 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Sun, 5 Jul 2026 18:42:14 +0900 Subject: [PATCH 04/26] =?UTF-8?q?feat(#4):=20SideNav=20UI=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.jsx | 8 +++--- src/assets/.gitkeep | 0 src/assets/SettingIcon.png | Bin 0 -> 1695 bytes src/components/.gitkeep | 0 src/components/SideNav.jsx | 51 +++++++++++++++++++++++++++++++++++++ src/index.css | 7 +++++ src/layouts/MainLayout.jsx | 10 ++++++++ 7 files changed, 73 insertions(+), 3 deletions(-) delete mode 100644 src/assets/.gitkeep create mode 100644 src/assets/SettingIcon.png delete mode 100644 src/components/.gitkeep create mode 100644 src/components/SideNav.jsx create mode 100644 src/layouts/MainLayout.jsx diff --git a/src/App.jsx b/src/App.jsx index 8b25262..0c268f5 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,12 +1,14 @@ import { BrowserRouter, Routes, Route } from 'react-router-dom'; - -import Dashboard from './pages/Dashboard.jsx'; +import MainLayout from './layouts/MainLayout'; +import Dashboard from './pages/Dashboard'; function App() { return ( - } /> + }> + } /> + ); diff --git a/src/assets/.gitkeep b/src/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/assets/SettingIcon.png b/src/assets/SettingIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..e4e1a896c39ab8d273759d6571cde5a7472e2c96 GIT binary patch literal 1695 zcmV;Q24MM#P)VXA^_yLtUERHp?sXd{@94TULuNCwX3ZL>LLs%}E2Q5U zO~XWvKrjh<=q#XMwlobV5%ODV6Vq!8HuMkG_4WPP&}SG_4Gfv@&5z;Xkkj1Op$iG+ zw4f+TLd@R>6s)OlU1qb{T-1jA{CroweD%(pEb)5Zgw|$D#l>Ldkki{^)Wk(ag}|K7 z(+X;C=stEiT}>Mc<-v4Kfv}H?6`SvL^{{*TOl?$7MPp+a%%=o<^rn(>Wj$GbMwMRU zTiL*%d4HaK6&I5Ji{JEtY>`@Xn{~g((9qP>#8jTWV3-_njP~^Pw}5dlk|a^zj$F;= z;sTODT81ruUCEP60`4-<^fKF2AWLp(zd2{XJnlwNw61u4E_%P)AlB)6Q?TCNfnBD- z2d89Nl8%CPQgmxk-qTG$H*ov)+nvqo8=kgnx7?bJyA5<4fNd>OEG#O>LGyAY+d$qw zY-vX@BxKQ?V*^mr8xTKN%@crPtft=3Ds~bp!LB2^>`*QmSpKd8qp!U&Wj`gv<5R08N z`yX!vx~8`!sh>yi!+!)v=e(+w@Xge!Ztt*x*k>dY!&emKNOg3*5aaXt?pZUYlR)rV zWzB`D-PNSNuKul}Rtrf~FA*>M3Y<5>OJ*^cct46FH@O_{C)v_;G*6asmC6NisY=DY z)T({D7~_!b!2E<*BNogG`i2w4-f^@R5nYZEK zhHf1$NPO+RgTGWNA@*4=5f*_!p?^D8S zcerDDVbj)8@t4I*QpD9U(UGq7RKatfldzXo5EKo1<35kalM7;K$4aW&j+Rsr$4XBV z;GQ2TRT2k}pXz}1wb>Gx-q?@BoX*nZhWwoK)Fy5yXGJ(KL>M1Gr})+R zbBkt2&U|$mhn+;_1ha5Uvs!DVV$_&caQ)iVs?79cO|x3#Jbvy-yc4##gCLKyI43LIV*xU_5DH>f-$WiD9($E z6-Gt#g_&t7qX}_Qci2o;|Kmrt=U!h!COp(9vh(#NOhbk!c_M0d#QO_hnWq3_(AnPr p00960iUHr300006Nkl +
+
CoFix
+ +
+ {menuItems.map((item) => { + const isActive = activeItem === item; + + return ( + + ); + })} +
+ +
+ +
+
+
+
μ‚¬μš©μž
+
+ + +
+ + ); +} + +export default SideNav; \ No newline at end of file diff --git a/src/index.css b/src/index.css index 170900f..2fad379 100644 --- a/src/index.css +++ b/src/index.css @@ -2,9 +2,16 @@ @theme { --color-background: #0F1115; + --color-gray800-50: rgba(31 41 55 / 50%); --color-gray400: #9CA3AF; + --color-white-5: rgb(255 255 255 / 5%); --color-white-3: rgb(255 255 255 / 3%); + + --color-purple500-20: rgb(143 57 248 / 20%); + --color-purple500-10: rgb(143 57 248 / 10%); + --color-purple400: rgba(158 134 245); + --font-sans: "Pretendard", sans-serif; } diff --git a/src/layouts/MainLayout.jsx b/src/layouts/MainLayout.jsx new file mode 100644 index 0000000..d95cc66 --- /dev/null +++ b/src/layouts/MainLayout.jsx @@ -0,0 +1,10 @@ +import { Outlet } from 'react-router-dom'; +import SideNav from '../components/SideNav'; + +export default function MainLayout() { + return ( +
+ +
+ ); +} \ No newline at end of file From 162542c88a0431050e939dedda167500f04b6581 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Sun, 5 Jul 2026 19:30:23 +0900 Subject: [PATCH 05/26] =?UTF-8?q?feat(#4):=20=EC=83=89=EC=83=81=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.css | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/index.css b/src/index.css index 2fad379..fe88b02 100644 --- a/src/index.css +++ b/src/index.css @@ -2,7 +2,7 @@ @theme { --color-background: #0F1115; - --color-gray800-50: rgba(31 41 55 / 50%); + --color-gray800-50: rgb(31 41 55 / 50%); --color-gray400: #9CA3AF; --color-white-5: rgb(255 255 255 / 5%); @@ -10,7 +10,15 @@ --color-purple500-20: rgb(143 57 248 / 20%); --color-purple500-10: rgb(143 57 248 / 10%); - --color-purple400: rgba(158 134 245); + --color-purple400: rgb(158 134 245); + + --color-green500-20: rgb(34 197 94 / 20%); + --color-green500-10: rgb(34 197 94 / 10%); + --color-green400: rgb(74 222 128); + + --color-red500-20: rgb(239 68 68 / 20%); + --color-red500-10: rgb(239 68 68 / 10%); + --color-red400: rgb(248 113 113); --font-sans: "Pretendard", sans-serif; } From 335fa6d7c6ff018a8f6e6ece2a8da2e9a48eee29 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Sun, 5 Jul 2026 19:31:31 +0900 Subject: [PATCH 06/26] =?UTF-8?q?feat(#4):=20IDE=20=EC=83=81=ED=83=9C=20UI?= =?UTF-8?q?=20=EC=A0=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/IdeStatus.jsx | 19 +++++++++++++++++++ src/layouts/MainLayout.jsx | 11 ++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/components/IdeStatus.jsx diff --git a/src/components/IdeStatus.jsx b/src/components/IdeStatus.jsx new file mode 100644 index 0000000..b38a647 --- /dev/null +++ b/src/components/IdeStatus.jsx @@ -0,0 +1,19 @@ +function IdeStatus({ isConnected = false }) { + return ( +
+
+ {isConnected ? '🟒 IDE 연동 쀑' : 'πŸ”΄ IDE 연동 μ „'} +
+
+ ); +} + +export default IdeStatus; \ No newline at end of file diff --git a/src/layouts/MainLayout.jsx b/src/layouts/MainLayout.jsx index d95cc66..01f01f0 100644 --- a/src/layouts/MainLayout.jsx +++ b/src/layouts/MainLayout.jsx @@ -1,10 +1,19 @@ import { Outlet } from 'react-router-dom'; import SideNav from '../components/SideNav'; +import IdeStatus from '../components/IdeStatus'; export default function MainLayout() { return ( -
+
+ +
+ + +
+ +
+
); } \ No newline at end of file From 57bdb90ac6d39bf97e76765b335d70e8d08e20ff Mon Sep 17 00:00:00 2001 From: Radian06 Date: Sun, 5 Jul 2026 19:34:28 +0900 Subject: [PATCH 07/26] =?UTF-8?q?feat(#4):=20IDE=20=EC=83=81=ED=83=9C=20UI?= =?UTF-8?q?=20=EB=B8=94=EB=A1=9D=20=EC=A7=80=EC=A0=95=20=EB=B0=A9=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/IdeStatus.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/IdeStatus.jsx b/src/components/IdeStatus.jsx index b38a647..daf9d2f 100644 --- a/src/components/IdeStatus.jsx +++ b/src/components/IdeStatus.jsx @@ -1,6 +1,6 @@ function IdeStatus({ isConnected = false }) { return ( -
+
Date: Sun, 5 Jul 2026 20:50:28 +0900 Subject: [PATCH 08/26] =?UTF-8?q?style(#4):=20=ED=8C=A8=EB=84=90=20?= =?UTF-8?q?=ED=98=B8=EB=B2=84=20=EC=84=A4=EC=A0=95=20=EB=B0=8F=20=ED=85=8C?= =?UTF-8?q?=EB=91=90=EB=A6=AC=20=EA=B5=B5=EA=B8=B0=20=EA=B3=A0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/IdeStatus.jsx | 4 ++-- src/components/SideNav.jsx | 6 +++--- src/index.css | 5 ++++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/IdeStatus.jsx b/src/components/IdeStatus.jsx index daf9d2f..f219b64 100644 --- a/src/components/IdeStatus.jsx +++ b/src/components/IdeStatus.jsx @@ -5,8 +5,8 @@ function IdeStatus({ isConnected = false }) { 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-green500-20 text-green400' - : 'bg-red500-10 border-red500-20 text-red400' + ? 'bg-green500-10 border-[0.09vh] border-green500-20 text-green400' + : 'bg-red500-10 border-[0.09vh] border-red500-20 text-red400' } `} > diff --git a/src/components/SideNav.jsx b/src/components/SideNav.jsx index faa084a..8b19231 100644 --- a/src/components/SideNav.jsx +++ b/src/components/SideNav.jsx @@ -7,7 +7,7 @@ function SideNav() { const [activeItem, setActiveItem] = useState('DASHBOARD'); return ( -
+
CoFix
@@ -23,8 +23,8 @@ function SideNav() { 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 border-purple500-20 text-purple400 font-bold' - : 'text-gray400 border border-transparent hover:bg-white-5' + ? 'bg-purple500-10 border-[0.09vh] border-purple500-20 text-purple400 font-bold' + : 'text-gray400 border-[0.09vh] border-transparent hover:bg-white-5' } `} > diff --git a/src/index.css b/src/index.css index fe88b02..0b72e67 100644 --- a/src/index.css +++ b/src/index.css @@ -86,7 +86,10 @@ @layer components { .panel-base { - @apply flex flex-col items-center bg-white-3 border border-white-5 rounded-[1.04vw]; + @apply flex flex-col items-center bg-white-3 border-[0.09vh] border-white-5 rounded-[1.04vw]; + } + .panel-base:not(.no-hover):hover { + border-color: var(--color-purple400); } .panel-title { @apply text-[2.5vh] font-bold text-white; From c22c5dc8b3bf77c16f3c160df96925c8443dffa4 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Sun, 5 Jul 2026 21:39:11 +0900 Subject: [PATCH 09/26] =?UTF-8?q?feat(#4):=20Dashboard=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EA=B4=80=EB=A0=A8=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=BD=94=EB=93=9C=20=EC=9A=94?= =?UTF-8?q?=EC=95=BD=20=EC=BB=B4=ED=8F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/dashboard/CodeComparison.jsx | 9 ++++++ src/components/dashboard/CodingSummary.jsx | 31 +++++++++++++++++++ src/components/dashboard/CustomQuiz.jsx | 9 ++++++ .../dashboard/VulnerabilityTop2.jsx | 9 ++++++ src/pages/Dashboard.jsx | 16 ++++++++-- 5 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 src/components/dashboard/CodeComparison.jsx create mode 100644 src/components/dashboard/CodingSummary.jsx create mode 100644 src/components/dashboard/CustomQuiz.jsx create mode 100644 src/components/dashboard/VulnerabilityTop2.jsx diff --git a/src/components/dashboard/CodeComparison.jsx b/src/components/dashboard/CodeComparison.jsx new file mode 100644 index 0000000..cc4796c --- /dev/null +++ b/src/components/dashboard/CodeComparison.jsx @@ -0,0 +1,9 @@ +function CodeComparison() { + return ( +
+
λ‚΄ μ½”λ“œ vs AI 클린 μ½”λ“œ
+
+ ); +} + +export default CodeComparison; \ No newline at end of file diff --git a/src/components/dashboard/CodingSummary.jsx b/src/components/dashboard/CodingSummary.jsx new file mode 100644 index 0000000..ee22ef2 --- /dev/null +++ b/src/components/dashboard/CodingSummary.jsx @@ -0,0 +1,31 @@ +function CodingSummary() { + return ( +
+
μ‹€μ‹œκ°„ μ½”λ”© μš”μ•½
+ +
+
ν˜„μž¬ 파일 μœ„μΉ˜
+
C:\Users\μ‚¬μš©μž\폴더λͺ…\λ‹€λ₯Έν΄λ”λͺ…\파일λͺ…?
+
+ +
+
+
λˆ„μ  μ½”λ”© μ‹œκ°„
+
2h 15m
+
+
|
+
+
ν˜„μž¬ 타이핑
+
65 WPM
+
+
|
+
+
κ°μ§€λœ 약점
+
2건
+
+
+
+ ); +} + +export default CodingSummary; \ No newline at end of file diff --git a/src/components/dashboard/CustomQuiz.jsx b/src/components/dashboard/CustomQuiz.jsx new file mode 100644 index 0000000..6c01cf6 --- /dev/null +++ b/src/components/dashboard/CustomQuiz.jsx @@ -0,0 +1,9 @@ +function CustomQuiz() { + return ( +
+
μ‹€μ‹œκ°„ 맞좀 ν€΄μ¦ˆ
+
+ ); +} + +export default CustomQuiz; \ No newline at end of file diff --git a/src/components/dashboard/VulnerabilityTop2.jsx b/src/components/dashboard/VulnerabilityTop2.jsx new file mode 100644 index 0000000..7bc5825 --- /dev/null +++ b/src/components/dashboard/VulnerabilityTop2.jsx @@ -0,0 +1,9 @@ +function VulnerabilityTop2() { + return ( +
+
AI 감지 ν˜„μž¬ 취약점 TOP 2
+
+ ); +} + +export default VulnerabilityTop2; \ No newline at end of file diff --git a/src/pages/Dashboard.jsx b/src/pages/Dashboard.jsx index a1c83da..77b8d82 100644 --- a/src/pages/Dashboard.jsx +++ b/src/pages/Dashboard.jsx @@ -1,7 +1,19 @@ +import CodingSummary from '../components/dashboard/CodingSummary'; +import CodeComparison from '../components/dashboard/CodeComparison'; +import VulnerabilityTop2 from '../components/dashboard/VulnerabilityTop2'; +import CustomQuiz from '../components/dashboard/CustomQuiz'; + function Dashboard() { return ( - <> +
+ + +
+ + +
+
) } -export default Dashboard \ No newline at end of file +export default Dashboard; \ No newline at end of file From 9608a6ecaf76646f545e8e69bbab150ee2c59f52 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Sun, 5 Jul 2026 23:00:48 +0900 Subject: [PATCH 10/26] =?UTF-8?q?feat(#4):=20=EC=BD=94=EB=94=A9=20?= =?UTF-8?q?=EC=9A=94=EC=95=BD=20=EC=BB=B4=ED=8F=AC=20=EC=97=AC=EB=B0=B1=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/dashboard/CodingSummary.jsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/dashboard/CodingSummary.jsx b/src/components/dashboard/CodingSummary.jsx index ee22ef2..56a64f2 100644 --- a/src/components/dashboard/CodingSummary.jsx +++ b/src/components/dashboard/CodingSummary.jsx @@ -1,25 +1,25 @@ function CodingSummary() { return ( -
+
μ‹€μ‹œκ°„ μ½”λ”© μš”μ•½
-
+
ν˜„μž¬ 파일 μœ„μΉ˜
C:\Users\μ‚¬μš©μž\폴더λͺ…\λ‹€λ₯Έν΄λ”λͺ…\파일λͺ…?
-
-
+
+
λˆ„μ  μ½”λ”© μ‹œκ°„
2h 15m
|
-
+
ν˜„μž¬ 타이핑
65 WPM
|
-
+
κ°μ§€λœ 약점
2건
From cdf1069124c3f82e4f18cd8393205dbe560eecf2 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 11:20:59 +0900 Subject: [PATCH 11/26] =?UTF-8?q?chore:=20=EA=B0=9C=EB=B0=9C=20=ED=99=98?= =?UTF-8?q?=EA=B2=BD=20=EC=9D=B4=EB=8F=99=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?=EC=9D=98=EC=A1=B4=EC=84=B1=20=ED=8C=A8=ED=82=A4=EC=A7=80=20?= =?UTF-8?q?=EC=84=A4=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 72 +++++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 73 insertions(+) diff --git a/package-lock.json b/package-lock.json index 1ef5624..89f98ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "cofix-front", "version": "0.0.0", "dependencies": { + "@monaco-editor/react": "^4.7.0", "@tailwindcss/postcss": "^4.3.2", "react": "^19.2.7", "react-dom": "^19.2.7", @@ -552,6 +553,29 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@monaco-editor/loader": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.7.0.tgz", + "integrity": "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA==", + "license": "MIT", + "dependencies": { + "state-local": "^1.0.6" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "license": "MIT", + "dependencies": { + "@monaco-editor/loader": "^1.5.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@napi-rs/wasm-runtime": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", @@ -1507,6 +1531,14 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/@vitejs/plugin-react": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.3.tgz", @@ -1790,6 +1822,16 @@ "node": ">=8" } }, + "node_modules/dompurify": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.7.tgz", + "integrity": "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw==", + "license": "(MPL-2.0 OR Apache-2.0)", + "peer": true, + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.381", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.381.tgz", @@ -2640,6 +2682,19 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "license": "MIT", + "peer": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -2683,6 +2738,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/monaco-editor": { + "version": "0.55.1", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.55.1.tgz", + "integrity": "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A==", + "license": "MIT", + "peer": true, + "dependencies": { + "dompurify": "3.2.7", + "marked": "14.0.0" + } + }, "node_modules/mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", @@ -3033,6 +3099,12 @@ "node": ">=0.10.0" } }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "license": "MIT" + }, "node_modules/tailwindcss": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", diff --git a/package.json b/package.json index d23f058..e601ca3 100644 --- a/package.json +++ b/package.json @@ -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", From 52bf514c463fd0a3510a5e9fefeea22a87832f0b Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 11:21:35 +0900 Subject: [PATCH 12/26] =?UTF-8?q?refactor(#4):=20AiCorrectionPanel=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard/{CodeComparison.jsx => AiCorrectionPanel.jsx} | 4 ++-- src/pages/Dashboard.jsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/components/dashboard/{CodeComparison.jsx => AiCorrectionPanel.jsx} (74%) diff --git a/src/components/dashboard/CodeComparison.jsx b/src/components/dashboard/AiCorrectionPanel.jsx similarity index 74% rename from src/components/dashboard/CodeComparison.jsx rename to src/components/dashboard/AiCorrectionPanel.jsx index cc4796c..685c92e 100644 --- a/src/components/dashboard/CodeComparison.jsx +++ b/src/components/dashboard/AiCorrectionPanel.jsx @@ -1,4 +1,4 @@ -function CodeComparison() { +function AiCorrectionPanel() { return (
λ‚΄ μ½”λ“œ vs AI 클린 μ½”λ“œ
@@ -6,4 +6,4 @@ function CodeComparison() { ); } -export default CodeComparison; \ No newline at end of file +export default AiCorrectionPanel; \ No newline at end of file diff --git a/src/pages/Dashboard.jsx b/src/pages/Dashboard.jsx index 77b8d82..003b31b 100644 --- a/src/pages/Dashboard.jsx +++ b/src/pages/Dashboard.jsx @@ -1,5 +1,5 @@ import CodingSummary from '../components/dashboard/CodingSummary'; -import CodeComparison from '../components/dashboard/CodeComparison'; +import CodeComparison from '../components/dashboard/AiCorrectionPanel'; import VulnerabilityTop2 from '../components/dashboard/VulnerabilityTop2'; import CustomQuiz from '../components/dashboard/CustomQuiz'; From 424ce20483d1e46ad8e31887399f74ed58df8a4d Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 14:06:32 +0900 Subject: [PATCH 13/26] =?UTF-8?q?feat(#4):=20=EC=83=89=EC=83=81=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/index.css b/src/index.css index 0b72e67..c03f95f 100644 --- a/src/index.css +++ b/src/index.css @@ -2,6 +2,7 @@ @theme { --color-background: #0F1115; + --color-gray900: rgb(31 31 31); --color-gray800-50: rgb(31 41 55 / 50%); --color-gray400: #9CA3AF; @@ -12,10 +13,12 @@ --color-purple500-10: rgb(143 57 248 / 10%); --color-purple400: rgb(158 134 245); + --color-green500-30: rgb(34 197 94 / 30%); --color-green500-20: rgb(34 197 94 / 20%); --color-green500-10: rgb(34 197 94 / 10%); --color-green400: rgb(74 222 128); + --color-red500-30: rgb(239 68 68 / 30%); --color-red500-20: rgb(239 68 68 / 20%); --color-red500-10: rgb(239 68 68 / 10%); --color-red400: rgb(248 113 113); From 60bea94f5fcc34494bb26a9098a308e3b2cedbc8 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 14:07:40 +0900 Subject: [PATCH 14/26] =?UTF-8?q?feat(#4):=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=B9=84=EA=B5=90=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dashboard/AiCorrectionPanel.jsx | 88 ++++++++++++++++++- 1 file changed, 84 insertions(+), 4 deletions(-) diff --git a/src/components/dashboard/AiCorrectionPanel.jsx b/src/components/dashboard/AiCorrectionPanel.jsx index 685c92e..41261ae 100644 --- a/src/components/dashboard/AiCorrectionPanel.jsx +++ b/src/components/dashboard/AiCorrectionPanel.jsx @@ -1,9 +1,89 @@ -function AiCorrectionPanel() { +import React from 'react'; +import { DiffEditor } from '@monaco-editor/react'; + +// ------------ μž„μ‹œ ------------ +const myCode = `import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; + +export const useLogin = () => { + const navigate = useNavigate(); + + const [email, setEmail] = useState(''); + const [password, setPassword] = useState(''); + const [emailError, setEmailError] = useState(''); + const [passwordError, setPasswordError] = useState(''); + const [errorMessage, setErrorMessage] = useState(''); +};`; + +const aiCleanCode = `import { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; + +export const useLogin = () => { + const navigate = useNavigate(); + + // AI κ°€ μ œμ•ˆν•˜λŠ” μ΅œμ ν™”: μƒνƒœ 병합 + const [credentials, setCredentials] = useState({ + email: '', + password: '', + }); + + const [errors, setErrors] = useState({ + email: '', + password: '', + global: '', + }); + +};`; +// ------------------------------ + +// 에디터 곡톡 μ˜΅μ…˜ +const editorOptions = { + readOnly: true, + minimap: { enabled: false }, + scrollBeyondLastLine: false, + fontSize: 14, + lineHeight: 22, + renderOverviewRuler: false, + overviewRulerBorder: false, + stickyScroll: { enabled: false }, + scrollbar: { useShadows: false } +}; + +function AiCodeDiffViewer() { + const handleEditorMount = (editor) => { + editor.getOriginalEditor().updateOptions({ + scrollbar: { + vertical: 'hidden', + horizontal: 'hidden' + } + }); + }; + return ( -
-
λ‚΄ μ½”λ“œ vs AI 클린 μ½”λ“œ
+
+
λ‚΄ μ½”λ“œ vs AI 클린 μ½”λ“œ
+ +
+
+ +
+
+
); } -export default AiCorrectionPanel; \ No newline at end of file +export default AiCodeDiffViewer; \ No newline at end of file From 71e91bac1d3d75f033285877f3de1f410472811e Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 14:17:38 +0900 Subject: [PATCH 15/26] =?UTF-8?q?style(#4):=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=ED=8F=B0=ED=8A=B8=20=EC=82=AC=EC=9D=B4=EC=A6=88=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/dashboard/AiCorrectionPanel.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/AiCorrectionPanel.jsx b/src/components/dashboard/AiCorrectionPanel.jsx index 41261ae..fa52388 100644 --- a/src/components/dashboard/AiCorrectionPanel.jsx +++ b/src/components/dashboard/AiCorrectionPanel.jsx @@ -41,8 +41,8 @@ const editorOptions = { readOnly: true, minimap: { enabled: false }, scrollBeyondLastLine: false, - fontSize: 14, - lineHeight: 22, + fontSize: 12, + lineHeight: "1.5vh", renderOverviewRuler: false, overviewRulerBorder: false, stickyScroll: { enabled: false }, From d52245841b52a04d81b9e912325878b7f9481c4a Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 14:35:43 +0900 Subject: [PATCH 16/26] =?UTF-8?q?feat(#4):=20=EC=83=89=EC=83=81=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/index.css b/src/index.css index c03f95f..ce411ce 100644 --- a/src/index.css +++ b/src/index.css @@ -23,6 +23,8 @@ --color-red500-10: rgb(239 68 68 / 10%); --color-red400: rgb(248 113 113); + --color-yellow400: rgb(250 204 21); + --font-sans: "Pretendard", sans-serif; } From bdcd5cbdd5dd3ee30217c05e05fa71d325512375 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 14:36:18 +0900 Subject: [PATCH 17/26] =?UTF-8?q?feat(#4):=20=EC=B7=A8=EC=95=BD=EC=A0=90TO?= =?UTF-8?q?P2=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/dashboard/VulnerabilityTop2.jsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/dashboard/VulnerabilityTop2.jsx b/src/components/dashboard/VulnerabilityTop2.jsx index 7bc5825..580a185 100644 --- a/src/components/dashboard/VulnerabilityTop2.jsx +++ b/src/components/dashboard/VulnerabilityTop2.jsx @@ -1,7 +1,15 @@ function VulnerabilityTop2() { return ( -
+
AI 감지 ν˜„μž¬ 취약점 TOP 2
+
+
1μœ„
+
쀑첩 반볡문으둜 μΈν•œ μ„±λŠ₯ μ €ν•˜
+
+
+
2μœ„
+
λ³€μˆ˜λͺ… μ»¨λ²€μ…˜ 뢈일치
+
); } From 1b706d8777df29b3b5c4b95b7c8f07e252cca642 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 14:43:39 +0900 Subject: [PATCH 18/26] =?UTF-8?q?chore(#4):=20CustomQuiz=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/dashboard/{ => CustomQuiz}/CustomQuiz.jsx | 0 src/pages/Dashboard.jsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename src/components/dashboard/{ => CustomQuiz}/CustomQuiz.jsx (100%) diff --git a/src/components/dashboard/CustomQuiz.jsx b/src/components/dashboard/CustomQuiz/CustomQuiz.jsx similarity index 100% rename from src/components/dashboard/CustomQuiz.jsx rename to src/components/dashboard/CustomQuiz/CustomQuiz.jsx diff --git a/src/pages/Dashboard.jsx b/src/pages/Dashboard.jsx index 003b31b..371542e 100644 --- a/src/pages/Dashboard.jsx +++ b/src/pages/Dashboard.jsx @@ -1,7 +1,7 @@ import CodingSummary from '../components/dashboard/CodingSummary'; import CodeComparison from '../components/dashboard/AiCorrectionPanel'; import VulnerabilityTop2 from '../components/dashboard/VulnerabilityTop2'; -import CustomQuiz from '../components/dashboard/CustomQuiz'; +import CustomQuiz from '../components/dashboard/CustomQuiz/CustomQuiz'; function Dashboard() { return ( From b15b750a5d3b8b4b57138b1290367ce569eea41e Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 15:52:10 +0900 Subject: [PATCH 19/26] =?UTF-8?q?feat(#4):=20=EC=83=89=EC=83=81=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.css | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/index.css b/src/index.css index ce411ce..c149e71 100644 --- a/src/index.css +++ b/src/index.css @@ -4,11 +4,14 @@ --color-background: #0F1115; --color-gray900: rgb(31 31 31); --color-gray800-50: rgb(31 41 55 / 50%); - --color-gray400: #9CA3AF; + --color-gray700: rgb(55 65 81); + --color-gray400: rgb(156 163 175); + --color-gray200: rgb(229 231 235); --color-white-5: rgb(255 255 255 / 5%); --color-white-3: rgb(255 255 255 / 3%); + --color-purple500: rgb(143 57 248); --color-purple500-20: rgb(143 57 248 / 20%); --color-purple500-10: rgb(143 57 248 / 10%); --color-purple400: rgb(158 134 245); From fb163057d0571f407c2b0016440da0afdf5e5cdb Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 15:52:52 +0900 Subject: [PATCH 20/26] =?UTF-8?q?feat(#4):=20=EC=8B=A4=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=20=EB=A7=9E=EC=B6=A4=20=ED=80=B4=EC=A6=88=20=ED=8C=A8=EB=84=90?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/dashboard/CustomQuiz/CustomQuiz.jsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/components/dashboard/CustomQuiz/CustomQuiz.jsx b/src/components/dashboard/CustomQuiz/CustomQuiz.jsx index 6c01cf6..3cb418a 100644 --- a/src/components/dashboard/CustomQuiz/CustomQuiz.jsx +++ b/src/components/dashboard/CustomQuiz/CustomQuiz.jsx @@ -1,7 +1,12 @@ function CustomQuiz() { return ( -
+
μ‹€μ‹œκ°„ 맞좀 ν€΄μ¦ˆ
+
+

κ°μ§€λœ 취약점과 κ΄€λ ¨λœ μ΅œμ ν™” ν€΄μ¦ˆκ°€ μ€€λΉ„λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

+

μ‹€μ‹œκ°„ ν”Όλ“œλ°±μœΌλ‘œ λ³΄μ•ˆ μ—­λŸ‰μ„ κ°•ν™”ν•˜μ„Έμš”.

+
+
ν€΄μ¦ˆ ν’€κΈ°
); } From d295503509d3448ec71084dcf84ba11674df5279 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 15:55:41 +0900 Subject: [PATCH 21/26] =?UTF-8?q?chore:=20=EC=8B=A4=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=EB=A7=9E=EC=B6=A4=20=ED=80=B4=EC=A6=88=20=EB=AA=A8=EB=8B=AC=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=ED=8C=8C=EC=9D=BC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/dashboard/CustomQuiz/CustomQuizLogic.js | 0 src/components/dashboard/CustomQuiz/CustomQuizModal.jsx | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/components/dashboard/CustomQuiz/CustomQuizLogic.js create mode 100644 src/components/dashboard/CustomQuiz/CustomQuizModal.jsx diff --git a/src/components/dashboard/CustomQuiz/CustomQuizLogic.js b/src/components/dashboard/CustomQuiz/CustomQuizLogic.js new file mode 100644 index 0000000..e69de29 diff --git a/src/components/dashboard/CustomQuiz/CustomQuizModal.jsx b/src/components/dashboard/CustomQuiz/CustomQuizModal.jsx new file mode 100644 index 0000000..e69de29 From 2125e34e758fbf08ff7364069c1dddf829f455a0 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 16:06:48 +0900 Subject: [PATCH 22/26] =?UTF-8?q?feat(#4):=20IDE=20=EB=AF=B8=EC=97=B0?= =?UTF-8?q?=EA=B2=B0=20=EC=83=81=ED=83=9C=EC=9D=98=20Outlet=20=EC=A0=9C?= =?UTF-8?q?=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/IdeDisconnected.jsx | 14 ++++++++++++++ src/layouts/MainLayout.jsx | 8 ++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 src/components/IdeDisconnected.jsx diff --git a/src/components/IdeDisconnected.jsx b/src/components/IdeDisconnected.jsx new file mode 100644 index 0000000..b6b2261 --- /dev/null +++ b/src/components/IdeDisconnected.jsx @@ -0,0 +1,14 @@ +function IdeDisconnected() { + return ( +
+
+
+ IDE에 μ—°κ²° λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. +
+
연결을 확인해 μ£Όμ„Έμš”.
+
+
+ ); +} + +export default IdeDisconnected; diff --git a/src/layouts/MainLayout.jsx b/src/layouts/MainLayout.jsx index 01f01f0..3cdab14 100644 --- a/src/layouts/MainLayout.jsx +++ b/src/layouts/MainLayout.jsx @@ -1,17 +1,21 @@ import { Outlet } from 'react-router-dom'; +import { useState } from 'react'; import SideNav from '../components/SideNav'; import IdeStatus from '../components/IdeStatus'; +import IdeDisconnected from '../components/IdeDisconnected'; export default function MainLayout() { + const [isConnected, setIsConnected] = useState(false); + return (
- +
- + {isConnected ? : }
From 1a14b34ee26756f73996a9baaca76811cdc04b01 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 16:19:11 +0900 Subject: [PATCH 23/26] =?UTF-8?q?feat(#4):=20SideNav=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=9D=B4=EB=8F=99=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.jsx | 6 ++++++ src/components/SideNav.jsx | 18 ++++++++++++------ src/layouts/MainLayout.jsx | 2 +- src/pages/AiChat.jsx | 7 +++++++ src/pages/Report.jsx | 7 +++++++ src/pages/ReviewNote.jsx | 7 +++++++ 6 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 src/pages/AiChat.jsx create mode 100644 src/pages/Report.jsx create mode 100644 src/pages/ReviewNote.jsx diff --git a/src/App.jsx b/src/App.jsx index 0c268f5..6dc435d 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,6 +1,9 @@ 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 ( @@ -8,6 +11,9 @@ function App() { }> } /> + } /> + } /> + } /> diff --git a/src/components/SideNav.jsx b/src/components/SideNav.jsx index 8b19231..54878e1 100644 --- a/src/components/SideNav.jsx +++ b/src/components/SideNav.jsx @@ -1,10 +1,16 @@ -import { useState } from 'react'; +import { useLocation, useNavigate } from 'react-router-dom'; import SettingIcon from "../assets/SettingIcon.png"; function SideNav() { - const menuItems = ['DASHBOARD', 'REPORT', 'REVIEW NOTE', 'AI CHAT']; + const menuItems = [ + { name: 'DASHBOARD', path: '/' }, + { name: 'REPORT', path: '/report' }, + { name: 'REVIEW NOTE', path: '/review-note' }, + { name: 'AI CHAT', path: '/ai-chat' } + ]; - const [activeItem, setActiveItem] = useState('DASHBOARD'); + const location = useLocation(); + const navigate = useNavigate(); return (
@@ -13,12 +19,12 @@ function SideNav() {
{menuItems.map((item) => { - const isActive = activeItem === item; + const isActive = location.pathname === item.path; return ( ); })} diff --git a/src/layouts/MainLayout.jsx b/src/layouts/MainLayout.jsx index 3cdab14..76ea935 100644 --- a/src/layouts/MainLayout.jsx +++ b/src/layouts/MainLayout.jsx @@ -5,7 +5,7 @@ import IdeStatus from '../components/IdeStatus'; import IdeDisconnected from '../components/IdeDisconnected'; export default function MainLayout() { - const [isConnected, setIsConnected] = useState(false); + const [isConnected, setIsConnected] = useState(true); return (
diff --git a/src/pages/AiChat.jsx b/src/pages/AiChat.jsx new file mode 100644 index 0000000..de9047b --- /dev/null +++ b/src/pages/AiChat.jsx @@ -0,0 +1,7 @@ +function AiChat() { + return ( + <>Ai Chat + ); +} + +export default AiChat; \ No newline at end of file diff --git a/src/pages/Report.jsx b/src/pages/Report.jsx new file mode 100644 index 0000000..057f3aa --- /dev/null +++ b/src/pages/Report.jsx @@ -0,0 +1,7 @@ +function Report() { + return ( + <>Report + ); +} + +export default Report; \ No newline at end of file diff --git a/src/pages/ReviewNote.jsx b/src/pages/ReviewNote.jsx new file mode 100644 index 0000000..ecada77 --- /dev/null +++ b/src/pages/ReviewNote.jsx @@ -0,0 +1,7 @@ +function ReviewNote() { + return ( + <>Review Note + ); +} + +export default ReviewNote; \ No newline at end of file From 12fe6fe8e4ba9c6aaa4581ded1714cf69a6b5676 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 17:53:16 +0900 Subject: [PATCH 24/26] =?UTF-8?q?feat(#4):=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EB=93=9C=EB=A1=AD=EC=95=84=EC=9B=83=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/{ => SideNav}/SideNav.jsx | 37 +++++++++++++++----- src/components/SideNav/UserModal.jsx | 44 ++++++++++++++++++++++++ src/layouts/MainLayout.jsx | 2 +- 3 files changed, 73 insertions(+), 10 deletions(-) rename src/components/{ => SideNav}/SideNav.jsx (54%) create mode 100644 src/components/SideNav/UserModal.jsx diff --git a/src/components/SideNav.jsx b/src/components/SideNav/SideNav.jsx similarity index 54% rename from src/components/SideNav.jsx rename to src/components/SideNav/SideNav.jsx index 54878e1..470e5c5 100644 --- a/src/components/SideNav.jsx +++ b/src/components/SideNav/SideNav.jsx @@ -1,5 +1,8 @@ +import { useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; -import SettingIcon from "../assets/SettingIcon.png"; +import SettingIcon from "../../assets/SettingIcon.png"; +// UserModal μ»΄ν¬λ„ŒνŠΈ μž„ν¬νŠΈ (κ²½λ‘œλŠ” μ‹€μ œμ— 맞게 μˆ˜μ •ν•΄ μ£Όμ„Έμš”) +import UserModal from "./UserModal"; function SideNav() { const menuItems = [ @@ -11,9 +14,12 @@ function SideNav() { const location = useLocation(); const navigate = useNavigate(); + + // λͺ¨λ‹¬ μ—΄λ¦Ό/λ‹«νž˜ μƒνƒœ 관리 + const [isModalOpen, setIsModalOpen] = useState(false); return ( -
+
CoFix
@@ -23,7 +29,7 @@ function SideNav() { return (
-
-
-
-
-
μ‚¬μš©μž
+
+ {isModalOpen && ( +
+
+ )} + +
setIsModalOpen(!isModalOpen)} + > +
+
μ‚¬μš©μž
+
- + settings setIsModalOpen(!isModalOpen)} + />
); diff --git a/src/components/SideNav/UserModal.jsx b/src/components/SideNav/UserModal.jsx new file mode 100644 index 0000000..bfecd26 --- /dev/null +++ b/src/components/SideNav/UserModal.jsx @@ -0,0 +1,44 @@ +import { useState } from 'react'; + +function UserModal() { + const [isDarkMode, setIsDarkMode] = useState(true); + + return ( +
+
+
+
μ‚¬μš©μž
+
+ +
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" + > +
+ + + +
+
+ +
+
계정관리
+

|

+
λ‘œκ·Έμ•„μ›ƒ
+
+
+ ); +} + +export default UserModal; \ No newline at end of file diff --git a/src/layouts/MainLayout.jsx b/src/layouts/MainLayout.jsx index 76ea935..7cfc8d4 100644 --- a/src/layouts/MainLayout.jsx +++ b/src/layouts/MainLayout.jsx @@ -1,6 +1,6 @@ import { Outlet } from 'react-router-dom'; import { useState } from 'react'; -import SideNav from '../components/SideNav'; +import SideNav from '../components/SideNav/SideNav'; import IdeStatus from '../components/IdeStatus'; import IdeDisconnected from '../components/IdeDisconnected'; From ec8ee2d417ad3580e7212b551e26adec57f7afae Mon Sep 17 00:00:00 2001 From: Radian06 Date: Mon, 6 Jul 2026 18:04:09 +0900 Subject: [PATCH 25/26] =?UTF-8?q?feat(#4):=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EB=93=9C=EB=A1=AD=EC=95=84=EC=9B=83=20=EB=8B=AB=ED=9E=88?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/SideNav/SideNav.jsx | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/components/SideNav/SideNav.jsx b/src/components/SideNav/SideNav.jsx index 470e5c5..cf07646 100644 --- a/src/components/SideNav/SideNav.jsx +++ b/src/components/SideNav/SideNav.jsx @@ -1,7 +1,6 @@ -import { useState } from 'react'; +import { useState, useEffect, useRef } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import SettingIcon from "../../assets/SettingIcon.png"; -// UserModal μ»΄ν¬λ„ŒνŠΈ μž„ν¬νŠΈ (κ²½λ‘œλŠ” μ‹€μ œμ— 맞게 μˆ˜μ •ν•΄ μ£Όμ„Έμš”) import UserModal from "./UserModal"; function SideNav() { @@ -15,8 +14,23 @@ function SideNav() { 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 (
@@ -29,7 +43,7 @@ function SideNav() { return (
-
+
{isModalOpen && (
From ec84b6a4633f7ac26154a608566e596322777428 Mon Sep 17 00:00:00 2001 From: Radian06 Date: Tue, 7 Jul 2026 10:32:36 +0900 Subject: [PATCH 26/26] =?UTF-8?q?feat(#4):=20=EC=82=AC=EC=9A=A9=EC=9E=90?= =?UTF-8?q?=20=EC=9D=B8=EC=A6=9D=20X=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/NotLoggedIn.jsx | 17 +++++++++++++++++ src/layouts/MainLayout.jsx | 12 ++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 src/components/NotLoggedIn.jsx diff --git a/src/components/NotLoggedIn.jsx b/src/components/NotLoggedIn.jsx new file mode 100644 index 0000000..9a16abd --- /dev/null +++ b/src/components/NotLoggedIn.jsx @@ -0,0 +1,17 @@ +function NotLoggedIn() { + return ( +
+
+
+ 둜그인이 λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. +
+
+
둜그인
+
을 μ§„ν–‰ν•΄ μ£Όμ„Έμš”.
+
+
+
+ ); +} + +export default NotLoggedIn; diff --git a/src/layouts/MainLayout.jsx b/src/layouts/MainLayout.jsx index 7cfc8d4..b452872 100644 --- a/src/layouts/MainLayout.jsx +++ b/src/layouts/MainLayout.jsx @@ -2,10 +2,12 @@ import { Outlet } from 'react-router-dom'; import { useState } from 'react'; import SideNav from '../components/SideNav/SideNav'; import IdeStatus from '../components/IdeStatus'; -import IdeDisconnected from '../components/IdeDisconnected'; +import IdeDisconnected from '../components/IdeDisconnected'; +import NotLoggedIn from '../components/NotLoggedIn'; export default function MainLayout() { const [isConnected, setIsConnected] = useState(true); + const [isLoggedIn, setIsLoggedIn] = useState(false); return (
@@ -15,7 +17,13 @@ export default function MainLayout() {
- {isConnected ? : } + {!isConnected ? ( + + ) : !isLoggedIn ? ( + + ) : ( + + )}