Skip to content

[feat] 총동아리 페이지 리디자인 및 하단 오버레이 정리#249

Merged
ff1451 merged 5 commits intodevelopfrom
247-feat-총동아리-페이지-리디자인-반영
Mar 31, 2026

Hidden character warning

The head ref may contain hidden characters: "247-feat-\ucd1d\ub3d9\uc544\ub9ac-\ud398\uc774\uc9c0-\ub9ac\ub514\uc790\uc778-\ubc18\uc601"
Merged

[feat] 총동아리 페이지 리디자인 및 하단 오버레이 정리#249
ff1451 merged 5 commits intodevelopfrom
247-feat-총동아리-페이지-리디자인-반영

Conversation

@ff1451
Copy link
Copy Markdown
Collaborator

@ff1451 ff1451 commented Mar 31, 2026

✨ 요약

  • 총동아리 소개/공지 페이지를 피그마 기준으로 리디자인했습니다.
  • 공지 상세용 평면 서브페이지 헤더를 추가하고 헤더 구조를 정리했습니다.
  • bottom nav overlay 대응을 공용화해 페이지별 하단 여백 처리를 통일했습니다.

변경 사항

  • 총동아리 소개/공지 탭 레이아웃, 카드 스타일, 공지 리스트/상세 디자인 반영
  • /council 경로를 bottom nav 레이아웃으로 이동하고 홈 탭 활성 경로 확장
  • BackTitleHeader, PlainSubpageHeader를 추가해 공지 상세 헤더 구성 정리
  • SVG 아이콘을 currentColor 기반으로 통일
  • bottomOverlay, BottomOverlaySpacer 중심으로 하단 오버레이 계산/표현 공용화

😎 해결한 이슈

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 하단 전체 스페이서 추가로 페이지 하단 간격이 일관되게 적용됩니다.
    • 하위 페이지용 새 헤더 레이아웃 추가(뒤로 가기 버튼 및 제목 표시).
  • Refactor

    • 의회 관련 페이지 라우트 및 네비게이션 배치 조정으로 탐색 흐름 개선.
    • 의회 상세·공지·소개 페이지 레이아웃·타이포그래피 및 빈 상태 UI 개선.
    • 여러 페이지(알림, 채팅, 관리자 등)에 하단 간격 적용 방식 통합.
  • Bug Fixes

    • 하단 네비게이션의 홈 선택 상태가 관련 경로에서 보다 정확히 표시됩니다.

@ff1451 ff1451 linked an issue Mar 31, 2026 that may be closed by this pull request
2 tasks
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 31, 2026

Warning

Rate limit exceeded

@ff1451 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 2 minutes and 22 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 2 minutes and 22 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 951932fb-a860-47c3-b65c-5dd4be6f7f3c

📥 Commits

Reviewing files that changed from the base of the PR and between 4d799b9 and 85c5617.

📒 Files selected for processing (7)
  • src/components/layout/BottomNav/index.tsx
  • src/components/layout/Header/components/PlainSubpageHeader.tsx
  • src/components/layout/Header/components/SubpageHeader.tsx
  • src/components/layout/Header/index.tsx
  • src/components/layout/Header/types.ts
  • src/pages/Council/CouncilDetail/components/CouncilIntro.tsx
  • src/pages/Council/CouncilDetail/index.tsx

Walkthrough

council 관련 라우트 서브트리(index → CouncilDetail, notice/:noticeId → CouncilNotice)를 src/App.tsx에서 <Layout /> 분기에서 <Layout showBottomNav /> 분기로 이동시켰습니다. 하단 오버레이 간격 관리가 중앙화되어 BottomOverlaySpacer 컴포넌트와 useBottomOverlayOffset 훅이 추가/적용되었고, 헤더 시스템에 BackTitleHeader, PlainSubpageHeader와 새로운 subpage 헤더 타입 및 공지사항 경로 매칭/타이틀이 추가되었습니다. 여러 Council 페이지들(CouncilDetail, CouncilNotice 등)에 UI/레이아웃 클래스 및 하단 스페이서 변경이 반영되었습니다.

Possibly related PRs

🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 주요 변경사항을 명확하게 요약합니다: 총동아리 페이지 리디자인과 하단 오버레이 정리.
Linked Issues check ✅ Passed PR은 linked issue #247의 두 가지 목표(총동 상세페이지, 공지사항 페이지 구현)를 모두 충족합니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 총동아리 리디자인과 하단 오버레이 통일화 범위 내에 있습니다.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch 247-feat-총동아리-페이지-리디자인-반영

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@ff1451 ff1451 marked this pull request as ready for review March 31, 2026 03:52
@ff1451 ff1451 self-assigned this Mar 31, 2026
@ff1451 ff1451 requested a review from Copilot March 31, 2026 03:53
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

총동아리( /council ) 소개/공지 UI를 피그마 기준으로 리디자인하고, 하단 bottom nav overlay(안전영역 포함) 대응을 공용화하며, 공지 상세용 헤더 타입을 추가한 PR입니다.

Changes:

  • 총동아리 소개/공지 탭 및 공지 리스트/상세 화면 스타일 전면 리디자인
  • /council 경로를 bottom nav 레이아웃으로 이동하고, 홈 탭 활성 경로를 /council*까지 확장
  • bottom overlay 계산을 bottomOverlay + BottomOverlaySpacer로 공용화하고 헤더 구성(BackTitleHeader / PlainSubpageHeader) 정리

Reviewed changes

