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
2 changes: 1 addition & 1 deletion src/app/dashboard/club/review/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,7 @@ export default function ClubReviewPage() {
maxLength={1000}
onChange={(e) => setReason(e.target.value)}
placeholder="예: 모임 장면이 보이는 사진을 추가해 주세요"
className="resize-y rounded-xl border border-admin-line bg-admin-base px-4 py-3 text-[14px] text-admin-ink outline-none focus:border-admin-accent"
className="resize-y rounded-xl border border-admin-line bg-admin-base px-4 py-3 text-[14px] mobile:text-base text-admin-ink outline-none focus:border-admin-accent"
/>
</label>
<div className="flex justify-end gap-2">
Expand Down
2 changes: 1 addition & 1 deletion src/app/dashboard/club/team/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ const STATE_CLASS: Record<ClubWeekState, string> = {
const CARD =
'flex flex-col gap-3 rounded-[20px] border border-admin-line-soft bg-admin-card p-[22px] shadow-admin'
const FIELD =
'resize-y rounded-xl border border-admin-line bg-admin-base px-4 py-3 text-[14px] text-admin-ink outline-none focus:border-admin-accent'
'resize-y rounded-xl border border-admin-line bg-admin-base px-4 py-3 text-[14px] mobile:text-base text-admin-ink outline-none focus:border-admin-accent'

/**
* 팀 상세·완주 확정 (C 담당). 계산상 미충족이어도 확정할 수 있다 — 확정 전에 한 번 더 묻는다.
Expand Down
2 changes: 1 addition & 1 deletion src/app/dashboard/core-applications/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -384,7 +384,7 @@ export default function DashboardCoreApplicationsPage() {

<section data-admin-reveal className={`${ADMIN_CONTAINER} pt-4`}>
<div className={ADMIN_TABLE_CARD}>
<table className="w-full border-collapse">
<table className="w-full min-w-max border-collapse">
<thead>
<tr>
{['이름', '학과 · 학번', '지원 팀', '상태', '제출 시각'].map((label) => (
Expand Down
6 changes: 3 additions & 3 deletions src/app/dashboard/core/attendance/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -526,7 +526,7 @@ export default function DashboardCoreAttendancePage() {
aria-label="추가할 일정 날짜"
value={newDate}
onChange={(e) => setNewDate(e.target.value)}
className="rounded-full border border-admin-line bg-admin-card px-3.5 py-1.5 text-[13px] text-admin-ink outline-none transition-colors duration-200 focus:border-admin-accent"
className="rounded-full border border-admin-line bg-admin-card px-3.5 py-1.5 text-[13px] mobile:text-base text-admin-ink outline-none transition-colors duration-200 focus:border-admin-accent"
/>
<button
type="button"
Expand Down Expand Up @@ -600,7 +600,7 @@ export default function DashboardCoreAttendancePage() {
</div>
</div>

<div data-admin-reveal>
<div data-admin-reveal className="min-w-0">
<div className="flex flex-wrap items-baseline justify-between gap-3">
<div>
<p className={ADMIN_CAPTION}>Members</p>
Expand All @@ -621,7 +621,7 @@ export default function DashboardCoreAttendancePage() {
</div>

<div className={`${ADMIN_TABLE_CARD} mt-3`}>
<table className="w-full border-collapse">
<table className="w-full min-w-max border-collapse">
<thead>
<tr>
{['이름', '팀', '상태', '최종 수정'].map((label) => (
Expand Down
14 changes: 10 additions & 4 deletions src/app/dashboard/events/applicants/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ export default function EventApplicantsPage() {
) : (
applicants.map((applicant) => (
<tr key={applicant.applicationId} className={ADMIN_TR}>
<td className={ADMIN_TD}>
<td className={`${ADMIN_TD} whitespace-nowrap`}>
{applicant.name}
{applicant.userId == null && (
<span className="ml-1.5 text-[12px] text-admin-ink-dim">(비로그인)</span>
Expand All @@ -252,9 +252,15 @@ export default function EventApplicantsPage() {
<span className="ml-1.5 text-[12px] text-admin-ink-dim">(취소)</span>
)}
</td>
<td className={ADMIN_TD_MUTED}>{applicant.studentId}</td>
<td className={ADMIN_TD_MUTED}>{formatMajorLabel(applicant.major)}</td>
<td className={ADMIN_TD_MUTED}>{formatDate(applicant.appliedAt)}</td>
<td className={`${ADMIN_TD_MUTED} whitespace-nowrap`}>
{applicant.studentId}
</td>
<td className={`${ADMIN_TD_MUTED} whitespace-nowrap`}>
{formatMajorLabel(applicant.major)}
</td>
<td className={`${ADMIN_TD_MUTED} whitespace-nowrap`}>
{formatDate(applicant.appliedAt)}
</td>
<td className={ADMIN_TD}>
<div className="flex items-center gap-1.5">
<select
Expand Down
2 changes: 1 addition & 1 deletion src/app/dashboard/events/form/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ const HEADER_LINKS = [
]

const INPUT =
'rounded-[10px] border border-admin-line bg-admin-card px-3 py-2 text-[14px] text-admin-ink outline-none transition-colors duration-200 focus:border-admin-accent'
'rounded-[10px] border border-admin-line bg-admin-card px-3 py-2 text-[14px] mobile:text-base text-admin-ink outline-none transition-colors duration-200 focus:border-admin-accent'

const LABEL = 'text-[12px] tracking-[0.06em] text-admin-ink-dim'

Expand Down
3 changes: 2 additions & 1 deletion src/app/dashboard/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import type { ReactNode } from 'react'

import ApiCodeGuard from '@/components/auth/ApiCodeGuard'
import { DASHBOARD_MIN_ROLE } from '@/utils/auth/role'

export default function DashboardLayout({ children }: { children: ReactNode }) {
return (
<ApiCodeGuard requiredRole="CORE" nextOverride="/dashboard">
<ApiCodeGuard requiredRole={DASHBOARD_MIN_ROLE} nextOverride="/dashboard">
{children}
</ApiCodeGuard>
)
Expand Down
2 changes: 1 addition & 1 deletion src/app/dashboard/members/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ export default function DashboardMembersPage() {

<section data-admin-reveal className={`${ADMIN_CONTAINER} pt-4`}>
<div className={ADMIN_TABLE_CARD}>
<table className="w-full border-collapse">
<table className="w-full min-w-max border-collapse">
<thead>
<tr>
{['이름', '학과 · 학번', '지원 학기', '제출 시각', '전화번호', '회비'].map(
Expand Down
4 changes: 2 additions & 2 deletions src/app/dashboard/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ export default function DashboardIndexPage() {
value={query}
onChange={(event) => setQuery(event.target.value)}
placeholder="페이지 검색 ( / 키로 이동 )"
className="min-w-0 flex-1 border-0 bg-transparent text-[15px] text-admin-ink outline-none"
className="min-w-0 flex-1 border-0 bg-transparent text-[15px] mobile:text-base text-admin-ink outline-none"
/>
</label>

Expand All @@ -262,7 +262,7 @@ export default function DashboardIndexPage() {
<select
value={effectiveRole}
onChange={(event) => setViewRole(event.target.value)}
className="cursor-pointer border-0 bg-transparent text-[15px] text-admin-ink outline-none"
className="cursor-pointer border-0 bg-transparent text-[15px] mobile:text-base text-admin-ink outline-none"
>
{roleOptions.map((role) => (
<option key={role} value={role} className="bg-admin-card text-admin-ink">
Expand Down
12 changes: 6 additions & 6 deletions src/app/dashboard/users/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ const SIBLING_SCREENS = [
const isTeamAssignableRole = (role: string) => role === 'CORE' || role === 'LEAD'

const selectClassName =
'w-full min-w-[96px] cursor-pointer rounded-[10px] border border-admin-line bg-admin-card px-2.5 py-2 text-[14px] text-admin-ink outline-none transition-colors duration-200 hover:border-admin-accent disabled:cursor-not-allowed disabled:opacity-40'
'w-full min-w-[96px] cursor-pointer rounded-[10px] border border-admin-line bg-admin-card px-2.5 py-2 text-[14px] mobile:text-base text-admin-ink outline-none transition-colors duration-200 hover:border-admin-accent disabled:cursor-not-allowed disabled:opacity-40'

const pillClassName =
'flex items-center gap-2.5 rounded-full border border-admin-line bg-admin-card px-4 py-2.5'
Expand Down Expand Up @@ -332,7 +332,7 @@ export default function DashboardUsersPage() {
}}
onBlur={runSearch}
placeholder="이름 · 이메일 · 학번 검색"
className="min-w-0 flex-1 border-0 bg-transparent text-[15px] text-admin-ink outline-none"
className="min-w-0 flex-1 border-0 bg-transparent text-[15px] mobile:text-base text-admin-ink outline-none"
/>
</label>

Expand All @@ -344,7 +344,7 @@ export default function DashboardUsersPage() {
setPage(1)
setRoleFilter(event.target.value)
}}
className="cursor-pointer border-0 bg-transparent text-[15px] text-admin-ink outline-none"
className="cursor-pointer border-0 bg-transparent text-[15px] mobile:text-base text-admin-ink outline-none"
>
<option value="ALL" className="bg-admin-card text-admin-ink">
전체
Expand All @@ -365,7 +365,7 @@ export default function DashboardUsersPage() {
setPage(1)
setTeamFilter(event.target.value)
}}
className="cursor-pointer border-0 bg-transparent text-[15px] text-admin-ink outline-none"
className="cursor-pointer border-0 bg-transparent text-[15px] mobile:text-base text-admin-ink outline-none"
>
<option value="ALL" className="bg-admin-card text-admin-ink">
전체
Expand Down Expand Up @@ -408,8 +408,8 @@ export default function DashboardUsersPage() {
data-admin-reveal
className="mx-auto w-full max-w-[1240px] px-[clamp(20px,4vw,40px)] pt-4"
>
<div className="overflow-hidden rounded-[20px] border border-admin-line-soft bg-admin-card shadow-admin">
<table className="w-full border-collapse">
<div className="overflow-x-auto rounded-[20px] border border-admin-line-soft bg-admin-card shadow-admin">
<table className="w-full min-w-max border-collapse">
<thead>
<tr>
{['ID', '이름', '이메일', '학과 · 학번', '권한', '팀'].map((label) => (
Expand Down
21 changes: 15 additions & 6 deletions src/components/admin/dashboard/adminStyles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,28 @@
export const ADMIN_PILL =
'flex items-center gap-2.5 rounded-full border border-admin-line bg-admin-card px-4 py-2.5'

/** 알약 안에 들어가는 네이티브 셀렉트 */
/**
* 알약 안에 들어가는 네이티브 셀렉트.
*
* 입력 컨트롤은 모바일에서 16px 이상이어야 한다 — iOS Safari 는 그보다 작은 칸에 포커스하면
* 화면을 확대하고 되돌리지 않는다.
*/
export const ADMIN_PILL_SELECT =
'cursor-pointer border-0 bg-transparent text-[15px] text-admin-ink outline-none'
'cursor-pointer border-0 bg-transparent text-[15px] mobile:text-base text-admin-ink outline-none'

/** 셀렉트 옵션 — 브라우저가 배경을 상속하지 않아 직접 준다 */
export const ADMIN_OPTION = 'bg-admin-card text-admin-ink'

/** 표 안에서 쓰는 셀렉트 */
export const ADMIN_CELL_SELECT =
'w-full min-w-[96px] cursor-pointer rounded-[10px] border border-admin-line bg-admin-card px-2.5 py-2 text-[14px] text-admin-ink outline-none transition-colors duration-200 hover:border-admin-accent disabled:cursor-not-allowed disabled:opacity-40'
'w-full min-w-[96px] cursor-pointer rounded-[10px] border border-admin-line bg-admin-card px-2.5 py-2 text-[14px] mobile:text-base text-admin-ink outline-none transition-colors duration-200 hover:border-admin-accent disabled:cursor-not-allowed disabled:opacity-40'

/** 검색 필드를 감싸는 라벨 */
export const ADMIN_SEARCH_FIELD =
'flex min-w-0 flex-1 basis-[300px] items-center gap-2.5 rounded-full border border-admin-line bg-admin-card px-4 py-2.5 shadow-admin transition duration-[250ms] focus-within:border-admin-accent focus-within:shadow-admin-ring'

export const ADMIN_SEARCH_INPUT =
'min-w-0 flex-1 border-0 bg-transparent text-[15px] text-admin-ink outline-none'
'min-w-0 flex-1 border-0 bg-transparent text-[15px] mobile:text-base text-admin-ink outline-none'

/** 강조 버튼 (저장 등) */
export const ADMIN_ACCENT_BUTTON =
Expand All @@ -39,9 +44,13 @@ export const ADMIN_ACCENT_BUTTON_SM =
export const ADMIN_GHOST_BUTTON =
'whitespace-nowrap rounded-full border border-admin-line px-[18px] py-2 text-[13px] text-admin-ink-muted transition-colors duration-200 hover:border-admin-accent hover:text-admin-ink disabled:cursor-not-allowed disabled:opacity-40'

/** 표를 감싸는 카드 — `overflow-hidden` 이 라운드를 지킨다 */
/**
* 표를 감싸는 카드. `overflow-x-auto` 가 라운드를 지키면서 좁은 화면에서 가로 스크롤을 준다 —
* `overflow-hidden` 이던 때는 모바일에서 오른쪽 열이 잘린 채 밀어도 움직이지 않았다.
* 안의 표는 `min-w-max` 등으로 폭을 지켜야 열이 찌그러지지 않는다.
*/
export const ADMIN_TABLE_CARD =
'overflow-hidden rounded-[20px] border border-admin-line-soft bg-admin-card shadow-admin'
'overflow-x-auto rounded-[20px] border border-admin-line-soft bg-admin-card shadow-admin'

/**
* 표 헤더 셀. `top-0` 이어야 한다 — 68px 을 주면 첫 행과 겹친다.
Expand Down
5 changes: 3 additions & 2 deletions src/components/board/AttachmentList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,10 @@ export function AttachmentList({ attachments }: AttachmentListProps) {
href={href ?? '#'}
target="_blank"
rel="noreferrer"
className="flex items-center gap-2 overflow-hidden text-ellipsis whitespace-nowrap rounded-[10px] bg-[rgba(240,234,228,0.06)] px-4 py-[9px] text-[15px] text-tag-info underline transition-colors hover:bg-[rgba(240,234,228,0.11)]"
className="flex items-center gap-2 rounded-[10px] bg-[rgba(240,234,228,0.06)] px-4 py-[9px] text-[15px] text-tag-info underline transition-colors hover:bg-[rgba(240,234,228,0.11)]"
>
{attachment.url}
{/* flex 컨테이너에 직접 둔 텍스트에는 말줄임이 안 걸려 긴 URL 이 오른쪽 여백까지 잘린다. */}
<span className="truncate">{attachment.url}</span>
</a>
</li>
)
Expand Down
6 changes: 3 additions & 3 deletions src/components/board/boardMenus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import type { GdgMenuLink } from '@/components/ui/design-system'
* 게시판이 늘어날 때 여기 한 곳만 고치면 8개 페이지가 함께 맞는다.
*/
export const BOARD_MENUS: GdgMenuLink[] = [
{ label: '공지사항', url: '/board/notices/' },
{ label: '행사게시판', url: '/board/events/' },
{ label: '자유게시판', url: '/board/free/' },
{ label: '공지사항', url: '/board/notices/', shortLabel: '공지' },
{ label: '행사게시판', url: '/board/events/', shortLabel: '행사' },
{ label: '자유게시판', url: '/board/free/', shortLabel: '자유' },
{ label: '소모임', url: '/club/' }
]
2 changes: 1 addition & 1 deletion src/components/club/admin/ClubTermCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { cn } from '@/utils/cn'
const CARD =
'flex flex-col gap-3 rounded-[20px] border border-admin-line-soft bg-admin-card p-[22px] shadow-admin'
const FIELD =
'rounded-xl border border-admin-line bg-admin-base px-4 py-3 text-[14px] text-admin-ink outline-none focus:border-admin-accent'
'rounded-xl border border-admin-line bg-admin-base px-4 py-3 text-[14px] mobile:text-base text-admin-ink outline-none focus:border-admin-accent'

