From 61751bb6e5a45b8a2f74148cc5b63f5a477cda96 Mon Sep 17 00:00:00 2001 From: Ryu Tae Hyun Date: Tue, 1 Sep 2026 13:53:17 +0900 Subject: [PATCH 1/7] =?UTF-8?q?fix(ui):=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=EA=B3=BC=20=EB=B0=A9=20=ED=8E=B8=EC=A7=91=20=EC=B9=98=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../create/ui/EditRoomFormModal.module.css | 34 ++++++++++--------- .../hooks/useProfileSettingsForm.test.tsx | 2 +- .../settings/model/profileSettingsLimits.ts | 2 +- .../settings/ui/ProfileSettingsTab.test.tsx | 6 ++-- .../ui/components/ProfileSettingsForm.tsx | 2 +- .../profile/ui/UserProfileContent.module.css | 13 +++++-- .../profile/ui/UserProfileContent.test.tsx | 4 +++ .../user/profile/ui/UserProfileContent.tsx | 5 ++- 8 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/features/room/create/ui/EditRoomFormModal.module.css b/src/features/room/create/ui/EditRoomFormModal.module.css index 331e7eba..f674cbc3 100644 --- a/src/features/room/create/ui/EditRoomFormModal.module.css +++ b/src/features/room/create/ui/EditRoomFormModal.module.css @@ -5,13 +5,15 @@ display: flex; align-items: center; justify-content: center; - padding: 24px; + padding: 24px 16px; background: rgba(255, 255, 255, 0.86); } .modal { + --edit-room-control-height: 56px; + position: relative; - width: min(816px, 100%); + width: min(688px, 100%); height: min(1236px, calc(100dvh - 48px)); min-height: min(720px, calc(100dvh - 48px)); overflow: hidden; @@ -171,7 +173,7 @@ .select, .participationInput { width: 100%; - height: 56px; + height: var(--edit-room-control-height); box-sizing: border-box; border: 1px solid #d9d9d9; border-radius: 10px; @@ -368,8 +370,8 @@ top: 0; right: 0; display: inline-flex; - width: 56px; - height: 56px; + width: var(--edit-room-control-height); + height: var(--edit-room-control-height); align-items: center; justify-content: center; padding: 0; @@ -476,7 +478,7 @@ .footerButton { display: inline-flex; width: 100%; - height: 68px; + height: var(--edit-room-control-height); align-items: center; justify-content: center; border: 1px solid #242424; @@ -535,6 +537,8 @@ } .modal { + --edit-room-control-height: 52px; + width: 100%; height: calc(100dvh - 24px); min-height: 0; @@ -570,7 +574,6 @@ .titleInput, .select, .participationInput { - height: 52px; font-size: 16px; } @@ -599,8 +602,8 @@ } .participationToggle { - width: 52px; - height: 52px; + width: var(--edit-room-control-height); + height: var(--edit-room-control-height); } .formFooter { @@ -608,18 +611,19 @@ } .footerButton { - height: 56px; font-size: 16px; } } @media (min-width: 481px) and (max-width: 1600px) and (max-height: 900px) { .overlay { - padding: 19.2px; + padding: 19.2px 16px; } .modal { - width: min(652.8px, 100%); + --edit-room-control-height: 44.8px; + + width: min(550.4px, 100%); height: min(988.8px, calc(100dvh - 38.4px)); min-height: min(576px, calc(100dvh - 38.4px)); border-radius: 12.8px; @@ -671,7 +675,6 @@ .titleInput, .select, .participationInput { - height: 44.8px; border-radius: 8px; font-size: 13.6px; } @@ -728,8 +731,8 @@ } .participationToggle { - width: 44.8px; - height: 44.8px; + width: var(--edit-room-control-height); + height: var(--edit-room-control-height); border-radius: 0 8px 8px 0; } @@ -756,7 +759,6 @@ } .footerButton { - height: 54.4px; font-size: 14.4px; } } diff --git a/src/features/settings/hooks/useProfileSettingsForm.test.tsx b/src/features/settings/hooks/useProfileSettingsForm.test.tsx index ecace896..bef1b2dd 100644 --- a/src/features/settings/hooks/useProfileSettingsForm.test.tsx +++ b/src/features/settings/hooks/useProfileSettingsForm.test.tsx @@ -145,7 +145,7 @@ describe("프로필 통합 저장 폼", () => { expect(result.current.canUpdateProfile).toBe(false); }); - it("줄바꿈을 제거하고 20자로 제한한다", () => { + it("줄바꿈을 제거하고 최애곡 최대 길이로 제한한다", () => { const { result } = renderProfileForm(); act(() => diff --git a/src/features/settings/model/profileSettingsLimits.ts b/src/features/settings/model/profileSettingsLimits.ts index 7ddb98d1..45ce1446 100644 --- a/src/features/settings/model/profileSettingsLimits.ts +++ b/src/features/settings/model/profileSettingsLimits.ts @@ -1,3 +1,3 @@ -export const STATUS_MESSAGE_MAX_LENGTH = 20; +export const STATUS_MESSAGE_MAX_LENGTH = 40; export const NICKNAME_MIN_LENGTH = 2; export const NICKNAME_MAX_LENGTH = 19; diff --git a/src/features/settings/ui/ProfileSettingsTab.test.tsx b/src/features/settings/ui/ProfileSettingsTab.test.tsx index 303e94b0..0c707226 100644 --- a/src/features/settings/ui/ProfileSettingsTab.test.tsx +++ b/src/features/settings/ui/ProfileSettingsTab.test.tsx @@ -23,7 +23,7 @@ vi.mock("@/src/features/badge/hooks/useSetRepresentativeBadge", () => ({ useSetRepresentativeBadge: vi.fn(), })); vi.mock("../hooks/useProfileSettingsForm", () => ({ - STATUS_MESSAGE_MAX_LENGTH: 20, + STATUS_MESSAGE_MAX_LENGTH: 40, useProfileSettingsForm: vi.fn(), })); vi.mock("@/src/shared/ui/action-feedback/ActionFeedbackProvider", () => ({ @@ -184,9 +184,9 @@ describe("설정 칭호 목록", () => { expect(screen.getByText("2/19")).toBeInTheDocument(); expect(screen.getByLabelText("최애곡")).toHaveAttribute( "maxlength", - "20", + "40", ); - expect(screen.getByText("2/20")).toBeInTheDocument(); + expect(screen.getByText("2/40")).toBeInTheDocument(); }); it("획득한 칭호를 선택하면 badgeCode만 대표 칭호 mutation에 전달한다", async () => { diff --git a/src/features/settings/ui/components/ProfileSettingsForm.tsx b/src/features/settings/ui/components/ProfileSettingsForm.tsx index a1cce393..df3b9cdc 100644 --- a/src/features/settings/ui/components/ProfileSettingsForm.tsx +++ b/src/features/settings/ui/components/ProfileSettingsForm.tsx @@ -152,7 +152,7 @@ export default function ProfileSettingsForm({ - 최대 20자, 빈 문자열로 저장하면 삭제됩니다. + 최대 {STATUS_MESSAGE_MAX_LENGTH}자, 빈 문자열로 저장하면 삭제됩니다. 최애곡 입력을 확인해 주세요. diff --git a/src/features/user/profile/ui/UserProfileContent.module.css b/src/features/user/profile/ui/UserProfileContent.module.css index 28926270..284fa22b 100644 --- a/src/features/user/profile/ui/UserProfileContent.module.css +++ b/src/features/user/profile/ui/UserProfileContent.module.css @@ -67,8 +67,7 @@ text-overflow: ellipsis; white-space: nowrap; } -.name[data-line-clamp="2"], -.statusCardValue[data-line-clamp="2"] { +.name[data-line-clamp="2"] { display: -webkit-box; overflow: hidden; text-overflow: ellipsis; @@ -122,8 +121,16 @@ text-overflow: ellipsis; white-space: nowrap; } +.statusCardValue[data-line-clamp="2"] { + overflow: visible; + text-overflow: clip; + white-space: normal; +} .favoriteSongValueSlot { - height: 1lh; + min-height: 1lh; +} +.favoriteSongValueSlot[data-line-clamp="2"] { + min-height: 2lh; } .musicPowerRow { min-width: 0; diff --git a/src/features/user/profile/ui/UserProfileContent.test.tsx b/src/features/user/profile/ui/UserProfileContent.test.tsx index ab94f1e8..4e8473fb 100644 --- a/src/features/user/profile/ui/UserProfileContent.test.tsx +++ b/src/features/user/profile/ui/UserProfileContent.test.tsx @@ -34,6 +34,10 @@ describe("UserProfileContent", () => { "첫 번째 줄을 채우고 두 번째 줄까지 이어지는 최애곡", ); expect(favoriteSongValue).toHaveAttribute("data-line-clamp", "2"); + expect(favoriteSongValue.parentElement).toHaveAttribute( + "data-line-clamp", + "2", + ); expect(favoriteSongValue.parentElement?.parentElement).toBe( screen.getByText("최애곡").parentElement, ); diff --git a/src/features/user/profile/ui/UserProfileContent.tsx b/src/features/user/profile/ui/UserProfileContent.tsx index da21b865..040243b8 100644 --- a/src/features/user/profile/ui/UserProfileContent.tsx +++ b/src/features/user/profile/ui/UserProfileContent.tsx @@ -128,7 +128,10 @@ export default function UserProfileContent({
최애곡
-
+
Date: Tue, 1 Sep 2026 13:53:30 +0900 Subject: [PATCH 2/7] =?UTF-8?q?fix(playlist):=20=EB=85=B8=EB=9E=98=20?= =?UTF-8?q?=EC=8B=A0=EC=B2=AD=20=EB=AC=B8=EA=B5=AC=EC=99=80=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hooks/useAddTrackAction.test.tsx | 4 +-- .../add-track/hooks/useAddTrackAction.ts | 2 +- .../add-track/ui/AddTrackFormFields.test.tsx | 13 +++++++++- .../add-track/ui/AddTrackFormFields.tsx | 4 +-- .../add-track/ui/AddTrackModal.module.css | 25 ++++++++++++++----- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/features/playlist/add-track/hooks/useAddTrackAction.test.tsx b/src/features/playlist/add-track/hooks/useAddTrackAction.test.tsx index 7d547d1f..7cf28903 100644 --- a/src/features/playlist/add-track/hooks/useAddTrackAction.test.tsx +++ b/src/features/playlist/add-track/hooks/useAddTrackAction.test.tsx @@ -184,11 +184,11 @@ describe("useAddTrackAction", () => { expect(mocks.setError).toHaveBeenCalledWith( "story", - "사연은 30자 이하로 입력해주세요.", + "노래 선정 이유는 30자 이하로 입력해주세요.", ); expect(mocks.notify).toHaveBeenCalledWith({ dedupeKey: "add-track:room:story", - message: "사연은 30자 이하로 입력해주세요.", + message: "노래 선정 이유는 30자 이하로 입력해주세요.", tone: "error", }); }); diff --git a/src/features/playlist/add-track/hooks/useAddTrackAction.ts b/src/features/playlist/add-track/hooks/useAddTrackAction.ts index 4b95fc49..58bbef87 100644 --- a/src/features/playlist/add-track/hooks/useAddTrackAction.ts +++ b/src/features/playlist/add-track/hooks/useAddTrackAction.ts @@ -193,7 +193,7 @@ export function useAddTrackAction(slug: string, roomAccessToken: string) { const story = form.storyValue.trim(); if (story.length > ADD_TRACK_STORY_MAX_LENGTH) { - showError("story", "사연은 30자 이하로 입력해주세요."); + showError("story", "노래 선정 이유는 30자 이하로 입력해주세요."); return; } diff --git a/src/features/playlist/add-track/ui/AddTrackFormFields.test.tsx b/src/features/playlist/add-track/ui/AddTrackFormFields.test.tsx index 5e690f68..6cc0bc8f 100644 --- a/src/features/playlist/add-track/ui/AddTrackFormFields.test.tsx +++ b/src/features/playlist/add-track/ui/AddTrackFormFields.test.tsx @@ -19,6 +19,17 @@ function renderFields(errorField: "url" | "story") { } describe("AddTrackFormFields", () => { + it("신청 사연을 노래 선정 이유로 안내한다", () => { + renderFields("url"); + + expect(screen.getByText("노래 선정 이유 (선택)")).toBeInTheDocument(); + expect( + screen.getByPlaceholderText( + "이 노래를 선정한 이유나 전하고 싶은 말을 적어주세요", + ), + ).toBeInTheDocument(); + }); + it("URL 오류를 URL 입력의 aria-invalid와 SR 설명에 연결한다", () => { renderFields("url"); @@ -33,7 +44,7 @@ describe("AddTrackFormFields", () => { renderFields("story"); const textarea = screen.getByPlaceholderText( - "함께 듣고 싶은 이유나 전하고 싶은 말을 적어주세요", + "이 노래를 선정한 이유나 전하고 싶은 말을 적어주세요", ); expect(textarea).toHaveAttribute("aria-invalid", "true"); expect(textarea).toHaveAttribute("aria-describedby", "add-track-error"); diff --git a/src/features/playlist/add-track/ui/AddTrackFormFields.tsx b/src/features/playlist/add-track/ui/AddTrackFormFields.tsx index 1874755a..8fa863b3 100644 --- a/src/features/playlist/add-track/ui/AddTrackFormFields.tsx +++ b/src/features/playlist/add-track/ui/AddTrackFormFields.tsx @@ -55,7 +55,7 @@ export default function AddTrackFormFields({