Copilot reviewed 21 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/pages/Notifications/index.tsx 알림 리스트 하단 여백을 BottomOverlaySpacer로 공용 처리
src/pages/Manager/components/ApplicationDetailContent.tsx 스크롤 영역 하단 padding을 useBottomOverlayOffset 기반으로 변경
src/pages/Council/CouncilNotice/index.tsx 공지 상세 레이아웃 리디자인 + 하단 overlay spacer 추가
src/pages/Council/CouncilDetail/index.tsx 총동 페이지 탭 UI/배경 구성 리디자인 + 하단 spacer 적용
src/pages/Council/CouncilDetail/components/CouncilNotice.tsx 공지 리스트 카드 스타일/빈 상태 리디자인 및 sentinel 수정
src/pages/Council/CouncilDetail/components/CouncilIntro.tsx 소개/연락처 카드 리디자인 및 아이콘/링크 구조 변경
src/pages/Chat/index.tsx 하단 여백 처리 로직을 BottomOverlaySpacer로 치환
src/components/notification/InAppNotificationToast.tsx 토스트 bottom offset 계산을 useBottomOverlayOffset로 공용화
src/components/layout/hooks/useLayoutBottomOverlayInset.ts inset 계산 import를 bottomOverlay로 이동
src/components/layout/Header/types.ts 헤더 타입에 subpage 추가
src/components/layout/Header/routeTitles.ts /council/notice/:id 타이틀 매핑 추가
src/components/layout/Header/index.tsx subpage 타입 렌더러(PlainSubpageHeader) 추가
src/components/layout/Header/headerConfig.ts /council 헤더 타입 조정 + 공지 상세 subpage 타입 추가
src/components/layout/Header/components/SubpageHeader.tsx 공통 BackTitleHeader로 리팩터링
src/components/layout/Header/components/PlainSubpageHeader.tsx 공지 상세용 간소 헤더 신규 추가
src/components/layout/Header/components/CouncilHeader.tsx 기존 CouncilHeader 제거
src/components/layout/Header/components/BackTitleHeader.tsx 뒤로가기+타이틀 공통 헤더 컴포넌트 신규 추가
src/components/layout/BottomOverlaySpacer.tsx bottom overlay 대응 spacer 컴포넌트 신규 추가
src/components/layout/bottomOverlay.ts bottom overlay inset/offset 유틸 및 hook 공용화
src/components/layout/BottomNav/index.tsx 홈 탭 활성 경로를 /council*까지 확장
src/assets/svg/location-pin.svg 아이콘 stroke를 currentColor 기반으로 변경
src/assets/svg/instagram.svg 아이콘 fill을 currentColor 기반으로 변경
src/assets/svg/clock.svg 아이콘 stroke를 currentColor 기반으로 변경
src/App.tsx /council 라우트를 bottom nav 레이아웃 그룹으로 이동

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/pages/Chat/index.tsx Outdated
Comment thread src/pages/Council/CouncilDetail/components/CouncilIntro.tsx Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (9)
src/pages/Council/CouncilDetail/components/CouncilNotice.tsx (3)

34-34: 시맨틱 타이포그래피 토큰 사용 고려

text-[14px], text-[12px] 대신 text-body2, text-cap1 등 시맨틱 토큰 사용을 검토해주세요.

Also applies to: 39-39

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Council/CouncilDetail/components/CouncilNotice.tsx` at line 34, The
component CouncilNotice.tsx uses hardcoded utility font sizes (e.g., class names
text-[14px] and text-[12px]) which should be replaced with semantic typography
tokens; update the className strings in the CouncilNotice React component to use
the design-system tokens (for example text-body2, text-cap1 or whatever semantic
tokens are available) instead of text-[14px]/text-[12px], ensuring you adjust
any leading/weight classes only if the semantic token does not already include
them so visual parity is preserved.

30-30: 동일하게 cn() 적용 필요

Line 18과 마찬가지로 cn() 사용을 권장합니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Council/CouncilDetail/components/CouncilNotice.tsx` at line 30, The
div is using className={noticeListCardClassName} but should consistently use the
utility wrapper cn(); update the JSX in CouncilNotice (the element that
currently uses noticeListCardClassName) to pass the same value through cn()
(e.g., className={cn(noticeListCardClassName)}) so it matches Line 18’s pattern
and supports conditional/combined classes uniformly.

18-18: cn() 유틸리티 사용 권장

동적 className 조합 시 cn() 사용이 코딩 가이드라인입니다.

♻️ 제안
-      <div className={`${noticeListCardClassName} px-5 py-16`}>
+      <div className={cn(noticeListCardClassName, 'px-5 py-16')}>

cn import 추가 필요:

import { cn } from '@/utils/ts/cn';
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Council/CouncilDetail/components/CouncilNotice.tsx` at line 18, The
JSX currently builds a dynamic className with a template literal on the div
using noticeListCardClassName; replace that template literal with the cn()
helper and add the cn import (import { cn } from '@/utils/ts/cn') at the top of
the CouncilNotice component file so the div uses cn(noticeListCardClassName,
'px-5', 'py-16') instead of the string template.
src/pages/Council/CouncilDetail/components/CouncilIntro.tsx (1)

36-36: cn() 사용 권장

className 조합 시 cn() 유틸리티 사용이 권장됩니다.

♻️ 제안
-          className={`${contactItemClassName} underline`}
+          className={cn(contactItemClassName, 'underline')}

cn import 추가:

import { cn } from '@/utils/ts/cn';
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Council/CouncilDetail/components/CouncilIntro.tsx` at line 36,
Replace the string template className={`${contactItemClassName} underline`} with
the cn utility: import cn from '@/utils/ts/cn' (add the import) and use
cn(contactItemClassName, 'underline') in the component (referencing the existing
contactItemClassName variable) so class composition uses the cn helper.
src/components/layout/BottomNav/index.tsx (1)