/**
* 기수 설정 (C 담당) — `/dashboard/club/leaders` 오른쪽 칸. 이름과 참석 비율만 있다. 활동 기간은 소모임마다 둔다.
Expand Down
2 changes: 1 addition & 1 deletion src/components/eventApplication/QuestionEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import {
} from '@/types/eventApplication'

const INPUT =
'w-full rounded-[10px] border border-admin-line bg-admin-card px-3 py-2 text-[14px] text-admin-ink outline-none transition-colors duration-200 focus:border-admin-accent disabled:cursor-not-allowed disabled:opacity-40'
'w-full rounded-[10px] border border-admin-line bg-admin-card px-3 py-2 text-[14px] mobile:text-base text-admin-ink outline-none transition-colors duration-200 focus:border-admin-accent disabled:cursor-not-allowed disabled:opacity-40'

const LABEL = 'shrink-0 whitespace-nowrap text-[12px] tracking-[0.06em] text-admin-ink-dim'

Expand Down
25 changes: 20 additions & 5 deletions src/components/landing/onboarding/LandingHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import Image from 'next/image'

import { useAuth } from '@/hooks/useAuth'
import { hasAtLeast } from '@/utils/auth/role'
import { canOpenDashboard, hasAtLeast } from '@/utils/auth/role'

import gdgocPcLogo from '@public/icons/gdgocIcon/pc.svg'

Expand Down Expand Up @@ -39,9 +39,10 @@ export default function LandingHeader() {
const isLoggedIn = Boolean(user)
// 콘텐츠 관리 화면과 같은 기준이다 (dashboard/landing/layout.tsx).
const canEditContent = hasAtLeast(user?.userRole, 'LEAD')
const canOpenAdmin = canOpenDashboard(user?.userRole)

return (
<header className="fixed inset-x-0 top-0 z-50 flex h-[68px] items-center justify-between gap-6 border-b border-b-[rgba(240,234,228,0.07)] bg-[rgba(27,22,34,0.62)] px-[clamp(20px,4vw,44px)] backdrop-blur-[18px]">
<header className="fixed inset-x-0 top-0 z-50 flex h-[68px] items-center justify-between gap-3 border-b border-b-[rgba(240,234,228,0.07)] bg-[rgba(27,22,34,0.62)] px-[clamp(20px,4vw,44px)] backdrop-blur-[18px] pc:gap-6">
<a
href="#top"
onClick={(event) => {
Expand All @@ -66,12 +67,26 @@ export default function LandingHeader() {
</span>
</a>

<nav className="flex items-center gap-[clamp(14px,2.4vw,34px)]">
{/*
모바일 여백은 운영진 기준으로 맞췄다. CORE 이상은 「운영」까지 다섯 개라 360px 에서
PC 와 같은 간격이면 지원하기가 25px 잘린다.
*/}
<nav className="flex items-center gap-[clamp(10px,2.4vw,34px)]">
{/*
좁은 화면에서는 숨긴다. 넣으면 nav 가 헤더보다 길어져 지원하기가 잘린다(360px 기준 62px 초과).
운영진은 대시보드 허브의 온보딩 관리로 같은 화면에 갈 수 있다.
*/}
{canEditContent && (
<a href="/dashboard/landing/" className={ADMIN_LINK_CLASS}>
<a href="/dashboard/landing/" className={`${ADMIN_LINK_CLASS} mobile:hidden`}>
콘텐츠 관리
</a>
)}
{/* 홈 화면 앱을 열면 여기가 첫 화면이라 운영진 입구가 있어야 한다. 짧아서 모바일에도 들어간다. */}
{canOpenAdmin && (
<a href="/dashboard/" className={ADMIN_LINK_CLASS}>
운영
</a>
)}
{ANCHORS.map((item) => (
<a
key={item.id}
Expand All @@ -98,7 +113,7 @@ export default function LandingHeader() {
</a>
<a
href="/recruit/"
className="whitespace-nowrap rounded-full bg-ember px-5 py-2.5 text-[15px] font-medium text-ember-ink transition-colors hover:bg-dusk-ink-100 hover:text-dusk-base"
className="whitespace-nowrap rounded-full bg-ember px-4 py-2.5 pc:px-5 text-[15px] font-medium text-ember-ink transition-colors hover:bg-dusk-ink-100 hover:text-dusk-base"
>
지원하기
</a>
Expand Down
Loading
Loading