Skip to content

Commit 8a45220

Browse files
authored
Merge pull request #481 from TEAM-HOUME/feat/landing-view/#477
[feat] 랜딩 페이지 & Action 버튼 공컴
2 parents e2352bc + 762b599 commit 8a45220

File tree

17 files changed

+353
-23
lines changed

17 files changed

+353
-23
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { style } from '@vanilla-extract/css';
2+
3+
import ImgLanding01 from '@assets/images/ImgLanding_01.png';
4+
5+
import { colorVars } from '@styles/tokensV2/color.css';
6+
import { fontVars } from '@styles/tokensV2/font.css';
7+
import { unitVars } from '@styles/tokensV2/unit.css';
8+
9+
export const page = style({
10+
display: 'flex',
11+
flexDirection: 'column',
12+
alignItems: 'center',
13+
background: `url(${ImgLanding01}) center / cover no-repeat`,
14+
padding: `${unitVars.unit.gapPadding['300']} ${unitVars.unit.gapPadding['000']}`,
15+
width: '100%',
16+
minHeight: '100vh',
17+
});
18+
19+
export const mainSection = style({
20+
display: 'flex',
21+
flex: '1 0 0',
22+
flexDirection: 'column',
23+
alignItems: 'center',
24+
alignSelf: 'stretch',
25+
gap: unitVars.unit.gapPadding['000'],
26+
padding: `${unitVars.unit.gapPadding['400']} ${unitVars.unit.gapPadding['500']}`,
27+
});
28+
29+
export const contentBlock = style({
30+
display: 'flex',
31+
flexDirection: 'column',
32+
alignItems: 'center',
33+
alignSelf: 'stretch',
34+
gap: unitVars.unit.gapPadding['700'],
35+
padding: `${unitVars.unit.gapPadding['900']} ${unitVars.unit.gapPadding['000']}`,
36+
});
37+
38+
export const textContainer = style({
39+
display: 'flex',
40+
flexDirection: 'column',
41+
alignItems: 'center',
42+
alignSelf: 'stretch',
43+
justifyContent: 'center',
44+
gap: unitVars.unit.gapPadding['300'],
45+
padding: `${unitVars.unit.gapPadding['000']}`,
46+
});
47+
48+
export const title = style({
49+
...fontVars.font.title_sb_24,
50+
textAlign: 'center',
51+
color: colorVars.color.text.inverse,
52+
});
53+
54+
export const text = style({
55+
...fontVars.font.body_r_14,
56+
textAlign: 'center',
57+
color: colorVars.color.text.inverseSecondary,
58+
});

src/pages/landing/LandingPage.tsx

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { useABTest } from '@pages/generate/hooks/useABTest';
2+
3+
import ActionButton from '@shared/components/v2/button/actionButton/ActionButton';
4+
import LogoNavBar from '@shared/components/v2/navBar/LogoNavBar';
5+
6+
import * as styles from './LandingPage.css';
7+
8+
const LANDING_CONTENT_MOCK = {
9+
titleLine: "'재택근무가 필요한'",
10+
} as const;
11+
12+
const LandingPage = () => {
13+
const { variant, isLoading } = useABTest();
14+
15+
/** A/B: single → solid inverse CTA, multiple → ghost + 아이콘 CTA */
16+
const isGhostCta = !isLoading && variant === 'multiple';
17+
18+
return (
19+
<main className={styles.page}>
20+
<LogoNavBar page="landing" />
21+
<section className={styles.mainSection}>
22+
<div className={styles.contentBlock}>
23+
<div className={styles.textContainer}>
24+
<p className={styles.title}>
25+
{LANDING_CONTENT_MOCK.titleLine}
26+
<br />
27+
나를 위한 맞춤형 인테리어는?
28+
</p>
29+
<p className={styles.text}>
30+
집 구조, 취향, 생활 방식까지 반영하는 AI 홈 스타일링
31+
</p>
32+
</div>
33+
{isGhostCta ? (
34+
<ActionButton
35+
variant="ghost"
36+
color="primary"
37+
size="L"
38+
leftIcon="DoubleStar"
39+
>
40+
우리 집 바꾸러 가기
41+
</ActionButton>
42+
) : (
43+
<ActionButton variant="solid" color="inverse" size="L">
44+
우리 집 바꾸러 가기
45+
</ActionButton>
46+
)}
47+
</div>
48+
</section>
49+
</main>
50+
);
51+
};
52+
53+
export default LandingPage;

src/routes/paths.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// 값 유니온 타입(RoutePath)을 자동으로 얻어 타입 안전성을 확보할 수 있습니다.
44
export const ROUTES = {
55
HOME: '/',
6+
LANDING: '/landing',
67
LOGIN: '/login',
78
SIGNUP: '/signup',
89
GENERATE_START: '/generate/start',

src/routes/router.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// ------------------------------
44
// React Router v6.4(Data Router)의 createBrowserRouter 패턴을 사용하여
55
// 1) RootLayout : 모든 페이지의 공통 레이아웃(헤더·푸터) + <Outlet />
6-
// 2) 공개 라우트 : Home, Login, Signup, ServicePolicy, PrivacyPolicy
6+
// 2) 공개 라우트 : Home, Landing, Login, Signup, ServicePolicy, PrivacyPolicy
77
// 3) ProtectedRoute : 인증이 필요한 하위 라우트 묶음
88
// - 인증 실패 시 ROUTES.LOGIN 으로 리다이렉트
99
// ------------------------------
@@ -12,6 +12,7 @@ import { createBrowserRouter } from 'react-router-dom';
1212

1313
import HomePage from '@pages/home/HomePage';
1414
import ImageSetupPage from '@pages/imageSetup/ImageSetupPage';
15+
import LandingPage from '@pages/landing/LandingPage';
1516
import KakaoCallbackPage from '@pages/login/KakaoCallbackPage';
1617
import LoginPage from '@pages/login/LoginPage';
1718

@@ -30,6 +31,10 @@ const publicRoutes = [
3031
index: true,
3132
element: <HomePage />,
3233
},
34+
{
35+
path: ROUTES.LANDING,
36+
element: <LandingPage />,
37+
},
3338
{
3439
path: ROUTES.LOGIN,
3540
element: <LoginPage />,
Lines changed: 7 additions & 0 deletions
Loading
Lines changed: 7 additions & 0 deletions
Loading
Lines changed: 4 additions & 0 deletions
Loading
Lines changed: 4 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)