25-29: 경로 매칭 로직 단순화 가능

현재 코드에서 pathname === '/council'pathname.startsWith('/council')에 포함되므로 중복된 조건입니다. App.tsx의 라우트 구조(/council, /council/notice/:noticeId)를 확인했을 때, 다음과 같이 단순화해도 안전합니다.

♻️ 제안
     matchesPath: (pathname) =>
       pathname === '/home' ||
       pathname === '/notifications' ||
-      pathname === '/council' ||
-      pathname.startsWith('/council/'),
+      pathname.startsWith('/council'),
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/layout/BottomNav/index.tsx` around lines 25 - 29, The
matchesPath function has a redundant condition: `pathname === '/council'` is
covered by `pathname.startsWith('/council/')` or
`pathname.startsWith('/council')`; update matchesPath to remove the duplicate
check and keep the simplified logic (e.g., use pathname.startsWith('/council')
for council routes) in the matchesPath arrow function so it still correctly
matches '/council' and subroutes while eliminating the redundant equality check.
src/components/layout/Header/components/PlainSubpageHeader.tsx (1)

1-1: @/* 경로 별칭으로 import 통일해주세요.

신규 파일이라 지금 맞춰두면 이후 정리 비용이 줄어듭니다.

변경 제안
-import BackTitleHeader from './BackTitleHeader';
+import BackTitleHeader from '@/components/layout/Header/components/BackTitleHeader';

As per coding guidelines, **/*.{ts,tsx}: Use path alias @/* for imports instead of relative paths.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/layout/Header/components/PlainSubpageHeader.tsx` at line 1,
The file imports BackTitleHeader using a relative path; change that import to
use the project path-alias (`@/*`) instead of a relative path so imports are
consistent; locate the import statement for BackTitleHeader in
PlainSubpageHeader.tsx and replace it with the equivalent alias-based import
(using the project's `@/` prefix) to match the coding guidelines.
src/components/layout/Header/components/SubpageHeader.tsx (1)

3-3: 상대 경로 대신 alias import로 맞춰주세요.

이 파일은 내부 import를 @/*로 통일하고 있는데 여기만 sibling 상대 경로로 돌아가 있습니다. @/components/layout/Header/components/BackTitleHeader로 맞추는 편이 일관됩니다.

As per coding guidelines, **/*.{ts,tsx}: Use path alias @/* for imports instead of relative paths.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/layout/Header/components/SubpageHeader.tsx` at line 3,
SubpageHeader.tsx currently imports BackTitleHeader using a sibling relative
path; change that import to the project path alias so it matches the rest of the
codebase: replace the relative import of BackTitleHeader with an alias import
like "@/components/layout/Header/components/BackTitleHeader" ensuring the symbol
BackTitleHeader is referenced exactly the same and that any TypeScript/ESLint
import rules still pass after the change.
src/components/layout/Header/headerConfig.ts (1)

12-15: council 헤더 타입은 이제 도달하지 않습니다.

/councilinfo로 흡수되면서 HEADER_CONFIGS에서 council을 반환할 경로가 없어졌는데, src/components/layout/Header/index.tsx:18-32src/components/layout/Header/types.ts:3-16에는 아직 council 렌더러/유니온이 남아 있습니다. 같이 정리해 두는 편이 다음 변경 때 덜 헷갈립니다.

Also applies to: 26-26

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/layout/Header/headerConfig.ts` around lines 12 - 15, The
'council' header case is now unreachable but remnants remain; remove all
'council' references: delete the council entry from HEADER_CONFIGS (the object
with type: 'subpage' and the /^\/council\/notice\/\d+$/ match), remove the
'council' branch/renderer in the Header component
(src/components/layout/Header/index.tsx) and remove 'council' from the
HeaderType union in src/components/layout/Header/types.ts so the configs,
renderer mapping and types stay consistent.
src/pages/Council/CouncilDetail/index.tsx (1)

28-31: 배경 스타일 상수는 공통 토큰으로 맞춰주세요.

/councilinfo 헤더를 타는데 여기만 --subpage-header-height#f4f6f9를 직접 쓰면 헤더 높이/배경 토큰 변경 때 그라데이션 시작점이 쉽게 어긋납니다. 실제 레이아웃 높이 값과 theme.css 토큰을 참조하는 쪽이 안전합니다.

As per coding guidelines, **/*.{ts,tsx,css}: Use Tailwind CSS v4 with design tokens from src/styles/theme.css.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Council/CouncilDetail/index.tsx` around lines 28 - 31, The
backgroundStyle constant uses a hardcoded color (`#f4f6f9`) instead of the
project's theme tokens; update backgroundStyle (which references
councilInfo.personalColor and uses CSSProperties) to pull the gradient stop
colors from the design tokens in src/styles/theme.css (e.g., replace the
hardcoded "#f4f6f9" with the appropriate CSS variable like
var(--<background-token>) and keep the existing var(--subpage-header-height)
usage for top), ensuring the gradient aligns with the shared theme tokens and
retains the satisfies CSSProperties clause.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/pages/Council/CouncilDetail/index.tsx`:
- Around line 47-72: Replace the current toggle-button semantics with proper tab
semantics: add role="tablist" to the container rendering tabs (the div that maps
over tabs), change each button rendered in the tabs.map to role="tab" with
aria-selected={currentTab === tab.key} (remove aria-pressed), give each tab a
stable id like `tab-${tab.key}` and keep using handleTabClick(tab.key); then
ensure each panel wrapped by Activity (the CouncilIntro and CouncilNotice
renders) has role="tabpanel", an id like `panel-${tab.key}` and aria-labelledby
pointing to its corresponding tab id so tab and panel are linked; use tab.key to
generate unique ids consistently and keep currentTab logic unchanged.

---

Nitpick comments:
In `@src/components/layout/BottomNav/index.tsx`:
- Around line 25-29: The matchesPath function has a redundant condition:
`pathname === '/council'` is covered by `pathname.startsWith('/council/')` or
`pathname.startsWith('/council')`; update matchesPath to remove the duplicate
check and keep the simplified logic (e.g., use pathname.startsWith('/council')
for council routes) in the matchesPath arrow function so it still correctly
matches '/council' and subroutes while eliminating the redundant equality check.

In `@src/components/layout/Header/components/PlainSubpageHeader.tsx`:
- Line 1: The file imports BackTitleHeader using a relative path; change that
import to use the project path-alias (`@/*`) instead of a relative path so
imports are consistent; locate the import statement for BackTitleHeader in
PlainSubpageHeader.tsx and replace it with the equivalent alias-based import
(using the project's `@/` prefix) to match the coding guidelines.

In `@src/components/layout/Header/components/SubpageHeader.tsx`:
- Line 3: SubpageHeader.tsx currently imports BackTitleHeader using a sibling
relative path; change that import to the project path alias so it matches the
rest of the codebase: replace the relative import of BackTitleHeader with an
alias import like "@/components/layout/Header/components/BackTitleHeader"
ensuring the symbol BackTitleHeader is referenced exactly the same and that any
TypeScript/ESLint import rules still pass after the change.

In `@src/components/layout/Header/headerConfig.ts`:
- Around line 12-15: The 'council' header case is now unreachable but remnants
remain; remove all 'council' references: delete the council entry from
HEADER_CONFIGS (the object with type: 'subpage' and the
/^\/council\/notice\/\d+$/ match), remove the 'council' branch/renderer in the
Header component (src/components/layout/Header/index.tsx) and remove 'council'
from the HeaderType union in src/components/layout/Header/types.ts so the
configs, renderer mapping and types stay consistent.

In `@src/pages/Council/CouncilDetail/components/CouncilIntro.tsx`:
- Line 36: Replace the string template className={`${contactItemClassName}
underline`} with the cn utility: import cn from '@/utils/ts/cn' (add the import)
and use cn(contactItemClassName, 'underline') in the component (referencing the
existing contactItemClassName variable) so class composition uses the cn helper.

In `@src/pages/Council/CouncilDetail/components/CouncilNotice.tsx`:
- Line 34: The component CouncilNotice.tsx uses hardcoded utility font sizes
(e.g., class names text-[14px] and text-[12px]) which should be replaced with
semantic typography tokens; update the className strings in the CouncilNotice
React component to use the design-system tokens (for example text-body2,
text-cap1 or whatever semantic tokens are available) instead of
text-[14px]/text-[12px], ensuring you adjust any leading/weight classes only if
the semantic token does not already include them so visual parity is preserved.
- Line 30: The div is using className={noticeListCardClassName} but should
consistently use the utility wrapper cn(); update the JSX in CouncilNotice (the
element that currently uses noticeListCardClassName) to pass the same value
through cn() (e.g., className={cn(noticeListCardClassName)}) so it matches Line
18’s pattern and supports conditional/combined classes uniformly.
- Line 18: The JSX currently builds a dynamic className with a template literal
on the div using noticeListCardClassName; replace that template literal with the
cn() helper and add the cn import (import { cn } from '@/utils/ts/cn') at the
top of the CouncilNotice component file so the div uses
cn(noticeListCardClassName, 'px-5', 'py-16') instead of the string template.

In `@src/pages/Council/CouncilDetail/index.tsx`:
- Around line 28-31: The backgroundStyle constant uses a hardcoded color
(`#f4f6f9`) instead of the project's theme tokens; update backgroundStyle (which
references councilInfo.personalColor and uses CSSProperties) to pull the
gradient stop colors from the design tokens in src/styles/theme.css (e.g.,
replace the hardcoded "#f4f6f9" with the appropriate CSS variable like
var(--<background-token>) and keep the existing var(--subpage-header-height)
usage for top), ensuring the gradient aligns with the shared theme tokens and
retains the satisfies CSSProperties clause.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: f884f407-455d-4235-a8bd-6c14066111e8

📥 Commits

Reviewing files that changed from the base of the PR and between a5667d7 and 46f5942.

⛔ Files ignored due to path filters (3)
  • src/assets/svg/clock.svg is excluded by !**/*.svg, !src/assets/** and included by **
  • src/assets/svg/instagram.svg is excluded by !**/*.svg, !src/assets/** and included by **
  • src/assets/svg/location-pin.svg is excluded by !**/*.svg, !src/assets/** and included by **
📒 Files selected for processing (21)
  • src/App.tsx
  • src/components/layout/BottomNav/index.tsx
  • src/components/layout/BottomOverlaySpacer.tsx
  • src/components/layout/Header/components/BackTitleHeader.tsx
  • src/components/layout/Header/components/CouncilHeader.tsx
  • src/components/layout/Header/components/PlainSubpageHeader.tsx
  • src/components/layout/Header/components/SubpageHeader.tsx
  • src/components/layout/Header/headerConfig.ts
  • src/components/layout/Header/index.tsx
  • src/components/layout/Header/routeTitles.ts
  • src/components/layout/Header/types.ts
  • src/components/layout/bottomOverlay.ts
  • src/components/layout/hooks/useLayoutBottomOverlayInset.ts
  • src/components/notification/InAppNotificationToast.tsx
  • src/pages/Chat/index.tsx
  • src/pages/Council/CouncilDetail/components/CouncilIntro.tsx
  • src/pages/Council/CouncilDetail/components/CouncilNotice.tsx
  • src/pages/Council/CouncilDetail/index.tsx
  • src/pages/Council/CouncilNotice/index.tsx
  • src/pages/Manager/components/ApplicationDetailContent.tsx
  • src/pages/Notifications/index.tsx
💤 Files with no reviewable changes (1)
  • src/components/layout/Header/components/CouncilHeader.tsx

Comment thread src/pages/Council/CouncilDetail/index.tsx Outdated
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (2)
src/pages/Council/CouncilDetail/components/CouncilIntro.tsx (2)

1-1: className 결합은 cn()으로 통일해주세요.

Line 36은 템플릿 문자열 대신 cn() 사용이 가이드와 맞습니다.

diff 제안
 import type { ComponentType, ReactNode, SVGProps } from 'react';
 import type { CouncilResponse } from '@/apis/council/entity';
 
 import ClockIcon from '@/assets/svg/clock.svg';
 import InstagramIcon from '@/assets/svg/instagram.svg';
 import LocationPinIcon from '@/assets/svg/location-pin.svg';
 import Card from '@/components/common/Card';
+import { cn } from '@/utils/ts/cn';
@@
-          className={`${contactItemClassName} underline`}
+          className={cn(contactItemClassName, 'underline')}

As per coding guidelines, "Use cn() utility from src/utils/ts/cn.ts to merge Tailwind CSS classes".

Also applies to: 36-36

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Council/CouncilDetail/components/CouncilIntro.tsx` at line 1, 현재
CouncilIntro 컴포넌트에서 Tailwind 클래스 결합을 템플릿 문자열로 하고 있는데 가이드에 따라 src/utils/ts/cn.ts의
cn() 유틸로 통일해야 합니다; CouncilIntro 컴포넌트 내 클래스 결합을 담당하는 부분(현재 template string 사용되는
className 표현)을 찾아 cn(...)로 교체하고, 파일 상단에 cn를 임포트하도록 업데이트하세요(기존 className 템플릿 문자열을
제거하고 cn 호출로 대체).

14-14: 타이포그래피는 semantic 토큰 클래스를 우선 사용해주세요.

Line 14의 text-[13px], Line 49의 text-xs, Line 55의 커스텀 조합은 text-body*/text-sub* 등 토큰 기반으로 맞추는 게 좋습니다.

