1- import { Github , Heart , Linkedin , Mail , Twitter } from "lucide-react" ;
1+ import { Github , Heart , Mail } from "lucide-react" ;
22import { Link } from "react-router" ;
33import { CodeDockWordmark } from "./CodeDockWordmark" ;
44import { CoffeeLogo } from "./CoffeeLogo" ;
55import { useLanguage } from "../contexts/LanguageContext" ;
66import { useTheme } from "../contexts/ThemeContext" ;
77
88const footerLinks = {
9- product : [
10- { ko : "기능" , en : "Features" , path : "/#features" } ,
11- { ko : "대시보드" , en : "Dashboard" , path : "/workspace" } ,
12- { ko : "PR 리뷰" , en : "PR Review" , path : "/prs" } ,
9+ navigation : [
10+ { ko : "팀 대시보드" , en : "Team Dashboard" , path : "/workspace" } ,
11+ { ko : "협업 워크스페이스" , en : "Collaboration Workspace" , path : "/chat" } ,
1312 { ko : "API 명세" , en : "API Spec" , path : "/api-spec" } ,
1413 { ko : "ERD" , en : "ERD" , path : "/erd" } ,
1514 { ko : "문서" , en : "Docs" , path : "/docs" }
1615 ] ,
17- company : [
18- { ko : "소개" , en : "About" , path : "/about" } ,
19- { ko : "소식" , en : "Blog" , path : "/blog" } ,
20- { ko : "채용" , en : "Careers" , path : "/careers" } ,
21- { ko : "문의" , en : "Contact" , path : "/contact" }
22- ] ,
23- resources : [
24- { ko : "문서" , en : "Documentation" , path : "/docs" } ,
25- { ko : "API 참조" , en : "API Reference" , path : "/api-spec" } ,
26- { ko : "튜토리얼" , en : "Tutorials" , path : "/tutorials" } ,
27- { ko : "커뮤니티" , en : "Community" , path : "/community" }
28- ] ,
29- legal : [
30- { ko : "개인정보" , en : "Privacy" , path : "/privacy" } ,
31- { ko : "이용약관" , en : "Terms" , path : "/terms" } ,
32- { ko : "보안" , en : "Security" , path : "/security" } ,
33- { ko : "쿠키" , en : "Cookies" , path : "/cookies" }
16+ account : [
17+ { ko : "프로필" , en : "Profile" , path : "/profile" } ,
18+ { ko : "설정" , en : "Settings" , path : "/settings" }
3419 ]
3520} ;
3621
3722const socialLinks = [
38- { icon : Github , href : "https://github.com" , label : "GitHub" } ,
39- { icon : Twitter , href : "https://twitter.com" , label : "Twitter" } ,
40- { icon : Linkedin , href : "https://linkedin.com" , label : "LinkedIn" } ,
41- { icon : Mail , href : "mailto:contact@coffeeting.dev" , label : "Email" }
23+ { icon : Github , href : "https://github.com/prgrms-aibe-devcourse/AIBE5_FinalProject_Team1_FE" , label : "GitHub" } ,
24+ { icon : Mail , href : "mailto:contact@codedock.dev" , label : "Email" }
4225] ;
4326
4427export function Footer ( ) {
4528 const currentYear = new Date ( ) . getFullYear ( ) ;
4629 const { colors } = useTheme ( ) ;
4730 const { language } = useLanguage ( ) ;
4831 const isKorean = language === "ko" ;
32+ const tone = ( alpha : number ) => `${ colors . primary } , ${ alpha } )` ;
4933 const copy = {
50- product : isKorean ? "제품" : "Product" ,
51- company : isKorean ? "회사" : "Company" ,
52- resources : isKorean ? "자료" : "Resources" ,
53- legal : isKorean ? "정책" : "Legal" ,
34+ navigation : isKorean ? "메뉴" : "Menu" ,
35+ account : isKorean ? "계정" : "Account" ,
5436 description : isKorean
55- ? "AI 기반 개발 협업 플랫폼. 코딩은 개발자가, 리뷰와 문서는 AI가 돕습니다 ."
37+ ? "PR 리뷰, 보안 점검, 문서화를 한 흐름으로 연결하는 AI 개발 워크스페이스입니다 ."
5638 : "An AI development workflow platform for reviews, docs, and team collaboration." ,
57- madeBy : isKorean ? "DevFlow Team 제작" : "by DevFlow Team",
39+ madeBy : "CodeDock Team",
5840 rights : isKorean ? "모든 권리 보유." : "All rights reserved." ,
59- madeWith : isKorean ? "제작" : "Made with"
41+ madeWith : "Made with"
6042 } ;
6143
62- const renderLinks = ( links : typeof footerLinks . product ) => (
63- < ul className = "m-0 grid list-none gap-3 p-0" >
44+ const renderLinks = ( links : typeof footerLinks . navigation ) => (
45+ < ul className = "m-0 grid list-none gap-2 p-0" >
6446 { links . map ( ( link ) => (
6547 < li key = { link . path } >
6648 < Link
6749 to = { link . path }
68- className = "no-underline tracking-tight transition-colors"
50+ className = "no-underline tracking-tight transition-colors hover:text-white "
6951 style = { {
70- fontSize : "14px " ,
71- fontWeight : 700 ,
52+ fontSize : "13px " ,
53+ fontWeight : 750 ,
7254 color : "var(--muted)"
7355 } }
7456 >
@@ -81,43 +63,46 @@ export function Footer() {
8163
8264 return (
8365 < footer
84- className = "relative mt-20 "
66+ className = "relative mt-12 "
8567 style = { {
8668 background : `
87- radial-gradient(circle at 20% 50 %, ${ colors . primary } , 0.08) , transparent 40 %),
88- radial-gradient(circle at 80% 50 %, ${ colors . primary } , 0.06) , transparent 40 %),
89- rgba(5, 11, 20, 0.95 )
69+ radial-gradient(circle at 18% 40 %, ${ tone ( 0.07 ) } , transparent 34 %),
70+ radial-gradient(circle at 84% 54 %, ${ tone ( 0.05 ) } , transparent 36 %),
71+ rgba(5, 11, 20, 0.94 )
9072 ` ,
91- borderTop : `1px solid ${ colors . primary } , 0.15) `
73+ borderTop : `1px solid ${ tone ( 0.14 ) } `
9274 } }
9375 >
94- < div className = "relative mx-auto w-[min(1400px ,calc(100vw-36px ))] px-6 py-16 " >
95- < div className = "mb-12 grid gap-12 md:grid-cols-2 lg:grid-cols-6 " >
96- < div className = "lg:col-span-2" >
76+ < div className = "relative mx-auto w-[min(1180px ,calc(100vw-32px ))] px-4 py-8 sm:px-6 sm: py-10 " >
77+ < div className = "mb-7 grid gap-7 md:grid-cols-[minmax(0,1.5fr)_minmax(150px,0.5fr)_minmax(130px,0.45fr)] " >
78+ < div >
9779 < Link
9880 to = "/"
99- className = "mb-6 flex items-center gap-3 no-underline tracking-[-0.07em]"
81+ className = "mb-3 flex items-center gap-3 no-underline tracking-[-0.07em]"
10082 style = { {
10183 fontWeight : 950 ,
102- fontSize : "30px " ,
84+ fontSize : "24px " ,
10385 color : "var(--white)"
10486 } }
10587 >
10688 < CoffeeLogo
107- className = "h-16 w-16 flex-shrink-0"
108- style = { { filter : `drop-shadow(0 0 14px ${ colors . primary } , 0.3))` } }
89+ className = "h-12 w-12 flex-shrink-0"
90+ style = { { filter : `drop-shadow(0 0 14px ${ tone ( 0.3 ) } )` } }
10991 />
11092 < CodeDockWordmark accentColor = { colors . primaryHex } />
11193 </ Link >
112- < p className = "m-0 mb-6 leading-[1.7] tracking-tight" style = { {
113- fontSize : "15px" ,
114- fontWeight : 700 ,
115- color : "var(--muted)" ,
116- maxWidth : "320px"
117- } } >
94+ < p
95+ className = "m-0 mb-4 leading-[1.55] tracking-tight"
96+ style = { {
97+ fontSize : "13px" ,
98+ fontWeight : 700 ,
99+ color : "var(--muted)" ,
100+ maxWidth : "420px"
101+ } }
102+ >
118103 { copy . description }
119104 </ p >
120- < div className = "flex gap-3 " >
105+ < div className = "flex gap-2 " >
121106 { socialLinks . map ( ( social ) => {
122107 const Icon = social . icon ;
123108 return (
@@ -127,60 +112,49 @@ export function Footer() {
127112 target = "_blank"
128113 rel = "noopener noreferrer"
129114 aria-label = { social . label === "Email" && isKorean ? "이메일" : social . label }
130- className = "flex h-10 w-10 items-center justify-center rounded-lg transition-all hover:scale-110"
115+ className = "flex h-9 w-9 items-center justify-center rounded-lg transition-all hover:scale-110"
131116 style = { {
132- background : ` ${ colors . primary } , 0.08)` ,
133- border : `1px solid ${ colors . primary } , 0.22)` ,
117+ background : tone ( 0.08 ) ,
118+ border : `1px solid ${ tone ( 0.22 ) } ` ,
134119 color : colors . primaryHex
135120 } }
136121 >
137- < Icon size = { 20 } strokeWidth = { 2 } />
122+ < Icon size = { 18 } strokeWidth = { 2 } />
138123 </ a >
139124 ) ;
140125 } ) }
141126 </ div >
142127 </ div >
143128
144129 < div >
145- < h3 className = "m-0 mb-4 tracking-tight" style = { { fontSize : "14px" , fontWeight : 950 , color : "var(--white)" } } >
146- { copy . product }
147- </ h3 >
148- { renderLinks ( footerLinks . product ) }
149- </ div >
150-
151- < div >
152- < h3 className = "m-0 mb-4 tracking-tight" style = { { fontSize : "14px" , fontWeight : 950 , color : "var(--white)" } } >
153- { copy . company }
154- </ h3 >
155- { renderLinks ( footerLinks . company ) }
156- </ div >
157-
158- < div >
159- < h3 className = "m-0 mb-4 tracking-tight" style = { { fontSize : "14px" , fontWeight : 950 , color : "var(--white)" } } >
160- { copy . resources }
130+ < h3 className = "m-0 mb-3 tracking-tight" style = { { fontSize : "13px" , fontWeight : 950 , color : "var(--white)" } } >
131+ { copy . navigation }
161132 </ h3 >
162- { renderLinks ( footerLinks . resources ) }
133+ { renderLinks ( footerLinks . navigation ) }
163134 </ div >
164135
165136 < div >
166- < h3 className = "m-0 mb-4 tracking-tight" style = { { fontSize : "14px " , fontWeight : 950 , color : "var(--white)" } } >
167- { copy . legal }
137+ < h3 className = "m-0 mb-3 tracking-tight" style = { { fontSize : "13px " , fontWeight : 950 , color : "var(--white)" } } >
138+ { copy . account }
168139 </ h3 >
169- { renderLinks ( footerLinks . legal ) }
140+ { renderLinks ( footerLinks . account ) }
170141 </ div >
171142 </ div >
172143
173- < div className = "pt-8 " style = { { borderTop : `1px solid ${ colors . primary } , 0.15) ` } } >
174- < div className = "flex flex-col items-center justify-between gap-4 md:flex-row" >
175- < p className = "m-0 tracking-tight" style = { { fontSize : "13px " , fontWeight : 700 , color : "var(--muted)" } } >
144+ < div className = "pt-5 " style = { { borderTop : `1px solid ${ tone ( 0.14 ) } ` } } >
145+ < div className = "flex flex-col items-center justify-between gap-3 md:flex-row" >
146+ < p className = "m-0 tracking-tight" style = { { fontSize : "12px " , fontWeight : 700 , color : "var(--muted)" } } >
176147 © { currentYear } CodeDock. { copy . rights }
177148 </ p >
178- < p className = "m-0 flex items-center gap-2 tracking-tight" style = { {
179- fontSize : "13px" ,
180- fontWeight : 700 ,
181- color : "var(--muted)"
182- } } >
183- { copy . madeWith } < Heart size = { 16 } strokeWidth = { 2 } style = { { color : "#FF6B6B" } } fill = "#FF6B6B" /> { copy . madeBy }
149+ < p
150+ className = "m-0 flex items-center gap-2 tracking-tight"
151+ style = { {
152+ fontSize : "12px" ,
153+ fontWeight : 700 ,
154+ color : "var(--muted)"
155+ } }
156+ >
157+ { copy . madeWith } < Heart size = { 14 } strokeWidth = { 2 } style = { { color : "#FF6B6B" } } fill = "#FF6B6B" /> { copy . madeBy }
184158 </ p >
185159 </ div >
186160 </ div >
0 commit comments