Skip to content

Commit ef67e4e

Browse files
authored
Merge pull request #50 from LinkyBoard/dev
[WEB] 배포 최신화
2 parents db8603a + ce3bd17 commit ef67e4e

18 files changed

Lines changed: 268 additions & 241 deletions

.github/workflows/deploy-vercel.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
name: Deploy to Vercel with Redeploy-on-Failure
1+
name: Deploy to Vercel
22

33
on:
44
push:

apps/web/README.md

Lines changed: 57 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,69 @@
1-
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
1+
# LinkyBoard Web
22

3-
## Getting Started
3+
Next.js 기반 웹 플랫폼입니다.
44

5-
First, run the development server:
5+
## 기술 스택
66

7-
```bash
8-
npm run dev
9-
# or
10-
yarn dev
11-
# or
12-
pnpm dev
13-
# or
14-
bun dev
15-
```
7+
- **Framework**: Next.js 15 (App Router)
8+
- **Language**: TypeScript
9+
- **Styling**: Tailwind CSS 4
10+
- **State**: Zustand, TanStack Query
1611

17-
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
12+
## 설치 방법
1813

19-
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
14+
1. 프로젝트 루트에서 의존성 설치 (이미 설치되어 있다면 생략)
2015

21-
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22-
23-
## Learn More
16+
```bash
17+
pnpm install
18+
```
2419

25-
To learn more about Next.js, take a look at the following resources:
20+
## 개발 서버 실행
2621

27-
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28-
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
22+
```bash
23+
# 루트에서 실행
24+
pnpm dev:web
2925

30-
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
26+
# 또는 web 디렉토리에서 직접 실행
27+
cd apps/web
28+
pnpm dev
29+
```
3130