As per coding guidelines, "Use typography tokens (text-h1 through text-h5, text-sub1 through text-sub4, text-body1 through text-body3, text-cap1 through text-cap2) from src/styles/theme.css".

Also applies to: 49-49, 55-55

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/Council/CouncilDetail/components/CouncilIntro.tsx` at line 14,
Replace hardcoded typography utility classes with the semantic typography tokens
defined in theme.css: update the const contactItemClassName (currently using
text-[13px]) to use the appropriate token (e.g., text-body1/text-sub2) and
replace the other occurrences of text-xs and the custom combination at the other
noted locations with the corresponding text-body*/text-sub* token classes;
ensure you pick tokens that match the intended size/weight/line-height so all
references (contactItemClassName and the JSX elements using text-xs and the
custom combo) follow the "text-h1..h5, text-sub1..sub4, text-body1..body3,
text-cap1..cap2" convention.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/pages/Council/CouncilDetail/components/CouncilIntro.tsx`:
- Line 1: 현재 CouncilIntro 컴포넌트에서 Tailwind 클래스 결합을 템플릿 문자열로 하고 있는데 가이드에 따라
src/utils/ts/cn.ts의 cn() 유틸로 통일해야 합니다; CouncilIntro 컴포넌트 내 클래스 결합을 담당하는 부분(현재
template string 사용되는 className 표현)을 찾아 cn(...)로 교체하고, 파일 상단에 cn를 임포트하도록
업데이트하세요(기존 className 템플릿 문자열을 제거하고 cn 호출로 대체).
- Line 14: Replace hardcoded typography utility classes with the semantic
typography tokens defined in theme.css: update the const contactItemClassName
(currently using text-[13px]) to use the appropriate token (e.g.,
text-body1/text-sub2) and replace the other occurrences of text-xs and the
custom combination at the other noted locations with the corresponding
text-body*/text-sub* token classes; ensure you pick tokens that match the
intended size/weight/line-height so all references (contactItemClassName and the
JSX elements using text-xs and the custom combo) follow the "text-h1..h5,
text-sub1..sub4, text-body1..body3, text-cap1..cap2" convention.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: df95f1a8-2e24-43fa-9662-7e0d2a8d472e

