diff --git a/apps/web/.eslintrc.cjs b/apps/web/.eslintrc.cjs index 34dff4a..f55768c 100644 --- a/apps/web/.eslintrc.cjs +++ b/apps/web/.eslintrc.cjs @@ -2,4 +2,8 @@ module.exports = { root: true, extends: ['next/core-web-vitals'], + rules: { + 'react/no-unescaped-entities': 'off', + '@next/next/no-img-element': 'off', + }, }; diff --git a/apps/web/src/app/about/page.tsx b/apps/web/src/app/about/page.tsx new file mode 100644 index 0000000..36d2ebb --- /dev/null +++ b/apps/web/src/app/about/page.tsx @@ -0,0 +1,88 @@ +import type { Metadata } from 'next'; +import Link from 'next/link'; + +export const metadata: Metadata = { + title: '회사 소개 | Startover', + description: + 'Startover는 폐업·양도·창업을 잇는 중개 플랫폼입니다. 소상공인의 깔끔한 마무리와 합리적인 재시작을 돕습니다.', + alternates: { canonical: 'https://startover.co.kr/about' }, +}; + +export default function AboutPage() { + return ( +
+

About

+

+ Startover가 하는 일 +

+

+ Startover는 폐업을 준비하는 소상공인과 창업을 준비하는 예비 사업자, + 그리고 철거·인테리어 업체를 한자리에서 연결하는 중개 플랫폼입니다. + 한 번의 매장 등록으로 시설 인수, 양도, 지원금 신청, 철거와 인테리어까지 + 이어지는 복잡한 흐름을 하나로 묶어 처리합니다. +

+ +
+

우리가 풀려는 문제

+

+ 폐업은 “그만두는 일”이 아니라 “정리하는 일”입니다. 시설을 어떻게 처분할지, + 원상복구는 어디까지 해야 할지, 남은 임대 기간과 권리금은 어떻게 처리할지, + 정부 지원금은 받을 수 있는지 — 이런 질문들이 한꺼번에 쏟아집니다. 창업자도 마찬가지입니다. + 어떤 상권의 어떤 매장을, 어떤 조건에 인수해야 합리적인 시작이 될지 판단하기가 어렵습니다. +

+

+ Startover는 이 두 입장을 잇는 중간 다리입니다. 매도인은 매장 한 번 등록으로 + 여러 경로의 매수자·업체와 연결되고, 매수인은 검증된 매장 정보를 기반으로 + 의사결정을 빠르게 할 수 있습니다. +

+
+ +
+

핵심 가치

+ +
+ +
+

서비스 영역

+

+ 현재 베타 서비스는 서울 강남권(역삼·선릉·논현)과 마포권(홍대·합정·연남)을 + 중심으로 운영 중이며, 휴게음식점·일반음식점·주류점·오락스포츠·판매업·서비스업· + 기타 업종의 매장 양도를 지원합니다. 서비스 지역과 업종은 순차적으로 확장될 + 예정입니다. +

+
+ +
+ + 매장 둘러보기 + + + 문의하기 + +
+
+ ); +} diff --git a/apps/web/src/app/blog/[slug]/page.tsx b/apps/web/src/app/blog/[slug]/page.tsx new file mode 100644 index 0000000..9629100 --- /dev/null +++ b/apps/web/src/app/blog/[slug]/page.tsx @@ -0,0 +1,128 @@ +import type { Metadata } from 'next'; +import Link from 'next/link'; +import { notFound } from 'next/navigation'; +import { getPostBySlug, getPostsSortedByDate, POSTS } from '../posts'; + +const CATEGORY_COLORS: Record = { + 폐업: 'bg-warm-500/10 text-warm-700', + 창업: 'bg-sage-500/10 text-sage-700', + 지원금: 'bg-warm-400/15 text-warm-800', + 인테리어: 'bg-ink/5 text-ink', +}; + +export function generateStaticParams() { + return POSTS.map((p) => ({ slug: p.slug })); +} + +export async function generateMetadata({ + params, +}: { + params: Promise<{ slug: string }>; +}): Promise { + const { slug } = await params; + const post = getPostBySlug(slug); + if (!post) return { title: 'Not Found' }; + + const url = `https://startover.co.kr/blog/${post.slug}`; + return { + title: `${post.title} | Startover 블로그`, + description: post.description, + alternates: { canonical: url }, + openGraph: { + title: post.title, + description: post.description, + url, + type: 'article', + publishedTime: post.publishedAt, + }, + twitter: { + card: 'summary_large_image', + title: post.title, + description: post.description, + }, + }; +} + +export default async function BlogDetailPage({ + params, +}: { + params: Promise<{ slug: string }>; +}) { + const { slug } = await params; + const post = getPostBySlug(slug); + if (!post) { + notFound(); + } + + const related = getPostsSortedByDate() + .filter((p) => p.slug !== post.slug && p.category === post.category) + .slice(0, 3); + + const jsonLd = { + '@context': 'https://schema.org', + '@type': 'Article', + headline: post.title, + description: post.description, + datePublished: post.publishedAt, + author: { '@type': 'Organization', name: 'Startover' }, + publisher: { '@type': 'Organization', name: 'Startover' }, + mainEntityOfPage: `https://startover.co.kr/blog/${post.slug}`, + }; + + return ( +
+