setFocused('name')}
onBlur={() => setFocused('')}
@@ -61,6 +63,7 @@ function LoginPage() {
placeholder="비밀번호"
value={form.password}
onChange={handleChange}
+ onKeyDown={handleKeyDown}
className={`${styles.input} ${focused === 'pw' ? styles.inputFocused : ''}`}
onFocus={() => setFocused('pw')}
onBlur={() => setFocused('')}
diff --git a/frontend/src/pages/login/LoginPage.module.css b/frontend/src/pages/login/LoginPage.module.css
index 3a146cd..bf710c8 100644
--- a/frontend/src/pages/login/LoginPage.module.css
+++ b/frontend/src/pages/login/LoginPage.module.css
@@ -13,6 +13,8 @@
font-size: 56px;
font-weight: 900;
margin-bottom: 48px;
+ cursor: pointer;
+ text-decoration: none;
}
.form {
@@ -30,6 +32,7 @@
font-size: 16px;
outline: none;
transition: border 0.2s;
+ box-sizing: border-box;
}
.inputFocused {
@@ -51,4 +54,18 @@
.button:hover {
background-color: var(--main);
transition: all 0.2s ease;
+}
+
+/* ── 모바일 ── */
+@media (max-width: 480px) {
+ .title {
+ font-size: 40px;
+ margin-bottom: 32px;
+ }
+
+ .form {
+ width: 100%;
+ padding: 0 24px;
+ box-sizing: border-box;
+ }
}
\ No newline at end of file
diff --git a/frontend/src/pages/pirocheck/PIroCheckMain.module.css b/frontend/src/pages/pirocheck/PIroCheckMain.module.css
index 9a0663a..856186b 100644
--- a/frontend/src/pages/pirocheck/PIroCheckMain.module.css
+++ b/frontend/src/pages/pirocheck/PIroCheckMain.module.css
@@ -4,7 +4,7 @@
align-items: center;
justify-content: center;
gap: 20px;
- height: calc(100vh - 100px);
+ height: calc(100vh - 100px);
background: var(--black);
}
@@ -25,4 +25,13 @@
.menuBtn:hover {
background: var(--dark);
color: var(--white);
+}
+
+/* ── 모바일 ── */
+@media (max-width: 480px) {
+ .menuBtn {
+ width: calc(100% - 48px);
+ font-size: 1.5rem;
+ padding: 20px 0;
+ }
}
\ No newline at end of file
diff --git a/frontend/src/pages/pirocheck/assignment/Assignment.js b/frontend/src/pages/pirocheck/assignment/Assignment.js
index 81a0f13..27786c7 100644
--- a/frontend/src/pages/pirocheck/assignment/Assignment.js
+++ b/frontend/src/pages/pirocheck/assignment/Assignment.js
@@ -56,13 +56,14 @@ function AssignmentModal({ item, onClose, onSave }) {
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title: form.title, week: form.week, day: form.day }),
});
- onSave();
+ onSave(form.title);
onClose();
};
return (
+
ASSIGNMENT
@@ -113,21 +114,21 @@ function WeekBlock({ weekData, role, onEdit, onDelete }) {
{dayMap[session.day]}
{session.sessionDate && {session.sessionDate}}
- {role === 'ADMIN' && (
-
-
-
-
- )}
{session.items.map((item, k) => (
{item.title}
{role === 'MEMBER' &&
}
+ {role === 'ADMIN' && (
+
+
+
+
+ )}
))}
{j < grouped.length - 1 &&
}
@@ -156,6 +157,18 @@ function Assignment() {
setWeeks(results);
};
+ // 수정 시 로컬 state만 업데이트 (순서 유지)
+ const handleEditSave = (updatedItem) => {
+ setWeeks(prev => prev.map(w => ({
+ ...w,
+ assignments: w.assignments.map(a =>
+ a.assignmentId === updatedItem.assignmentId
+ ? { ...a, ...updatedItem }
+ : a
+ )
+ })));
+ };
+
useEffect(() => { fetchAll(); }, []);
const handleDelete = async (assignmentId) => {
@@ -186,7 +199,7 @@ function Assignment() {
setModalItem(undefined)}
- onSave={fetchAll}
+ onSave={modalItem ? (updated) => handleEditSave({ ...modalItem, title: updated }) : fetchAll}
/>
)}
diff --git a/frontend/src/pages/pirocheck/assignment/Assignment.module.css b/frontend/src/pages/pirocheck/assignment/Assignment.module.css
index 5ca20b9..8621bcf 100644
--- a/frontend/src/pages/pirocheck/assignment/Assignment.module.css
+++ b/frontend/src/pages/pirocheck/assignment/Assignment.module.css
@@ -36,6 +36,7 @@
border-radius: 16px;
margin-bottom: 20px;
overflow: hidden;
+ box-sizing: border-box;
}
.weekHeader {
@@ -153,6 +154,7 @@
.statusIcon {
width: 20px;
height: 20px;
+ flex-shrink: 0;
}
.divider {
@@ -195,25 +197,44 @@
}
.modal {
+ position: relative;
background: #3a3a3a;
border-radius: 20px;
padding: 40px 60px;
- width: 420px;
+ width: clamp(360px, 40vw, 520px);
display: flex;
flex-direction: column;
align-items: center;
- gap: 16px;
+ gap: 16px;
+ box-sizing: border-box;
}
+/* X 닫기 버튼 */
+.modalCloseBtn {
+ position: absolute;
+ top: 16px;
+ right: 20px;
+ background: transparent;
+ border: none;
+ color: #aaa;
+ font-size: 1.4rem;
+ cursor: pointer;
+ line-height: 1;
+ padding: 4px;
+ transition: color 0.2s;
+}
+
+.modalCloseBtn:hover { color: var(--white); }
+
.modalLogo {
- width: 200px;
- height: 200px;
+ width: 160px;
+ height: 160px;
object-fit: contain;
}
.modalTitle {
- font-family: var(--font-main);
- font-size: 3rem;
+ font-family: var(--font-title);
+ font-size: 2.6rem;
font-weight: 800;
color: var(--main);
letter-spacing: 0;
@@ -223,36 +244,33 @@
display: flex;
align-items: center;
gap: 12px;
- width: 85%;
+ width: 100%;
margin-top: 10px;
}
.select {
- padding: 10px 36px 10px 20px;
+ padding: 10px 36px 10px 20px;
background-color: var(--pale);
-
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-
background-image: url("data:image/svg+xml;utf8,
");
background-repeat: no-repeat;
background-position: right 16px center;
-
border: none;
border-radius: 8px;
font-family: var(--font-main);
font-size: 1rem;
cursor: pointer;
flex: 1;
+ min-width: 0;
}
-.select::-ms-expand {
- display: none;
-}
+.select::-ms-expand { display: none; }
+
.modalInput {
- width: 85%;
- padding: 12px 20px;
+ width: 100%;
+ padding: 12px 20px;
background: var(--pale);
border: none;
border-radius: 8px;
@@ -265,6 +283,7 @@
color: var(--white);
font-family: var(--font-main);
font-size: 1.2rem;
+ white-space: nowrap;
}
.saveBtn {
@@ -284,4 +303,109 @@
.saveBtn:hover {
background: var(--main);
color: var(--black);
+}
+
+/* ── 모바일 ── */
+@media (max-width: 640px) {
+ .container {
+ padding: 40px 24px;
+ }
+
+ .title {
+ font-size: 3rem;
+ margin-bottom: 28px;
+ text-align: center;
+ word-break: keep-all;
+ line-height: 1.2;
+ }
+
+ .mockBanner {
+ width: 100%;
+ }
+
+ .weekBlock {
+ width: 100%;
+ }
+
+ .weekHeader {
+ padding: 20px;
+ }
+
+ .weekBody {
+ padding: 0 20px 20px;
+ }
+
+ /* 모달 */
+ .modalOverlay {
+ align-items: center;
+ padding: 24px;
+ box-sizing: border-box;
+ }
+
+ .modal {
+ width: 100%;
+ max-width: 100%;
+ border-radius: 20px;
+ padding: 40px 24px 40px;
+ }
+
+ .modalLogo {
+ width: 120px;
+ height: 120px;
+ }
+
+ .modalTitle {
+ font-size: 2rem;
+ }
+
+ .modalRow {
+ width: 100%;
+ }
+
+ .modalInput {
+ width: 100%;
+ }
+
+ .addBtn {
+ bottom: 24px;
+ right: 20px;
+ }
+
+ .assignmentTitle {
+ font-size: 0.9rem;
+ flex: 1;
+ min-width: 0;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ padding-right: 8px;
+ }
+
+ .sessionTitle {
+ font-size: 0.85rem;
+ }
+
+ .dayLabel {
+ font-size: 1.1rem;
+ }
+}
+/* ── 태블릿 ── */
+@media (min-width: 641px) and (max-width: 1024px) {
+ .container {
+ padding: 48px 32px;
+ }
+
+ .weekBlock {
+ width: 100%;
+ max-width: 720px;
+ }
+
+ .mockBanner {
+ width: 100%;
+ max-width: 720px;
+ }
+
+ .modal {
+ width: clamp(400px, 70vw, 560px);
+ }
}
\ No newline at end of file
diff --git a/frontend/src/pages/pirocheck/attendance/Attendance.js b/frontend/src/pages/pirocheck/attendance/Attendance.js
index 02afa83..92a53cd 100644
--- a/frontend/src/pages/pirocheck/attendance/Attendance.js
+++ b/frontend/src/pages/pirocheck/attendance/Attendance.js
@@ -15,9 +15,19 @@ function cloverForSlot(status) {
return

;
}
-function historyIcon(slots) {
+// 세션 1회 출석 결과 → 코인/화남 아이콘
+// status: true(출석성공) / false(결석) / null(미정)
+// successCount: 해당 세션에서 출석 성공한 횟수 (AM/PM 등 슬롯 수)
+function sessionIcon(slot) {
+ if (slot.status === true) return

;
+ if (slot.status === false) return

;
+ return

;
+}
+
+// 주차 전체 슬롯(3개) → 코인 합산
+function weekCoinIcon(slots) {
const successCount = slots.filter(s => s.status === true).length;
- if (successCount === 3) return

;
+ if (successCount >= 3) return

;
if (successCount === 2) return

;
if (successCount === 1) return

;
return

;
@@ -104,29 +114,34 @@ function MemberView() {
const [history, setHistory] = useState([]);
useEffect(() => {
- // 1~5주차 기본값 세팅
- const defaultHistory = [1, 2, 3, 4, 5].map(week => ({
- week,
- slots: [
- { status: false },
- { status: false },
- { status: false },
- ]
- }));
-
- authFetch('/api/attendance/user')
- .then(r => r.json())
- .then(data => {
- const apiData = data.data || [];
- // API 데이터로 해당 주차 덮어씌우기
- const merged = defaultHistory.map(def => {
- const found = apiData.find(d => d.week === def.week);
- return found || def;
- });
- setHistory(merged);
- })
- .catch(() => setHistory(defaultHistory));
-}, []);
+ const defaultHistory = [1, 2, 3, 4, 5].map(week => ({
+ week,
+ slots: [
+ { status: null },
+ { status: null },
+ { status: null },
+ ]
+ }));
+
+ // 오늘 출석 현황 초기 fetch (새로고침 시 유지)
+ const today = new Date().toISOString().split('T')[0];
+ authFetch(`/api/attendance/user/date?date=${today}`)
+ .then(r => r.json())
+ .then(d => setTodaySlots(d.data || []))
+ .catch(() => {});
+
+ authFetch('/api/attendance/user')
+ .then(r => r.json())
+ .then(data => {
+ const apiData = data.data || [];
+ const merged = defaultHistory.map(def => {
+ const found = apiData.find(d => d.week === def.week);
+ return found || def;
+ });
+ setHistory(merged);
+ })
+ .catch(() => setHistory(defaultHistory));
+ }, []);
const handleSubmit = async () => {
if (!inputCode.trim()) return;
@@ -147,7 +162,7 @@ function MemberView() {
} else if (result.statusCode === 'INVALID_CODE') {
setMessage('출석 코드를 확인해주세요.');
} else {
- setMessage(result.message);
+ setMessage(result.message);
}
setInputCode('');
@@ -173,18 +188,23 @@ function MemberView() {
{message &&
{message}
}
+ {/* 오늘 출석 현황 클로버 */}
{displaySlots.map((slot, i) => (
{cloverForSlot(slot.status)}
))}
+ {/* 주차별 출석 히스토리 */}
{history.map((row, i) => (
{row.week}주차
- {historyIcon(row.slots)}
+ {/* 슬롯 3개 각각 코인/화남으로 표시 */}
+ {row.slots.map((slot, j) => (
+
{sessionIcon(slot)}
+ ))}
))}
diff --git a/frontend/src/pages/pirocheck/attendance/Attendance.module.css b/frontend/src/pages/pirocheck/attendance/Attendance.module.css
index 028591f..2190366 100644
--- a/frontend/src/pages/pirocheck/attendance/Attendance.module.css
+++ b/frontend/src/pages/pirocheck/attendance/Attendance.module.css
@@ -3,7 +3,7 @@
flex-direction: column;
align-items: center;
padding: 60px 20px;
- min-height: calc(80vh - 100px);
+ min-height: calc(80vh - 100px);
background: var(--black);
justify-content: center;
}
@@ -14,7 +14,7 @@
font-weight: 800;
color: var(--main);
margin-bottom: 50px;
- letter-spacing: 0.05em;
+ text-align: center;
}
/* ── ADMIN ── */
@@ -68,7 +68,7 @@
transition: opacity 0.2s;
}
-.createBtn:hover { background: var(--main); transition: all ease-in-out 0.2s;}
+.createBtn:hover { background: var(--main); transition: all ease-in-out 0.2s; }
.manageLink {
color: var(--white);
@@ -86,11 +86,13 @@
display: flex;
align-items: center;
background: var(--gray600);
- border-radius: 10px;
+ border-radius: 10px;
overflow: hidden;
width: 480px;
+ max-width: calc(100vw - 56px);
margin-bottom: 16px;
padding: 3px 3px 3px 20px;
+ box-sizing: border-box;
}
.codeInput {
@@ -109,7 +111,7 @@
padding: 10px 20px;
background: var(--dark);
border: none;
- border-radius: 10px;
+ border-radius: 10px;
color: var(--white);
font-family: var(--font-main);
font-size: 1rem;
@@ -172,4 +174,52 @@
display: flex;
flex-direction: column;
gap: 16px;
+}
+
+/* ── 모바일 ── */
+@media (max-width: 480px) {
+ .container {
+ padding: 48px 28px;
+ }
+
+ .title {
+ font-size: 2.8rem;
+ margin-bottom: 36px;
+ word-break: keep-all;
+ line-height: 1.2;
+ }
+
+ /* ADMIN */
+ .code {
+ width: 68px;
+ height: 84px;
+ font-size: 2.2rem;
+ }
+
+ .codebox {
+ gap: 10px;
+ }
+
+ .createBtn {
+ width: calc(100vw - 56px);
+ max-width: 320px;
+ }
+
+ /* MEMBER */
+ .cloverSvg {
+ width: 63px;
+ height: 63px;
+ }
+
+ .cloverRow {
+ gap: 28px;
+ margin-top: 28px;
+ margin-bottom: 28px;
+ }
+
+ .historyBox {
+ width: calc(100vw - 56px);
+ padding: 24px 28px;
+ box-sizing: border-box;
+ }
}
\ No newline at end of file
diff --git a/frontend/src/pages/pirocheck/deposit/Deposit.module.css b/frontend/src/pages/pirocheck/deposit/Deposit.module.css
index 298bf8b..d941723 100644
--- a/frontend/src/pages/pirocheck/deposit/Deposit.module.css
+++ b/frontend/src/pages/pirocheck/deposit/Deposit.module.css
@@ -7,19 +7,6 @@
background: var(--black);
}
-.mockBanner {
- background: #5a3e00;
- color: #ffd166;
- font-family: var(--font-main);
- font-size: 0.85rem;
- padding: 10px 20px;
- border-radius: 8px;
- margin-bottom: 20px;
- text-align: center;
- width: 400px;
- box-sizing: border-box;
-}
-
.title {
font-family: var(--font-title);
font-size: 3rem;
@@ -32,6 +19,7 @@
/* 잔여 보증금 박스 */
.amountBox {
width: 400px;
+ max-width: calc(100vw - 56px);
background: #e8f5e9;
border-radius: 16px;
padding: 36px 20px;
@@ -40,6 +28,7 @@
align-items: center;
gap: 12px;
margin-bottom: 24px;
+ box-sizing: border-box;
}
.amountLabel {
@@ -59,9 +48,11 @@
/* 차감 목록 */
.itemList {
width: 400px;
+ max-width: calc(100vw - 56px);
display: flex;
flex-direction: column;
gap: 12px;
+ box-sizing: border-box;
}
.item {
@@ -85,4 +76,36 @@
font-size: 1.1rem;
font-weight: 600;
color: var(--white);
+}
+
+/* ── 모바일 ── */
+@media (max-width: 480px) {
+ .container {
+ padding: 48px 28px;
+ margin: 0 30px;
+ }
+
+ .title {
+ font-size: 2.8rem;
+ margin-bottom: 28px;
+ word-break: keep-all;
+ line-height: 1.2;
+ text-align: center;
+ }
+
+ .amountLabel {
+ font-size: 1.2rem;
+ }
+
+ .amountValue {
+ font-size: 2rem;
+ }
+
+ .item {
+ padding: 16px 20px;
+ }
+
+ .itemLabel, .itemValue {
+ font-size: 1rem;
+ }
}
\ No newline at end of file
diff --git a/frontend/src/pages/pirocheck/students/StudentDetail.js b/frontend/src/pages/pirocheck/students/StudentDetail.js
index 37eb34a..d3e5c17 100644
--- a/frontend/src/pages/pirocheck/students/StudentDetail.js
+++ b/frontend/src/pages/pirocheck/students/StudentDetail.js
@@ -37,10 +37,10 @@ function WeekBlock({ weekData, onChange }) {
{isOpen && (
- {weekData.days.length === 0 && (
+ {(!weekData.days || weekData.days.length === 0) && (
데이터가 없습니다.
)}
- {weekData.days.map((day, i) => (
+ {(weekData.days || []).map((day, i) => (
toggleDay(day.day)}>
diff --git a/frontend/src/pages/pirocheck/students/StudentDetail.module.css b/frontend/src/pages/pirocheck/students/StudentDetail.module.css
index e073df1..0d15987 100644
--- a/frontend/src/pages/pirocheck/students/StudentDetail.module.css
+++ b/frontend/src/pages/pirocheck/students/StudentDetail.module.css
@@ -7,27 +7,16 @@
background: var(--black);
}
-.mockBanner {
- background: #5a3e00;
- color: #ffd166;
- font-family: var(--font-main);
- font-size: 0.85rem;
- padding: 10px 20px;
- border-radius: 8px;
- margin-bottom: 20px;
- width: 480px;
- box-sizing: border-box;
- text-align: center;
-}
-
.card {
width: 480px;
+ max-width: calc(100vw - 56px);
background: var(--gray600);
border-radius: 20px;
- padding: 40px 40px;
+ padding: 40px;
display: flex;
flex-direction: column;
gap: 20px;
+ box-sizing: border-box;
}
/* 프로필 */
@@ -66,6 +55,7 @@
display: flex;
flex-direction: column;
gap: 8px;
+ min-width: 0;
}
.depositBoxGray {
@@ -76,6 +66,7 @@
display: flex;
flex-direction: column;
gap: 8px;
+ min-width: 0;
}
.depositLabel {
@@ -99,7 +90,8 @@
}
.defenceInput {
- width: 80px;
+ flex: 1;
+ min-width: 0;
border: none;
background: transparent;
font-family: var(--font-main);
@@ -126,7 +118,7 @@
font-size: 0.75rem;
font-weight: 550;
cursor: pointer;
- margin-left: 30px;
+ flex-shrink: 0;
}
.saveBtn:hover { background: var(--gray600); color: var(--white); transition: all ease-in-out 0.2s; }
@@ -167,7 +159,6 @@
margin-left: 5px;
}
-/* 토글 애니메이션 */
.toggleIcon {
width: 15px;
height: 15px;
@@ -200,7 +191,6 @@
}
/* 요일 블록 */
-
.dayHeader {
display: flex;
align-items: center;
@@ -236,7 +226,6 @@
gap: 8px;
}
-/* 출석/과제 그룹 - 레이블 옆에 아이템들 */
.statusGroup {
display: flex;
align-items: flex-start;
@@ -274,34 +263,29 @@
}
.select {
- padding: 3px 28px 3px 12px;
- width: 80px;
+ padding: 3px 28px 3px 12px;
+ width: 80px;
box-sizing: border-box;
-
background: var(--gray600);
border: 1px solid var(--white);
border-radius: 6px;
color: var(--white);
font-family: var(--font-main);
font-size: 0.85rem;
- cursor: pointer;
-
+ cursor: pointer;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
-
background-image: url("data:image/svg+xml;utf8,
");
background-repeat: no-repeat;
-
- background-position: right 10px center;
+ background-position: right 10px center;
+ flex-shrink: 0;
}
-.select::-ms-expand {
- display: none;
-}
+.select::-ms-expand { display: none; }
.saveWeekBtn {
- margin: 20px 0;
+ margin: 20px auto;
padding: 5px 30px;
background: transparent;
border: 1.5px solid var(--main);
@@ -312,8 +296,6 @@
font-weight: 600;
cursor: pointer;
display: block;
- margin-left: auto;
- margin-right: auto;
}
.saveWeekBtn:hover { background: var(--main); color: var(--white); transition: all ease-in-out 0.2s; }
@@ -324,7 +306,6 @@
margin: 10px 0;
}
-/* 전체 저장 */
.saveAllBtn {
width: 60%;
margin: 0 auto;
@@ -340,4 +321,78 @@
transition: opacity 0.2s;
}
-.saveAllBtn:hover { background: var(--main); transition: all ease-in-out 0.2s; }
\ No newline at end of file
+.saveAllBtn:hover { background: var(--main); transition: all ease-in-out 0.2s; }
+
+/* ── 태블릿 ── */
+@media (min-width: 481px) and (max-width: 1024px) {
+ .depositEditRow {
+ flex-wrap: wrap;
+ }
+
+ .saveBtn {
+ margin-left: 0;
+ align-self: flex-start;
+ }
+}
+
+/* ── 모바일 ── */
+@media (max-width: 480px) {
+ .container {
+ padding: 48px 28px;
+ }
+
+ .card {
+ padding: 28px 20px;
+ }
+
+ .profileName {
+ font-size: 1.5rem;
+ }
+
+ .depositLabel {
+ font-size: 0.9rem;
+ }
+
+ .depositValue {
+ font-size: 1rem;
+ }
+
+ .defenceInput {
+ font-size: 1rem;
+ }
+
+ .won {
+ font-size: 1rem;
+ }
+
+ .depositEditRow {
+ flex-wrap: wrap;
+ }
+
+ .saveBtn {
+ width: 100%;
+ margin-left: 0;
+ font-size: 0.7rem;
+ padding: 6px 8px;
+ text-align: center;
+ }
+
+ .toggleIcon {
+ width: 12px;
+ height: 12px;
+ }
+
+ .toggleIcon2 {
+ width: 16px;
+ height: 16px;
+ }
+
+ .weekBody {
+ margin-left: 24px;
+ margin-right: 12px;
+ }
+
+ .saveAllBtn {
+ width: 100%;
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/pages/pirocheck/students/StudentList.module.css b/frontend/src/pages/pirocheck/students/StudentList.module.css
index 4eea6e6..4c17539 100644
--- a/frontend/src/pages/pirocheck/students/StudentList.module.css
+++ b/frontend/src/pages/pirocheck/students/StudentList.module.css
@@ -7,19 +7,6 @@
background: var(--black);
}
-.mockBanner {
- background: #5a3e00;
- color: #ffd166;
- font-family: var(--font-main);
- font-size: 0.85rem;
- padding: 10px 20px;
- border-radius: 8px;
- margin-bottom: 20px;
- width: 480px;
- box-sizing: border-box;
- text-align: center;
-}
-
.title {
font-family: var(--font-title);
font-size: 3rem;
@@ -36,8 +23,10 @@
border-radius: 10px;
overflow: hidden;
width: 480px;
+ max-width: calc(100vw - 56px);
margin-bottom: 30px;
padding: 6px 6px 6px 20px;
+ box-sizing: border-box;
}
.searchInput {
@@ -62,6 +51,7 @@
font-size: 0.95rem;
font-weight: 600;
cursor: pointer;
+ white-space: nowrap;
}
.searchBtn:hover {
@@ -71,9 +61,11 @@
.list {
width: 450px;
+ max-width: calc(100vw - 56px);
display: flex;
flex-direction: column;
gap: 12px;
+ box-sizing: border-box;
}
.studentItem {
@@ -87,6 +79,7 @@
cursor: pointer;
transition: background 0.2s;
width: 100%;
+ box-sizing: border-box;
}
.studentItem:hover { background: #4a4a4a; }
@@ -99,5 +92,22 @@
}
.arrow {
- width: 25px; height: 25px;
+ width: 25px;
+ height: 25px;
+ flex-shrink: 0;
+}
+
+/* ── 모바일 ── */
+@media (max-width: 480px) {
+ .container {
+ padding: 48px 28px;
+ }
+
+ .title {
+ font-size: 2.4rem;
+ margin-bottom: 28px;
+ text-align: center;
+ word-break: keep-all;
+ line-height: 1.2;
+ }
}
\ No newline at end of file