📥 Commits

Reviewing files that changed from the base of the PR and between 46f5942 and 4d799b9.

📒 Files selected for processing (2)
  • src/pages/Chat/index.tsx
  • src/pages/Council/CouncilDetail/components/CouncilIntro.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/pages/Chat/index.tsx

@ff1451 ff1451 merged commit 027f479 into develop Mar 31, 2026
2 checks passed
ff1451 added a commit that referenced this pull request Apr 1, 2026
* 205 feat 이미지 전처리 기능 구현 (#206)

* feat: 전처리 로직 및 WebWorker 구현

* feat: 전처리 적용 및 preview 동시성 제어 로직 추가

* refactor: 리뷰 반영

* [hotfix] 하단바 너비 수정 (#208)

* hotfix: 하단바 너비 수정

* chore: 불필요한 값 제거

* refactor: 고정 gap 제거

* Reapply "[feat] 광고 배너 추가 (#200)"

This reverts commit c51ec85.

* [feat] 하단바 리디자인 (#213)

* chore: asset 추가

* feat: 하단바 리디자인 반영 및 레이아웃 수정

* [refactor] 광고 카드 레이아웃 밀림 수정 (#215)

* refactor: 광고 개수 측정 시기 변경 및 기본값 제거

* feat: 스켈레톤 UI 추가

* feat: 인앱 알림 페이지 및 토스트 구현 (#217)

* feat: 알림 API 및 스트림 기반 추가

* feat: 인앱 알림 레이어 추가

* feat: 알림 페이지 및 헤더 진입 구현

* fix: 알림 스트림 401 재시도 조건 정리

* fix: 알림 목록 이동 차단 제거

* refactor: 알림 공용 훅 위치 정리

* fix: 알림 재연결 캐시 동기화 추가

* fix: 알림 목록 토스트 큐 누적 방지

* fix: 알림 읽음 카운트 감소 조건 보강

* [refactor] 도메인별 TanStack Query 훅 정리 (#219)

* chore: pwa용 이미지 제거

* refactor: auth 도메인 쿼리와 뮤테이션 정리

* refactor: council과 schedule 조회 훅 정리

* refactor: chat과 notification 캐시 처리 정리

* refactor: club 조회와 지원 플로우 정리

* refactor: manager 도메인 캐시 처리 정리

* refactor: studyTime 도메인 쿼리와 뮤테이션 정리

* refactor: 광고와 업로드 도메인 훅 정리

* [refactor] mutaton query 및 hook 추가 수정 (#221)

* refactor: auth와 user myInfo 훅 정리

* refactor: club과 schedule 조회 훅 정리

* refactor: chat과 notification 훅 구조 정리

* refactor: club 지원 뮤테이션 훅 정리

* refactor: manager 뮤테이션 훅 구조 정리

* refactor: mutation 훅 cache 정리

* refactor: 컨벤션 통일

* refactor: isRead 조건 정리

* fix: 채팅 스크롤 문제 수정

* refactor: 불필요한 코드 제거

* [fix] 모바일 환경 입력창과 키보드 간의 간격이 큰 문제 수정 (#223)

* chore: 가공용 safeArea 변수 선언

* refactor: 고정 패딩 값 수정 및 safeArea 적용 변경

* feat: 키보드 활성화 감지 및 safeArea 적용 여부 기능 추가

* refactor: 매직넘버 상수화 및 가로모드 처리

* [fix] 키보드 활성화 시 화면 흔들림 문제 수정 (#225)

* refactor: 채팅 viewport 훅 네이밍 정리

* refactor: viewport 높이 잠금 훅 적용 시점 조정

* [fix] 키보드 활성화 시 채팅 화면 전체가 흔들리는 문제 수정 (#227)

* refactor: 채팅 viewport 훅 네이밍 정리

* refactor: viewport 높이 잠금 훅 적용 시점 조정

* fix: 채팅 화면 스크롤 잠금으로 키보드 흔들림 완화

* fix: 입력 포커스 중 viewport offset 고정 (#229)

* fix: 문서 루트 스크롤 잠금으로 빈 공간 잔류 방지 (#232)

* [fix] 키보드 활성화 시 채팅 화면 상단 고정이 깨지고 빈 공간이 남는 문제 수정 (#234)

* fix: 채팅 화면 상단 고정 깨짐과 빈 공간 잔류 수정

* refactor: 라우트 조건 수정

* fix: 문서 스크롤 위치 감지 보강

* refactor: 입력 요소 판별 유틸과 스크롤 주석 정리

* [fix] 키보드 활성화 시 채팅 화면에서 문서 스크롤이 발생하는 문제 수정 (#236)

* fix: 채팅 문서 스크롤 제스처 차단

* fix: 입력 요소 터치 동작 예외 처리

* [fix] 키보드 활성화 시 채팅방이 마지막 메시지 위치를 유지하지 못하는 문제 수정 (#238)

* fix: 키보드 활성화 시 채팅 하단 정렬 유지

* refactor: 채팅 리사이즈 관찰 안정화

* fix: mypage 연계 약관 페이지 뒤로가기 수정 (#240)

* refactor: alias import 경로 정리

* fix: query 설정과 suspense 분기 정리

* refactor: 관리자 화면 스타일 유틸 정리

* fix: 이미지 전처리 예외 처리 보강

* fix: 헤더와 회비 화면 동작 정리

* fix: 공통 유틸 안정성 개선

* fix: 이미지 전처리 실패 처리를 보정

* fix: 모집 공고 저장 후 설정 반영 순서 조정

* fix: 부원 직책 변경 실패 처리를 보강

* fix: 약관 링크 접근성을 개선

* fix: 공통 쿼리와 유틸 안정성을 보완

* [feat] 동적 버전 정보 표시 구현 (#211)

* feat: 동적 버전 정보 표시 구현

* refactor: 버전 정보 미 존재시 v 표시 제거

* [feat] 메인화면 동아리 카드 디자인 수정 반영 (#242)

* feat: 메인화면 동아리 카드 디자인 수정

* chore: 하단바 아이콘 수정

* refactor: 코드래빗 리뷰 반영

* refactor: and 연산자로 변경

* apiClient 코드 중복 제거 및 네이티브 브릿지 인증 동기화 중앙화 (#244)

* refactor: apiClient 코드 중복 제거 및 네이티브 브릿지 인증 동기화 중앙화

* refactor: body 직렬화 가드를 plain object/array로 한정

* fix: body 읽기 중 AbortError가 ParseError로 오분류되는 문제 수정

* [refactor] 에러 처리 유틸 및 utils 구조 정리 (#246)

* refactor: 에러 처리 유틸 및 공통 토스트 흐름 정리

* refactor: utils 폴더 구조를 역할별로 정리

* refactor: 코드래빗 리뷰 반영

* refactor: 코드래빗 리뷰 반영

* Update src/pages/Home/components/HomeClubSection.tsx

* fix: 인증 세션 복구 흐름 정리

* fix: 홈 동아리 카드 레이아웃 정리

* [feat] 총동아리 페이지 리디자인 및 하단 오버레이 정리 (#249)

* refactor: 하단 오버레이 처리 공통화

* feat: 총동아리 페이지와 헤더 리디자인 반영

* fix: 채팅 하단 여백과 외부 링크 속성 수정

* refactor: 총동아리 헤더 설정 정리

* fix: 총동아리 상세 접근성과 스타일 보완

* [feat] 마이페이지 관리자 카드 분리 및 채팅 미확인 배지 반영 (#251)

* feat: 하단 채팅 배지 표시 및 조회 조건 보완

* refactor: 관리자 정보 카드 컴포넌트 분리

* feat: 채팅 페이지 리디자인 (#252)

* feat: 채팅 페이지 리디자인

* fix:tailwind 문법 수정

* fix: 코드 수정

* fix: 폰트 색상 및 위치 수정

* fix: 채팅방 사람수 정렬

* fix: 오타 수정

* chore: conflict 해결 중 누락된 부분 수정

* [refactor] 광고 렌더링 조건 수정 (#254)

* refactor: 광고 렌더링 조건 수정

* docs: 문서명 변경

---------

Co-authored-by: 박성주 <145267904+ParkSungju01@users.noreply.github.com>
@ff1451 ff1451 deleted the 247-feat-총동아리-페이지-리디자인-반영 branch April 7, 2026 09:32
ff1451 added a commit that referenced this pull request Apr 21, 2026
* [배포] 이미지 전처리, 광고 기능, 하단바 리디자인, 인앱 알림 페이지 및 토스트 프로덕션 배포 (#230)

* 205 feat 이미지 전처리 기능 구현 (#206)

* feat: 전처리 로직 및 WebWorker 구현

* feat: 전처리 적용 및 preview 동시성 제어 로직 추가

* refactor: 리뷰 반영

* [hotfix] 하단바 너비 수정 (#208)

* hotfix: 하단바 너비 수정

* chore: 불필요한 값 제거

* refactor: 고정 gap 제거

* Reapply "[feat] 광고 배너 추가 (#200)"

This reverts commit c51ec85.

* [feat] 하단바 리디자인 (#213)

* chore: asset 추가

* feat: 하단바 리디자인 반영 및 레이아웃 수정

* [refactor] 광고 카드 레이아웃 밀림 수정 (#215)

* refactor: 광고 개수 측정 시기 변경 및 기본값 제거

* feat: 스켈레톤 UI 추가

* feat: 인앱 알림 페이지 및 토스트 구현 (#217)

* feat: 알림 API 및 스트림 기반 추가

* feat: 인앱 알림 레이어 추가

* feat: 알림 페이지 및 헤더 진입 구현

* fix: 알림 스트림 401 재시도 조건 정리

* fix: 알림 목록 이동 차단 제거

* refactor: 알림 공용 훅 위치 정리

* fix: 알림 재연결 캐시 동기화 추가

* fix: 알림 목록 토스트 큐 누적 방지

* fix: 알림 읽음 카운트 감소 조건 보강

* [refactor] 도메인별 TanStack Query 훅 정리 (#219)

* chore: pwa용 이미지 제거

* refactor: auth 도메인 쿼리와 뮤테이션 정리

* refactor: council과 schedule 조회 훅 정리

* refactor: chat과 notification 캐시 처리 정리

* refactor: club 조회와 지원 플로우 정리

* refactor: manager 도메인 캐시 처리 정리

* refactor: studyTime 도메인 쿼리와 뮤테이션 정리

* refactor: 광고와 업로드 도메인 훅 정리

* [refactor] mutaton query 및 hook 추가 수정 (#221)

* refactor: auth와 user myInfo 훅 정리

* refactor: club과 schedule 조회 훅 정리

* refactor: chat과 notification 훅 구조 정리

* refactor: club 지원 뮤테이션 훅 정리

* refactor: manager 뮤테이션 훅 구조 정리

* refactor: mutation 훅 cache 정리

* refactor: 컨벤션 통일

* refactor: isRead 조건 정리

* fix: 채팅 스크롤 문제 수정

* refactor: 불필요한 코드 제거

* [fix] 모바일 환경 입력창과 키보드 간의 간격이 큰 문제 수정 (#223)

* chore: 가공용 safeArea 변수 선언

* refactor: 고정 패딩 값 수정 및 safeArea 적용 변경

* feat: 키보드 활성화 감지 및 safeArea 적용 여부 기능 추가

* refactor: 매직넘버 상수화 및 가로모드 처리

* [fix] 키보드 활성화 시 화면 흔들림 문제 수정 (#225)

* refactor: 채팅 viewport 훅 네이밍 정리

* refactor: viewport 높이 잠금 훅 적용 시점 조정

* [fix] 키보드 활성화 시 채팅 화면 전체가 흔들리는 문제 수정 (#227)

* refactor: 채팅 viewport 훅 네이밍 정리

* refactor: viewport 높이 잠금 훅 적용 시점 조정

* fix: 채팅 화면 스크롤 잠금으로 키보드 흔들림 완화

* fix: 입력 포커스 중 viewport offset 고정 (#229)

* fix: 문서 루트 스크롤 잠금으로 빈 공간 잔류 방지 (#232)

* [fix] 키보드 활성화 시 채팅 화면 상단 고정이 깨지고 빈 공간이 남는 문제 수정 (#234)

* fix: 채팅 화면 상단 고정 깨짐과 빈 공간 잔류 수정

* refactor: 라우트 조건 수정

* fix: 문서 스크롤 위치 감지 보강

* refactor: 입력 요소 판별 유틸과 스크롤 주석 정리

* [fix] 키보드 활성화 시 채팅 화면에서 문서 스크롤이 발생하는 문제 수정 (#236)

* fix: 채팅 문서 스크롤 제스처 차단

* fix: 입력 요소 터치 동작 예외 처리

* [fix] 키보드 활성화 시 채팅방이 마지막 메시지 위치를 유지하지 못하는 문제 수정 (#238)

* fix: 키보드 활성화 시 채팅 하단 정렬 유지

* refactor: 채팅 리사이즈 관찰 안정화

* fix: mypage 연계 약관 페이지 뒤로가기 수정 (#240)

* refactor: alias import 경로 정리

* fix: query 설정과 suspense 분기 정리

* refactor: 관리자 화면 스타일 유틸 정리

* fix: 이미지 전처리 예외 처리 보강

* fix: 헤더와 회비 화면 동작 정리

* fix: 공통 유틸 안정성 개선

* fix: 이미지 전처리 실패 처리를 보정

* fix: 모집 공고 저장 후 설정 반영 순서 조정

* fix: 부원 직책 변경 실패 처리를 보강

* fix: 약관 링크 접근성을 개선

* fix: 공통 쿼리와 유틸 안정성을 보완

* [feat] 동적 버전 정보 표시 구현 (#211)

* feat: 동적 버전 정보 표시 구현

* refactor: 버전 정보 미 존재시 v 표시 제거

* [feat] 메인화면 동아리 카드 디자인 수정 반영 (#242)

* feat: 메인화면 동아리 카드 디자인 수정

* chore: 하단바 아이콘 수정

* refactor: 코드래빗 리뷰 반영

* refactor: and 연산자로 변경

* apiClient 코드 중복 제거 및 네이티브 브릿지 인증 동기화 중앙화 (#244)

* refactor: apiClient 코드 중복 제거 및 네이티브 브릿지 인증 동기화 중앙화

* refactor: body 직렬화 가드를 plain object/array로 한정

* fix: body 읽기 중 AbortError가 ParseError로 오분류되는 문제 수정

* [refactor] 에러 처리 유틸 및 utils 구조 정리 (#246)

* refactor: 에러 처리 유틸 및 공통 토스트 흐름 정리

* refactor: utils 폴더 구조를 역할별로 정리

* refactor: 코드래빗 리뷰 반영

* refactor: 코드래빗 리뷰 반영

* Update src/pages/Home/components/HomeClubSection.tsx

* fix: 인증 세션 복구 흐름 정리

* fix: 홈 동아리 카드 레이아웃 정리

* [feat] 총동아리 페이지 리디자인 및 하단 오버레이 정리 (#249)

* refactor: 하단 오버레이 처리 공통화

* feat: 총동아리 페이지와 헤더 리디자인 반영

* fix: 채팅 하단 여백과 외부 링크 속성 수정

* refactor: 총동아리 헤더 설정 정리

* fix: 총동아리 상세 접근성과 스타일 보완

* [feat] 마이페이지 관리자 카드 분리 및 채팅 미확인 배지 반영 (#251)

* feat: 하단 채팅 배지 표시 및 조회 조건 보완

* refactor: 관리자 정보 카드 컴포넌트 분리

* feat: 채팅 페이지 리디자인 (#252)

* feat: 채팅 페이지 리디자인

* fix:tailwind 문법 수정

* fix: 코드 수정

* fix: 폰트 색상 및 위치 수정

* fix: 채팅방 사람수 정렬

* fix: 오타 수정

* chore: conflict 해결 중 누락된 부분 수정

* [refactor] 광고 렌더링 조건 수정 (#254)

* refactor: 광고 렌더링 조건 수정

* docs: 문서명 변경

---------

Co-authored-by: 박성주 <145267904+ParkSungju01@users.noreply.github.com>

* refactor: 가이드 페이지 이미지 변경 및 구조 개선 (#260)

* hotfix: 가이드 이미지 경로 변경

---------

Co-authored-by: 박성주 <145267904+ParkSungju01@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 총동아리 페이지 리디자인 반영

2 participants