32-
## Deploy on Vercel
31+
개발 서버는 [http://localhost:3000](http://localhost:3000)에서 실행됩니다.
3332

34-
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
33+
## 프로젝트 구조
3534

36-
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
35+
```plaintext
36+
web/
37+
├── public/ # 정적 파일
38+
│ ├── example/ # 예제 비디오 파일
39+
│ └── static/ # 정적 이미지
40+
├── src/
41+
│ ├── app/ # Next.js App Router
42+
│ │ ├── (with-side-bar)/ # 사이드바가 있는 레이아웃 그룹
43+
│ │ │ ├── dashboard/ # 대시보드 페이지
44+
│ │ │ ├── library/ # 라이브러리 페이지
45+
│ │ │ └── topic/ # 토픽 페이지
46+
│ │ ├── login/ # 로그인 페이지
47+
│ │ ├── redirect/ # 로그인 리다이렉트 페이지
48+
│ │ ├── layout.tsx # 루트 레이아웃
49+
│ │ └── page.tsx # 랜딩 페이지
50+
│ ├── assets/ # 폰트, SVG 등
51+
│ ├── components/ # React 컴포넌트
52+
│ │ ├── (with-side-bar)/ # 사이드바 관련 컴포넌트
53+
│ │ ├── common/ # 공통 컴포넌트
54+
│ │ ├── landing/ # 랜딩 페이지 컴포넌트
55+
│ │ └── provider/ # Provider 컴포넌트
56+
│ ├── constants/ # 상수 정의
57+
│ ├── hooks/ # 커스텀 훅
58+
│ ├── lib/ # 라이브러리 설정
59+
│ │ ├── tanstack/ # TanStack Query 설정
60+
│ │ └── zustand/ # Zustand 스토어
61+
│ ├── models/ # 데이터 모델
62+
│ ├── page/ # 경로에 해당하는 페이지 컴포넌트
63+
│ ├── schemas/ # Zod 스키마
64+
│ ├── services/ # API 서비스
65+
│ ├── types/ # TypeScript 타입 정의
66+
│ └── utils/ # 유틸리티 함수
67+
├── next.config.ts # Next.js 설정
68+
└── postcss.config.mjs # PostCSS 설정
69+
```
2.17 MB
Loading
5.79 MB
Loading

apps/web/src/app/globals.css

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,53 @@ div.customHandle {
5151
.node-toggleListItem:has(+ .bn-block-group) svg {
5252
fill: var(--foreground);
5353
}
54+
55+
@utility bg-glass {
56+
background-color: transparent;
57+
-webkit-backdrop-filter: blur(25px);
58+
backdrop-filter: blur(25px);
59+
border: 1px solid rgba(255, 255, 255, 0.3);
60+
border-radius: 60px;
61+
}
62+
63+
@utility bg-radial-gradient-blue {
64+
background: radial-gradient(
65+
50% 50% at 50% 50%,
66+
#c0d9ff 0%,
67+
rgba(192, 217, 255, 0.8) 46.63%,
68+
rgba(192, 217, 255, 0) 100%
69+
);
70+
}
71+
72+
@utility bg-radial-gradient-purple {
73+
background: radial-gradient(
74+
50% 50% at 50% 50%,
75+
rgba(225, 217, 253, 0.8) 0%,
76+
rgba(225, 217, 253, 0.8) 46.63%,
77+
rgba(225, 216, 255, 0) 100%
78+
);
79+
/* background: radial-gradient(
80+
50% 50% at 50% 50%,
81+
#ccbeff 0%,
82+
rgba(204, 190, 255, 0.8) 46.63%,
83+
rgba(225, 216, 255, 0) 100%
84+
); */
85+
}
86+
87+
@utility bg-radial-gradient-duo {
88+
background:
89+
radial-gradient(
90+
50% 50% at 50% 50%,
91+
#ccbeff 0%,
92+
rgba(204, 190, 255, 0.8) 46.63%,
93+
rgba(225, 216, 255, 0) 100%
94+
),
95+
radial-gradient(
96+
55.95% 57.37% at 29.97% 32%,
97+
rgba(163, 137, 255, 0.7) 0%,
98+
rgba(163, 137, 255, 0.35) 38.72%,
99+
rgba(255, 0, 4, 0.5) 100%
100+
);
101+
filter: blur(120px);
102+
opacity: 0.9;
103+
}

apps/web/src/app/layout.tsx

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,16 @@
11
import "./globals.css";
22

33
import type { Metadata } from "next";
4-
import { JetBrains_Mono, Merriweather, Poppins } from "next/font/google";
4+
import localFont from "next/font/local";
55

66
import RootProvider from "@/components/provider/root-provider";
77
import ThirdPartyProvider from "@/components/provider/third-party-provider";
88
import { cn } from "@linkyboard/utils";
99

10-
const poppins = Poppins({
11-
subsets: ["latin"],
12-
weight: ["300", "400", "500", "600", "700"],
13-
variable: "--font-poppins",
14-
});
15-
16-
const merriweather = Merriweather({
17-
subsets: ["latin"],
18-
weight: ["300", "400", "700"],
19-
variable: "--font-merriweather",
20-
});
21-
22-
const jetbrainsMono = JetBrains_Mono({
23-
subsets: ["latin"],
24-
weight: ["400", "500"],
25-
variable: "--font-jetbrains-mono",
10+
const pretendard = localFont({
11+
src: "../assets/fonts/PretendardVariable.woff2",
12+
variable: "--font-pretendard",
13+
display: "swap",
2614
});
2715

2816
export const metadata: Metadata = {
@@ -74,16 +62,8 @@ export default function RootLayout({
7462
children: React.ReactNode;
7563
}>) {
7664
return (
77-
<html lang="ko" className={cn(poppins.variable, merriweather.variable, jetbrainsMono.variable)}>
78-
<head>
79-
<meta
80-
name="google-site-verification"
81-
content="QCEJjFcIzUi4_pR-QJw5g8OdYabndorX1YORsRauKnw"
82-
/>
83-
<link rel="preconnect" href="https://fonts.googleapis.com" />
84-
<link rel="preconnect" href="https://fonts.gstatic.com" />
85-
</head>
86-
<body className={cn(poppins.className, "antialiased")}>
65+
<html lang="ko">
66+
<body className={cn(pretendard.className, "antialiased")}>
8767
<ThirdPartyProvider />
8868
<RootProvider>{children}</RootProvider>
8969
</body>

apps/web/src/app/page.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@ import BenefitsSection from "@/components/landing/benefits-section";
44
import DemoSection from "@/components/landing/demo-section";
55
import FeaturesSection from "@/components/landing/features-section";
66
import Footer from "@/components/landing/footer";
7+
import FourStepsSection from "@/components/landing/four-steps-section";
78
import Header from "@/components/landing/header";
89
import HeroSection from "@/components/landing/hero-section";
9-
import HowItWorksSection from "@/components/landing/how-it-works-section";
10-
import ProblemSolutionSection from "@/components/landing/problem-solution-section";
1110
import { getCookie } from "@/utils/cookie";
1211

1312
export default async function Home() {
@@ -18,14 +17,13 @@ export default async function Home() {
1817
}
1918

2019
return (
21-
<main className="min-h-screen">
20+
<main className="min-h-screen overflow-x-hidden">
2221
<Header />
2322
<HeroSection />
2423
<DemoSection />
25-
<ProblemSolutionSection />
2624
<FeaturesSection />
2725
<BenefitsSection />
28-
<HowItWorksSection />
26+
<FourStepsSection />
2927
<Footer />
3028
</main>
3129
);
File renamed without changes.

apps/web/src/components/landing/benefits-section.tsx

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Database, Gem, Heart, Lightbulb, Rocket, Users } from "lucide-react";
1+
import { Database, Gem, Lightbulb, Rocket } from "lucide-react";
22

33
const benefits = [
44
{
@@ -16,29 +16,19 @@ const benefits = [
1616
title: "체계적 지식 축적",
1717
description: "체계적인 지식 축적과 관리",
1818
},
19-
{
20-
icon: Heart,
21-
title: "스트레스 감소",
22-
description: "정보 과부하로 인한 스트레스 해소",
23-
},
2419
{
2520
icon: Gem,
2621
title: "개인 지식 자산",
2722
description: "나만의 가치 있는 지식 자산 구축",
2823
},
29-
{
30-
icon: Users,
31-
title: "협업 가능",
32-
description: "팀원과 지식 공유 및 협업",
33-
},
3424
];
3525

3626
export default function BenefitsSection() {
3727
return (
38-
<section id="benefits" className="py-20">
39-
<div className="mx-auto max-w-6xl px-4">
28+
<section id="benefits" className="relative overflow-hidden py-20">
29+
<div className="relative z-10 mx-auto max-w-6xl px-4">
4030
<div className="mb-16 text-center">
41-
<h2 className="mb-4 text-4xl font-bold">LinkyBoard의 혜택</h2>
31+
<h2 className="mb-4 text-4xl font-bold">LinkyBoard의 가치</h2>
4232
<p className="text-muted-foreground mx-auto max-w-2xl text-lg">
4333
지식 관리의 새로운 패러다임을 경험하세요
4434
</p>
@@ -59,6 +49,7 @@ export default function BenefitsSection() {
5949
))}
6050
</div>
6151
</div>
52+
<div className="bg-radial-gradient-purple max-size-96 absolute bottom-0 left-1/2 z-0 size-[90vw] -translate-x-1/2 translate-y-1/2 rounded-full" />
6253
</section>
6354
);
6455
}

apps/web/src/components/landing/demo-section.tsx

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,26 +16,35 @@ const DEMO_VIDEOS = [
1616
type: "extension",
1717
icon: <NotebookPen size={12} />,
1818
title: "요약",
19-
description: "웹 서칭 중 발견한 지식들을 요약하세요.",
19+
description: "웹 서칭 중 발견한 지식들을 저장하세요.",
2020
video: extensionVideo,
2121
button: "Chrome 확장프로그램 다운로드",
2222
},
2323
{
2424
type: "dashboard",
2525
icon: <FolderArchive size={12} />,
2626
title: "정리",
27-
description: "발견한 지식들을 한 곳에서 관리하세요.",
27+
description: "저장한 지식들을 한 곳에서 관리하세요.",
2828
video: dashboardVideo,
2929
button: "정리하러 가기",
3030
},
3131
{
3232
type: "topic",
3333
icon: <Link size={12} />,
3434
title: "연결",
35-
description: "지식들을 연결하여 하나의 토픽을 생성하세요.",
35+
description: "한 곳에 모은 지식들을 자유롭게 연결하세요.",
3636
video: topicVideo,
3737
button: "연결하러 가기",
3838
},
39+
// TODO: 서버 복구되면 영상 찍기
40+
// {
41+
// type: "dashboard",
42+
// icon: <FolderArchive size={12} />,
43+
// title: "정리",
44+
// description: "연결된 지식들을 하나로 요약하세요.",
45+
// video: topicVideo,
46+
// button: "요약하러 가기",
47+
// },
3948
];
4049

4150
export default function DemoSection() {
@@ -55,13 +64,13 @@ export default function DemoSection() {
5564
};
5665

5766
return (
58-
<section className="bg-card px-4 py-20">
59-
<div className="mx-auto max-w-6xl space-y-8 sm:space-y-12 lg:space-y-24">
67+
<section className="bg-card relative px-4 py-20">
68+
<div className="relative z-10 mx-auto max-w-6xl space-y-8 sm:space-y-12 lg:space-y-24">
6069
{DEMO_VIDEOS.map((demo, idx) => (
6170
<div
62-
key={demo.title}
71+
key={`${demo.title}-${idx}`}
6372
className={cn(
64-
"animate-fade-in-up flex flex-col items-center gap-6 rounded-2xl lg:flex-row lg:gap-10",
73+
"animate-fade-in-up z-1 flex flex-col items-center gap-6 rounded-2xl lg:flex-row lg:gap-10",
6574
idx % 2 && "lg:flex-row-reverse"
6675
)}
6776
>
@@ -95,6 +104,10 @@ export default function DemoSection() {
95104
</div>
96105
))}
97106
</div>
107+
<div className="bg-radial-gradient-blue z-1 absolute left-32 top-0 size-[600px] -translate-y-1/2 rounded-full" />
108+
<div className="bg-radial-gradient-purple absolute left-0 top-0 z-0 size-[600px] -translate-x-1/3 -translate-y-1/4 rounded-full" />
109+
<div className="bg-radial-gradient-duo absolute right-0 top-1/2 z-0 size-[600px] translate-x-1/4 rounded-full" />
110+
<div className="bg-radial-gradient-blue z-1 absolute bottom-0 left-0 size-[600px] -translate-x-1/3 translate-y-1/2 rounded-full" />
98111
</section>
99112
);
100113
}

0 commit comments

Comments
 (0)