From de3adc0ad6cbaa1d5ccc22e15ce7de107d1a2972 Mon Sep 17 00:00:00 2001 From: caadiq Date: Sun, 5 Apr 2026 14:03:48 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=98=88=EB=8A=A5=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=8D=B8=EB=84=A4?= =?UTF-8?q?=EC=9D=BC/=EC=A0=95=EB=B3=B4=20=EB=B6=84=EB=A6=AC=20=EB=A0=88?= =?UTF-8?q?=EC=9D=B4=EC=95=84=EC=9B=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가로 flex → 세로 분리 (썸네일 카드 + 정보 카드) - 썸네일: object-contain으로 원본 비율 유지, max-h 제한 - 기본 이미지: 카테고리 색상 배경 + Tv 아이콘 - 제목이 길어져도 레이아웃 깨지지 않음 - PC/모바일 모두 적용 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../pages/mobile/schedule/ScheduleDetail.jsx | 140 ++++++++--------- .../schedule/sections/VarietySection.jsx | 146 +++++++++--------- 2 files changed, 138 insertions(+), 148 deletions(-) diff --git a/frontend/src/pages/mobile/schedule/ScheduleDetail.jsx b/frontend/src/pages/mobile/schedule/ScheduleDetail.jsx index 104c434..d1e343b 100644 --- a/frontend/src/pages/mobile/schedule/ScheduleDetail.jsx +++ b/frontend/src/pages/mobile/schedule/ScheduleDetail.jsx @@ -484,89 +484,83 @@ function MobileVarietySection({ schedule }) { const hasThumbnail = !!schedule.thumbnailUrl; const hasReplayUrl = !!schedule.replayUrl; const isYoutubeReplay = hasReplayUrl && /youtu\.?be/i.test(schedule.replayUrl); + const categoryColor = schedule.category?.color || '#06b6d4'; return ( -
-
- {/* 썸네일 */} -
- {hasThumbnail ? ( - {schedule.title} - ) : ( -
+ {/* 썸네일 카드 */} +
+ {hasThumbnail ? ( + {schedule.title} + ) : ( +
+ +
+ )} +
+ + {/* 정보 카드 */} +
+ {/* 방송사 + 날짜 */} +
+ {schedule.broadcaster && ( + - -
+ + {schedule.broadcaster} + )} + + {formatFullDate(schedule.date)} + {schedule.time && ` · ${formatTime(schedule.time)}`} +
- {/* 콘텐츠 */} -
- {/* 상단 */} -
- {/* 방송사 + 날짜 */} -
- {schedule.broadcaster && ( - - - {schedule.broadcaster} - - )} - - {formatFullDate(schedule.date)} + {/* 제목 */} +

+ {decodeHtmlEntities(schedule.title)} +

+ + {/* 멤버 */} + {members.length > 0 && ( +
+ {isFullGroup ? ( + + 프로미스나인 -
- - {/* 제목 */} -

- {decodeHtmlEntities(schedule.title)} -

- - {/* 멤버 */} - {members.length > 0 && ( -
- {isFullGroup ? ( - - 프로미스나인 - - ) : ( - members.map((member) => ( - - {member.name} - - )) - )} -
+ ) : ( + members.map((member) => ( + + {member.name} + + )) )}
+ )} - {/* 다시보기 */} - {hasReplayUrl && ( - - )} -
+ {/* 다시보기 */} + {hasReplayUrl && ( + + )}
); diff --git a/frontend/src/pages/pc/public/schedule/sections/VarietySection.jsx b/frontend/src/pages/pc/public/schedule/sections/VarietySection.jsx index 9605dc7..d22348f 100644 --- a/frontend/src/pages/pc/public/schedule/sections/VarietySection.jsx +++ b/frontend/src/pages/pc/public/schedule/sections/VarietySection.jsx @@ -10,87 +10,83 @@ function VarietySection({ schedule }) { const hasThumbnail = !!schedule.thumbnailUrl; const hasReplayUrl = !!schedule.replayUrl; const isYoutubeReplay = hasReplayUrl && /youtu\.?be/i.test(schedule.replayUrl); + const categoryColor = schedule.category?.color || '#06b6d4'; return ( -
-
- {/* 왼쪽: 썸네일 */} -
- {hasThumbnail ? ( - {schedule.title} - ) : ( -
- -
- )} -
- - {/* 오른쪽: 콘텐츠 */} -
- {/* 방송사 + 날짜 */} -
- {schedule.broadcaster && ( - - - {schedule.broadcaster} - - )} - - {formatFullDate(schedule.date)} - {schedule.time && ` · ${formatTime(schedule.time)}`} - +
+ {/* 썸네일 카드 */} +
+ {hasThumbnail ? ( + {schedule.title} + ) : ( +
+
+ )} +
- {/* 제목 */} -

- {decodeHtmlEntities(schedule.title)} -

- - {/* 멤버 */} - {members.length > 0 && ( -
- {isFullGroup ? ( - - 프로미스나인 - - ) : ( - members.map((member) => ( - - {member.name} - - )) - )} -
- )} - - {/* 다시보기 (하단 고정) */} - {hasReplayUrl && ( - + {/* 정보 카드 */} +
+ {/* 방송사 + 날짜 */} +
+ {schedule.broadcaster && ( + + + {schedule.broadcaster} + )} + + {formatFullDate(schedule.date)} + {schedule.time && ` · ${formatTime(schedule.time)}`} +
+ + {/* 제목 */} +

+ {decodeHtmlEntities(schedule.title)} +

+ + {/* 멤버 */} + {members.length > 0 && ( +
+ {isFullGroup ? ( + + 프로미스나인 + + ) : ( + members.map((member) => ( + + {member.name} + + )) + )} +
+ )} + + {/* 다시보기 */} + {hasReplayUrl && ( + + )}
);