Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 26 additions & 3 deletions CHANGELOG.json
Original file line number Diff line number Diff line change
@@ -1,14 +1,37 @@
{
"metadata": {
"lastUpdated": "2026-06-18T07:29:54Z",
"currentVersion": "0.1.53",
"lastUpdated": "2026-06-18T07:44:06Z",
"currentVersion": "0.1.54",
"projectType": "react",
"totalReleases": 18,
"totalReleases": 19,
"projectTypes": [
"react"
]
},
"releases": [
{
"version": "0.1.54",
"project_type": "react",
"project_types": [
"react"
],
"date": "2026-06-18",
"pr_number": 661,
"raw_summary": "## Summary by CodeRabbit\n\n## 릴리슀 λ…ΈνŠΈ\n\n* **κ°œμ„ **\n * PCμ—μ„œ 둜그인 화면이 κ°€μš΄λ° μΉ΄λ“œλ‘œ κΉ”λ”ν•˜κ²Œ ν‘œμ‹œλ©λ‹ˆλ‹€\n * 둜그인 ν™”λ©΄μ—μ„œ 상단 메뉴가 더 이상 보이지 μ•ŠμŠ΅λ‹ˆλ‹€\n * 자료·질문 κ²Œμ‹œνŒμ΄ 넓은 ν™”λ©΄μ—μ„œλ„ 보기 μ’‹κ²Œ μ •λ ¬λ©λ‹ˆλ‹€\n * κΈ€μ“°κΈ° 화면이 읽기 νŽΈν•œ λ„ˆλΉ„λ‘œ μ •λˆλ˜μ—ˆμŠ΅λ‹ˆλ‹€\n * 검색 ν™”λ©΄μ—μ„œ μ–‘μ˜† νšŒμƒ‰ 여백이 μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€",
"parsed_changes": {
"κ°œμ„ ": {
"title": "κ°œμ„ ",
"items": [
"PCμ—μ„œ 둜그인 화면이 κ°€μš΄λ° μΉ΄λ“œλ‘œ κΉ”λ”ν•˜κ²Œ ν‘œμ‹œλ©λ‹ˆλ‹€",
"둜그인 ν™”λ©΄μ—μ„œ 상단 메뉴가 더 이상 보이지 μ•ŠμŠ΅λ‹ˆλ‹€",
"자료·질문 κ²Œμ‹œνŒμ΄ 넓은 ν™”λ©΄μ—μ„œλ„ 보기 μ’‹κ²Œ μ •λ ¬λ©λ‹ˆλ‹€",
"κΈ€μ“°κΈ° 화면이 읽기 νŽΈν•œ λ„ˆλΉ„λ‘œ μ •λˆλ˜μ—ˆμŠ΅λ‹ˆλ‹€",
"검색 ν™”λ©΄μ—μ„œ μ–‘μ˜† νšŒμƒ‰ 여백이 μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€"
]
}
},
"parse_method": "markdown"
},
{
"version": "0.1.53",
"project_type": "react",
Expand Down
17 changes: 15 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,20 @@
# Changelog

**ν˜„μž¬ 버전:** 0.1.53
**λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ:** 2026-06-18T07:29:54Z
**ν˜„μž¬ 버전:** 0.1.54
**λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈ:** 2026-06-18T07:44:06Z

---

## [0.1.54] - 2026-06-18

**PR:** #661

**κ°œμ„ **
- PCμ—μ„œ 둜그인 화면이 κ°€μš΄λ° μΉ΄λ“œλ‘œ κΉ”λ”ν•˜κ²Œ ν‘œμ‹œλ©λ‹ˆλ‹€
- 둜그인 ν™”λ©΄μ—μ„œ 상단 메뉴가 더 이상 보이지 μ•ŠμŠ΅λ‹ˆλ‹€
- 자료·질문 κ²Œμ‹œνŒμ΄ 넓은 ν™”λ©΄μ—μ„œλ„ 보기 μ’‹κ²Œ μ •λ ¬λ©λ‹ˆλ‹€
- κΈ€μ“°κΈ° 화면이 읽기 νŽΈν•œ λ„ˆλΉ„λ‘œ μ •λˆλ˜μ—ˆμŠ΅λ‹ˆλ‹€
- 검색 ν™”λ©΄μ—μ„œ μ–‘μ˜† νšŒμƒ‰ 여백이 μ‚¬λΌμ‘ŒμŠ΅λ‹ˆλ‹€

---

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# πŸ“š 세쒅말싸미 ν”„λ‘ νŠΈμ—”λ“œ πŸ“š

<!-- AUTO-VERSION-SECTION: DO NOT EDIT MANUALLY -->
## μ΅œμ‹  버전 : v0.1.52 (2026-06-18)
## μ΅œμ‹  버전 : v0.1.53 (2026-06-18)

[전체 버전 기둝 보기](CHANGELOG.md)

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "malsami-fe",
"version": "0.1.53",
"version": "0.1.54",
"private": true,
"scripts": {
"dev": "next dev",
Expand Down
17 changes: 12 additions & 5 deletions src/app/ClientLayout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,30 @@ import GlobalLoginModal from "@/components/common/GlobalLoginModal";
export default function ClientLayout({ children }: { children: React.ReactNode }) {
const pathname = usePathname();

// λ„€λΉ„κ²Œμ΄μ…˜ ν‘œμ‹œν•  경둜 리슀트
// λͺ¨λ°”일 ν•˜λ‹¨ νƒ­λ°”λ₯Ό ν‘œμ‹œν•  경둜 리슀트 (메인 4개 νŽ˜μ΄μ§€)
const showNavPaths = ["/", "/board/question", "/board/document", "/mypage"];
const shouldShowNav = showNavPaths.includes(pathname);

// 상단 κΈ€λ‘œλ²Œ λ„€λΉ„(PC)λ₯Ό 숨길 경둜 β€” 둜그인 λ“± 인증 전·집쀑 ν™”λ©΄.
// κ·Έ μ™Έ λͺ¨λ“  일반 νŽ˜μ΄μ§€μ—μ„œλŠ” PC 상단 λ„€λΉ„λ₯Ό 항상 λ…ΈμΆœν•΄ μ–΄λ””μ„œλ“  이동 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€.
const hideTopNavPaths = ["/login"];
const shouldShowTopNav = !hideTopNavPaths.includes(pathname);

return (
<>
{/* 톡(쀑앙 κ³ μ • 폭 μ»¨ν…Œμ΄λ„ˆ) 제거 β€” 폭 μ œν•œμ€ 각 νŽ˜μ΄μ§€κ°€ μ½˜ν…μΈ  성격에 맞게 κ²°μ •ν•œλ‹€. */}
<div className="min-h-screen bg-white">
{/* PC(lg+) μ „μš© 상단 κΈ€λ‘œλ²Œ λ„€λΉ„ β€” λͺ¨λ°”μΌμ—μ„œλŠ” μˆ¨κΉ€ */}
<GlobalTopNav />
{/* PC(lg+) μ „μš© 상단 κΈ€λ‘œλ²Œ λ„€λΉ„ β€” λͺ¨λ°”μΌμ—μ„œλŠ” μˆ¨κΉ€, 인증 μ „ ν™”λ©΄(둜그인)μ—μ„œλŠ” λ―Έν‘œμ‹œ */}
{shouldShowTopNav && <GlobalTopNav />}

{/*
μ½˜ν…μΈ  μ˜μ—­.
- λͺ¨λ°”일: ν•˜λ‹¨ νƒ­λ°”κ°€ λ³΄μ΄λŠ” 경둜면 νƒ­λ°” 높이(70px)만큼 ν•˜λ‹¨ μ—¬λ°±.
- PC: 상단 κΈ€λ‘œλ²Œ λ„€λΉ„ 높이(h-16=64px)만큼 상단 μ—¬λ°±, ν•˜λ‹¨ μ—¬λ°± μ—†μŒ.
- PC: 상단 κΈ€λ‘œλ²Œ λ„€λΉ„κ°€ μžˆλŠ” κ²½λ‘œμ—μ„œλ§Œ λ„€λΉ„ 높이(h-16=64px)만큼 상단 μ—¬λ°±.
*/}
<div className={`${shouldShowNav ? "pb-[70px] lg:pb-0" : ""} lg:pt-16`}>{children}</div>
<div className={`${shouldShowNav ? "pb-[70px] lg:pb-0" : ""} ${shouldShowTopNav ? "lg:pt-16" : ""}`}>
{children}
</div>

{/* ν•˜λ‹¨ λ„€λΉ„κ²Œμ΄μ…˜λ°” - λͺ¨λ°”일 μ „μš© (PCλŠ” GlobalTopNav κ°€ λŒ€μ²΄) */}
{shouldShowNav && <CommonNav className="lg:hidden" />}
Expand Down
9 changes: 5 additions & 4 deletions src/app/board/document/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import DocumentRequestBoardSection from "@/components/documentMain/DocumentReque
import TierBoardNavigateSection from "@/components/documentMain/TierBoardNavigateSection";
import HotDocumentsSection from "@/components/landing/HotDocumentSection";
import LandingHeader from "@/components/header/LandingHeader";
import { PageContainer } from "@/components/layout/AppContainer";
import SearchBar from "@/components/common/SearchBar";
import Image from "next/image";

Expand Down Expand Up @@ -59,12 +60,12 @@ export default function DocumentBoardPage() {
}, []);

return (
<>
<div className="min-h-screen bg-white">
{/* Header */}
<LandingHeader contentType="document" />

{/* Main Content */}
<main className="px-5">
<PageContainer width="wide" as="main" className="px-5">
{/* μ•ˆλ‚΄κΈ€ μ„Ήμ…˜ - ν—€λ”λ‘œλΆ€ν„° 40px μ•„λž˜ */}
<section aria-label="intro" className="mt-10">
<div className="font-suit text-[24px] font-medium leading-[140%]">
Expand Down Expand Up @@ -125,10 +126,10 @@ export default function DocumentBoardPage() {
<section aria-labelledby="document-request-board" className="mb-5">
<DocumentRequestBoardSection />
</section>
</main>
</PageContainer>

{/* ν”Œλ‘œνŒ… λ²„νŠΌ (자료 μ—…λ‘œλ“œ) */}
<UploadDocumentFAB isFABVisible={isFABVisible} />
</>
</div>
);
}
5 changes: 3 additions & 2 deletions src/app/board/document/post/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import { useState, useEffect, useCallback } from "react";
import { useRouter } from "next/navigation";
import CommonHeader from "@/components/header/CommonHeader";
import { PageContainer } from "@/components/layout/AppContainer";
import { RIGHT_ITEM } from "@/types/header";
import subjects from "@/types/subjects";
import { DOCUMENT_MEDIA_ALLOWED_TYPES } from "@/types/documentMediaAllowedTypes";
Expand Down Expand Up @@ -176,7 +177,7 @@ export default function DocumentPostPage() {
};

return (
<div className="flex min-h-screen flex-col bg-white">
<PageContainer width="narrow" className="flex min-h-screen flex-col bg-white">
<CommonHeader
title="자료 μž‘μ„±ν•˜κΈ°"
rightType={RIGHT_ITEM.NONE}
Expand Down Expand Up @@ -218,6 +219,6 @@ export default function DocumentPostPage() {
</div>
</main>
</div>
</div>
</PageContainer>
);
}
9 changes: 5 additions & 4 deletions src/app/board/question/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import { useRouter } from "next/navigation";
import LandingHeader from "@/components/header/LandingHeader";
import { PageContainer } from "@/components/layout/AppContainer";
import SearchBar from "@/components/common/SearchBar";
import HotQuestionSection from "@/components/landing/HotQuestionSection";
import MajorQuestionSection from "@/components/landing/MajorQuestionSection";
Expand All @@ -17,11 +18,11 @@ export default function QuestionPage() {
const [bountyActiveTab, setBountyActiveTab] = useState<"졜근순" | "λ†’μ€μˆœ">("졜근순");

return (
<>
<div className="min-h-screen bg-white">
<LandingHeader contentType="question" />

{/* Main Content */}
<main className="px-5">
<PageContainer width="wide" as="main" className="px-5">
{/* μ•ˆλ‚΄κΈ€ μ„Ήμ…˜ - ν—€λ”λ‘œλΆ€ν„° 40px μ•„λž˜ */}
<section aria-label="intro" className="mt-10">
<div className="text-SUIT_24 font-medium leading-[140%]">
Expand Down Expand Up @@ -77,10 +78,10 @@ export default function QuestionPage() {
onViewAll={() => router.push("/board/question/bounty")}
/>
</section>
</main>
</PageContainer>

{/* ν”Œλ‘œνŒ… λ²„νŠΌ (κΈ€μ“°κΈ°) */}
<UploadQuestionFAB isFABVisible />
</>
</div>
);
}
5 changes: 3 additions & 2 deletions src/app/board/question/post/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import subjects from "@/types/subjects";
import LoadingSpinner from "@/components/common/LoadingSpinner";
import useCommonToast from "@/global/hook/useCommonToast";
import CommonHeader from "@/components/header/CommonHeader";
import { PageContainer } from "@/components/layout/AppContainer";
import { RIGHT_ITEM } from "@/types/header";
import { QuestionPresetTag } from "@/types/api/constants/questionPresetTag";
import { questionPostApi } from "@/apis/questionPostApi";
Expand Down Expand Up @@ -167,7 +168,7 @@ export default function QnaPostPage() {
};

return (
<div className="flex min-h-screen flex-col bg-white">
<PageContainer width="narrow" className="flex min-h-screen flex-col bg-white">
<CommonHeader
title="질문 μž‘μ„±ν•˜κΈ°"
rightType={RIGHT_ITEM.NONE}
Expand Down Expand Up @@ -204,6 +205,6 @@ export default function QnaPostPage() {
)}
</div>
</main>
</div>
</PageContainer>
);
}
19 changes: 13 additions & 6 deletions src/app/login/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,16 @@ export default function LoginPage() {
};

return (
<div className="flex min-h-screen items-center justify-center bg-gray-100">
<div className="flex min-h-screen flex-col bg-white lg:items-center lg:justify-center lg:bg-gray-100">
<ScrollToTopOnLoad />
<div className="relative flex h-screen w-full max-w-2xl flex-col bg-white">
{/*
λͺ¨λ°”일: 풀폭·풀높이 흰 ν™”λ©΄.
PC(lg+): νšŒμƒ‰ λ°°κ²½ 쀑앙에 λ–  μžˆλŠ” 흰 μΉ΄λ“œ(λ‘₯κ·Ό λͺ¨μ„œλ¦¬Β·κ·Έλ¦ΌμžΒ·μ λ‹Ήν•œ 폭).
*/}
<div className="relative flex min-h-screen w-full flex-col bg-white lg:min-h-0 lg:w-full lg:max-w-content-narrow lg:rounded-2xl lg:py-10 lg:shadow-xl">
{/* λ‘œλ”©/성곡 μ˜€λ²„λ ˆμ΄ - ν•˜λ‚˜μ˜ μ»¨ν…Œμ΄λ„ˆλ‘œ 톡합 */}
{overlayState !== "none" && (
<div className="absolute inset-0 z-50 flex flex-col items-center justify-center bg-white">
<div className="absolute inset-0 z-50 flex flex-col items-center justify-center bg-white lg:rounded-2xl">
{overlayState === "loading" ? (
<>
<LoadingSpinner />
Expand All @@ -60,9 +64,12 @@ export default function LoginPage() {
)}
</div>
)}
<CommonHeader title="둜그인" rightType={RIGHT_ITEM.NONE} />
<div className="mt-5 h-full px-5">
<div className="flex h-full flex-col">
{/* λ’€λ‘œκ°€κΈ° ν—€λ”λŠ” λͺ¨λ°”일 μ „μš© β€” PC μΉ΄λ“œμ—μ„œλŠ” μˆ¨κΈ΄λ‹€ */}
<div className="lg:hidden">
<CommonHeader title="둜그인" rightType={RIGHT_ITEM.NONE} />
</div>
<div className="mt-5 h-full px-5 lg:mt-0 lg:h-auto lg:px-10">
<div className="flex h-full flex-col lg:h-auto">
{/* 타이틀 */}
<h1 className="mb-4 text-SUIT_24 font-medium text-black">
ν™˜μ˜ν•©λ‹ˆλ‹€!{" "}
Expand Down
2 changes: 1 addition & 1 deletion src/app/search/[query]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ export default function SearchResultPage() {
}, [searchParams]); // searchParamsκ°€ 변경될 λ•Œλ§ˆλ‹€ μ‹€ν–‰

return (
<div className="flex min-h-screen justify-center bg-gray-100">
<div className="flex min-h-screen justify-center bg-white">
<ScrollToTopOnLoad />
<PageContainer width="wide" className="min-h-screen bg-white px-5">
{/* 헀더 */}
Expand Down
4 changes: 2 additions & 2 deletions src/app/search/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ export default function SearchPage() {
const router = useRouter();

return (
<div className="flex min-h-screen justify-center bg-gray-100">
<div className="flex min-h-screen justify-center bg-white">
<ScrollToTopOnLoad />
<PageContainer width="wide" className="min-h-screen min-w-[386px] bg-white">
<PageContainer width="wide" className="min-h-screen bg-white">
<CommonHeader title="검색" rightType={RIGHT_ITEM.NONE} />
<div className="mb-1" />
<div className="px-2">
Expand Down
9 changes: 7 additions & 2 deletions src/components/layout/AppContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,20 @@ export type ContentWidth = keyof typeof CONTENT_WIDTH;
interface PageContainerProps extends ContainerProps {
// eslint-disable-next-line react/require-default-props
width?: ContentWidth;
// λ Œλ”ν•  μ‹œλ§¨ν‹± νƒœκ·Έ (κΈ°λ³Έ div). 리슀트 λ³Έλ¬Έ λ“±μ—μ„œ "main" 으둜 μ“Έ 수 μžˆλ‹€.
// eslint-disable-next-line react/require-default-props
as?: "div" | "main" | "section";
}

/**
* νŽ˜μ΄μ§€ λ³Έλ¬Έ μ»¨ν…Œμ΄λ„ˆ.
* ν™”λ©΄ 쀑앙 μ •λ ¬ + μ½˜ν…μΈ  성격별 폭. νŽ˜μ΄μ§€λŠ” 폭을 직접 μ‹ κ²½ μ“°μ§€ μ•Šκ³  이 μ»΄ν¬λ„ŒνŠΈλ‘œ 감싼닀.
* width: "narrow"(λ³Έλ¬Έ/폼) | "wide"(리슀트/ν™ˆ) | "legacy"(κΈ°μ‘΄ 640/960, κΈ°λ³Έκ°’).
* as: μ‹œλ§¨ν‹± νƒœκ·Έ μ§€μ •(div|main|section, κΈ°λ³Έ div).
*/
export function PageContainer({ children, className = "", width = "legacy" }: PageContainerProps) {
return <div className={`relative mx-auto w-full ${CONTENT_WIDTH[width]} ${className}`}>{children}</div>;
export function PageContainer({ children, className = "", width = "legacy", as = "div" }: PageContainerProps) {
const Tag = as;
return <Tag className={`relative mx-auto w-full ${CONTENT_WIDTH[width]} ${className}`}>{children}</Tag>;
}

/**
Expand Down
4 changes: 2 additions & 2 deletions src/components/login/LoginForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,8 @@ export default function LoginForm({ onShowLoading = () => {}, onShowSuccess, onH
)}
</div>

{/* 둜그인 제좜 λ²„νŠΌ */}
<div className="mb-10 mt-auto">
{/* 둜그인 제좜 λ²„νŠΌ β€” λͺ¨λ°”일: ν™”λ©΄ λ°”λ‹₯ λ°€μ°©(mt-auto), PC μΉ΄λ“œ: 폼 흐름에 μžμ—° 배치 */}
<div className="mb-10 mt-auto lg:mb-0 lg:mt-12">
<button
type="submit"
className={`w-full rounded-md py-4 text-SUIT_16 font-extrabold text-white ${
Expand Down
6 changes: 3 additions & 3 deletions version.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,14 @@
# - project_type은 졜초 μ„€μ • ν›„ λ³€κ²½ν•˜μ§€ λ§ˆμ„Έμš”
# - 버전은 항상 높은 λ²„μ „μœΌλ‘œ μžλ™ λ™κΈ°ν™”λ©λ‹ˆλ‹€
# ===================================================================
version: "0.1.53"
version_code: 2 # app build number
version: "0.1.54"
version_code: 3 # app build number
project_types: ["react"] # λ©€ν‹°νƒ€μž… λ°°μ—΄ β€” 첫 ν•­λͺ©μ΄ primary, 직접 νŽΈμ§‘ κ°€λŠ₯
project_type: "react" # project_types[0] μžλ™ 미러 β€” 직접 μˆ˜μ • κΈˆμ§€ (spring, flutter, next, react, react-native, react-native-expo, node, python, basic)
project_paths: # νƒ€μž…λ³„ ν”„λ‘œμ νŠΈ 폴더 (레포 루트 κΈ°μ€€ μƒλŒ€κ²½λ‘œ)
react: "." # package.json
metadata:
last_updated: "2026-06-18 05:55:48"
last_updated: "2026-06-18 07:42:35"
last_updated_by: "Cassiiopeia"
default_branch: "main"
integrated_from: "SUH-DEVOPS-TEMPLATE"
Expand Down