diff --git a/src/api/client/api-error.ts b/src/api/client/api-error.ts index 84df56ed9..353454c61 100644 --- a/src/api/client/api-error.ts +++ b/src/api/client/api-error.ts @@ -4,23 +4,27 @@ class ApiError extends Error { public errorCode: string; public errorName: string; public message: string; + public detail?: unknown; public constructor({ statusCode, errorCode, errorName, message, + detail, }: { statusCode: number; errorCode: string; errorName: string; message: string; + detail?: unknown; }) { super(message); this.statusCode = statusCode; this.errorCode = errorCode; this.errorName = errorName; this.message = message; + this.detail = detail; } } diff --git a/src/api/openapi/models/mentor-settings-upsert-request.ts b/src/api/openapi/models/mentor-settings-upsert-request.ts index e136bca91..757e5c5b3 100644 --- a/src/api/openapi/models/mentor-settings-upsert-request.ts +++ b/src/api/openapi/models/mentor-settings-upsert-request.ts @@ -28,6 +28,12 @@ export interface MentorSettingsUpsertRequest { 'jobGroupCode': string; 'jobTitleCode': string; 'careerCode': string; + 'careerEntries'?: Array<{ + 'description': string; + 'isCurrent'?: boolean; + 'startMonth'?: string; + 'endMonth'?: string; + }>; 'coreKeywordCodes': Array; 'companyName': string; 'companyVisible': boolean; @@ -36,11 +42,10 @@ export interface MentorSettingsUpsertRequest { 'schedule': MentorScheduleRequest; 'detailedDescription': string; 'interviewQuestions': Array; - 'preNotice': string; + 'preNotice'?: string; 'anyMethodEnabled'?: boolean; 'scheduleValidWhenRealtimeEnabled'?: boolean; 'durationValid'?: boolean; 'interviewQuestionUnique'?: boolean; 'coreKeywordUnique'?: boolean; } - diff --git a/src/app/(admin)/admin/mentoring/layout.tsx b/src/app/(admin)/admin/mentoring/layout.tsx index dfb9c64e1..9d62fb28b 100644 --- a/src/app/(admin)/admin/mentoring/layout.tsx +++ b/src/app/(admin)/admin/mentoring/layout.tsx @@ -1,10 +1,17 @@ +import { notFound } from 'next/navigation'; import type { ReactNode } from 'react'; import MentoringAdminLayoutClient from '@/features/admin/mentoring/ui/mentoring-admin-layout-client'; +import { isMentoringAdminMockEnabled } from '@/features/mentoring/model/mentoring-feature-flag'; export default function MentoringManagementLayout({ children, }: { children: ReactNode; }) { + if (!isMentoringAdminMockEnabled()) { + // 관리자 멘토링 백오피스는 현재 제품 범위에 포함되지 않아 라우트 자체를 숨깁니다. + notFound(); + } + return {children}; } diff --git a/src/app/(service)/(my)/note-consultation/page.tsx b/src/app/(service)/(my)/note-consultation/page.tsx index 25908f112..c06452341 100644 --- a/src/app/(service)/(my)/note-consultation/page.tsx +++ b/src/app/(service)/(my)/note-consultation/page.tsx @@ -1,5 +1,12 @@ +import { notFound } from 'next/navigation'; +import { isMentoringNoteConsultationEnabled } from '@/features/mentoring/model/mentoring-feature-flag'; import NoteConsultationPageClient from '@/features/mentoring/ui/pages/note-consultation-page-client'; export default function NoteConsultationRoute() { + if (!isMentoringNoteConsultationEnabled()) { + // 쪽지상담함은 현재 제품 범위에 포함되지 않아 라우트 자체를 숨깁니다. + notFound(); + } + return ; } diff --git a/src/app/global.css b/src/app/global.css index ca3550a31..4161a6f26 100644 --- a/src/app/global.css +++ b/src/app/global.css @@ -382,6 +382,7 @@ https://velog.io/@oneook/tailwindcss-4.0-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%AC%E --spacing-125: 10px; --spacing-150: 12px; --spacing-160: 13px; + --spacing-175: 14px; --spacing-200: 16px; --spacing-225: 18px; --spacing-250: 20px; @@ -425,14 +426,34 @@ https://velog.io/@oneook/tailwindcss-4.0-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%AC%E height: 200px; } +@utility h-650 { + height: 52px; +} + @utility w-140 { width: 140px; } +@utility w-320 { + width: 320px; +} + +@utility w-360 { + width: 360px; +} + +@utility w-650 { + width: 52px; +} + @utility min-h-280 { min-height: 280px; } +@utility min-h-260 { + min-height: 260px; +} + @utility w-100 { width: 100px; } @@ -445,6 +466,14 @@ https://velog.io/@oneook/tailwindcss-4.0-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%AC%E height: 244px; } +@utility max-w-page { + max-width: 1280px; +} + +@utility max-w-130 { + max-width: 130px; +} + @utility max-w-study-content { max-width: 1164px; } @@ -453,6 +482,30 @@ https://velog.io/@oneook/tailwindcss-4.0-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%AC%E max-height: 90vh; } +@utility grid-cols-content-sidebar-360 { + grid-template-columns: minmax(0, 1fr) 360px; +} + +@utility grid-cols-fluid-120 { + grid-template-columns: minmax(0, 1fr) 120px; +} + +@utility top-panel-offset { + top: var(--panel-top-offset); +} + +@utility right-panel-offset { + right: var(--panel-right-offset); +} + +@utility h-panel-height { + height: var(--panel-height); +} + +@utility translate-y-panel { + transform: translate3d(0, var(--panel-translate-y, 0px), 0); +} + @utility font-display-headings2 { font-size: 64px; font-weight: var(--font-weight-bold); @@ -852,12 +905,10 @@ https://velog.io/@oneook/tailwindcss-4.0-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%AC%E 0%, 100% { background-color: transparent; - box-shadow: inset 3px 0 0 transparent; } 20%, 80% { background-color: var(--color-fill-brand-subtle-default); - box-shadow: inset 3px 0 0 var(--color-border-brand); } } @@ -937,7 +988,7 @@ https://velog.io/@oneook/tailwindcss-4.0-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%AC%E .tiptap-editor .tiptap pre { background-color: var(--color-background-alternative); border-radius: 8px; - padding: 8px 10px; + padding: 32px 10px 8px; margin-bottom: 12px; overflow-x: auto; } diff --git a/src/components/common/modals/study-completion-modal.tsx b/src/components/common/modals/study-completion-modal.tsx index 6c4be460d..cf1d86eb6 100644 --- a/src/components/common/modals/study-completion-modal.tsx +++ b/src/components/common/modals/study-completion-modal.tsx @@ -81,6 +81,9 @@ export default function StudyCompletionModal({ + + 스터디 완주를 축하합니다! +