From 4014a0776223d72e12bdb91719d59fc747c0a35b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=98=A4=EC=88=98=ED=98=84?= Date: Sun, 17 May 2026 15:32:36 +0900 Subject: [PATCH 01/10] feat: redesign admin page with two-column layout and CSS module - Replace inline styles with CSS module (AdminEvents.module.css) - Split page into left (controls) / right (form) panel layout - Warm off-white background, rounded cards with shadow - Pill-style toggle buttons for override fields - Left panel last card grows to match right panel height Co-Authored-By: Claude Sonnet 4.6 --- src/pages/AdminEvents.tsx | 343 ++++++++++++---------- src/styles/AdminEvents.module.css | 462 ++++++++++++++++++++++++++++++ 2 files changed, 656 insertions(+), 149 deletions(-) create mode 100644 src/styles/AdminEvents.module.css diff --git a/src/pages/AdminEvents.tsx b/src/pages/AdminEvents.tsx index 77d4f27..7ef7a73 100644 --- a/src/pages/AdminEvents.tsx +++ b/src/pages/AdminEvents.tsx @@ -10,6 +10,7 @@ import { type AdminEventPatchRequest, } from "@/api/adminEvent"; import { useState } from "react"; +import styles from "@/styles/AdminEvents.module.css"; const EMPTY_FORM = { title: "", @@ -351,157 +352,201 @@ export default function AdminEventsPage() { ["location", "장소", "text"], ["applyLink", "신청 링크", "text"], - ["tags", "태그, 쉼표 구분", "text"], + ["tags", "태그 (쉼표 구분)", "text"], ]; return ( -
-

행샤 어드민

- -
- setEventId(e.currentTarget.value)} - placeholder="행사 ID" - /> - - - - - - - - - - -
- -
-

JSON 파일 Sync

- - { - setSelectedFile(e.currentTarget.files?.[0] ?? null); - }} - /> - - -
- -
-

adminOverriddenFields lock/unlock

- -

- 마지막 응답 기준 lock: {overrideFields.length > 0 ? overrideFields.join(", ") : "없음"} -

- -
- {OVERRIDABLE_FIELDS.map(({ key, label }) => ( - - ))} +
+
+

행샤 어드민

+ +
+ {/* ── 왼쪽 패널 ── */} +
+ {/* 행사 관리 */} +
+

행사 관리

+
+ setEventId(e.currentTarget.value)} + placeholder="행사 ID" + /> + + + + + + + +
+ + + + +
+
+ + {/* 피드백 메시지 */} + {message &&

{message}

} + + {/* JSON 파일 Sync */} +
+

JSON 파일 Sync

+
+ + + + {selectedFile ? selectedFile.name : "선택된 파일 없음"} + + + +
+
+ + {/* adminOverriddenFields lock/unlock */} +
+

Override Fields

+ +
+ 현재 lock + {overrideFields.length > 0 ? ( + overrideFields.map((f) => ( + + {f} + + )) + ) : ( + 없음 + )} +
+ +
+ {OVERRIDABLE_FIELDS.map(({ key, label }) => { + const checked = selectedOverrideFields.includes(key); + return ( + + ); + })} +
+ +
+ + + +
+
+
+ + {/* ── 오른쪽 패널 ── */} +
+
+

행사 데이터

+
+ {fields.map(([key, label, type]) => ( +
+ + updateForm(key, e.currentTarget.value)} + /> +
+ ))} + +
+ +