+
Date: Fri, 6 Nov 2026 12:19:36 +0900
Subject: [PATCH 6/7] =?UTF-8?q?feat:=20=EC=86=A1=EA=B8=88=20=ED=99=95?=
=?UTF-8?q?=EC=9D=B8=20=ED=86=A0=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EB=B2=84?=
=?UTF-8?q?=ED=8A=BC=20=EC=9C=84=EB=A1=9C=20=EC=98=AC=EB=A6=AC=EA=B3=A0=20?=
=?UTF-8?q?=EC=86=A1=EA=B8=88=20=EA=B8=88=EC=95=A1=EC=9D=84=20=EA=B0=95?=
=?UTF-8?q?=EC=A1=B0=ED=95=B4=20=EC=95=88=EB=82=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/features/fee/FeeTransferScreen.tsx | 17 ++++++++---------
.../fee/steps/FeeTransferMethodStep.tsx | 18 ++++++++++++++++--
2 files changed, 24 insertions(+), 11 deletions(-)
diff --git a/src/features/fee/FeeTransferScreen.tsx b/src/features/fee/FeeTransferScreen.tsx
index 8e0ca357..0eaec4a1 100644
--- a/src/features/fee/FeeTransferScreen.tsx
+++ b/src/features/fee/FeeTransferScreen.tsx
@@ -6,7 +6,6 @@ import ScreenToast from "@/components/ui/ScreenToast";
import FeeTransferSkeleton from "@/features/fee/components/FeeTransferSkeleton";
import {
FEE_PAYMENTS_PATH,
- formatWon,
isAcceptableTranscript,
} from "@/features/fee/constants/fee";
import {
@@ -64,17 +63,17 @@ const TOAST_MESSAGES = {
submitFailed: "납부 확인 요청에 실패했어요. 다시 시도해 주세요.",
} as const;
-// 계좌이체 안내 — 계좌번호는 화면에 보여 주지 않아서 토스트로만 알린다. 은행 앱에서 금액을 직접 넣어야 해서
-// 보낼 금액을 같이 적는다. 복사가 막히면(앱 WebView 등) 계좌번호를 토스트에 담아 길게 띄워 보고 보낼 수 있게 한다.
+// 계좌이체 안내 — 계좌번호는 화면에 보여 주지 않아서 토스트로만 알린다. 보낼 금액은 송금 방법 화면 설명에서
+// 강조해 보여 줘서 토스트에는 적지 않는다. 복사가 막히면(앱 WebView 등) 계좌번호를 토스트에 담아 길게 띄워 보고 보낼 수 있게 한다.
// 계좌번호 끝 숫자에 따라 조사(로/으로)가 달라져서 "계좌로"로 끝맺는다. 은행 이름과 계좌번호 사이는
// 줄바꿈 없는 공백(U+00A0)이라 토스트에서 둘이 다른 줄로 갈라지지 않는다.
// 복사가 막혔을 때는 계좌번호를 읽고 옮겨 적어야 해서 15초 띄운다(WDS Toast long은 5초뿐이다).
const ACCOUNT_COPY_FAILED_TOAST_DURATION_MS = 15_000;
const ACCOUNT_TOAST_MESSAGES = {
- copied: (amount: string) => `계좌번호를 복사했어요. ${amount}을 보내 주세요.`,
- copyFailed: (bank: string, accountNo: string, amount: string) =>
- `복사하지 못했어요. ${bank}\u00a0${accountNo} 계좌로 ${amount}을 보내 주세요.`,
+ copied: "계좌번호를 복사했어요.",
+ copyFailed: (bank: string, accountNo: string) =>
+ `복사하지 못했어요. ${bank}\u00a0${accountNo} 계좌로 보내 주세요.`,
};
interface ToastState {
@@ -238,12 +237,11 @@ function FeeTransferFunnel() {
// 은행 앱에서 보내고 돌아오면 송금 확인 단계가 기다리게 바로 넘긴다(토스와 같다).
// 복사가 막혀도 토스트에 담긴 계좌로 보낼 수 있어서 같이 넘긴다 — 여기서 멈추면 다음으로 갈 길이 없다
onCopyAccount={() => {
- const amount = formatWon(context.transferAmount);
// 은행 앱이 붙여 넣은 계좌를 알아보기 쉽게 은행 이름을 붙여 복사한다
copyText(`${context.bank} ${context.accountNo}`).then(
(isCopied) => {
if (isCopied) {
- showToast(ACCOUNT_TOAST_MESSAGES.copied(amount), {
+ showToast(ACCOUNT_TOAST_MESSAGES.copied, {
variant: "positive",
});
} else {
@@ -251,7 +249,6 @@ function FeeTransferFunnel() {
ACCOUNT_TOAST_MESSAGES.copyFailed(
context.bank,
context.accountNo,
- amount,
),
{
duration: ACCOUNT_COPY_FAILED_TOAST_DURATION_MS,
@@ -345,6 +342,8 @@ function FeeTransferFunnel() {
setToast((prev) => ({ ...prev, isOpen: false }));
}
}}
+ // 송금 확인 단계만 메인 버튼 아래 "다음에 할게요"가 쌓여 있어서 그 위로 올린다(복사 안내·요청 실패 토스트가 버튼을 가리지 않게)
+ aboveStackedActions={funnel.step === "confirm"}
open={toast.isOpen}
variant={toast.variant}
/>
diff --git a/src/features/fee/steps/FeeTransferMethodStep.tsx b/src/features/fee/steps/FeeTransferMethodStep.tsx
index 1a94f866..dff0fad6 100644
--- a/src/features/fee/steps/FeeTransferMethodStep.tsx
+++ b/src/features/fee/steps/FeeTransferMethodStep.tsx
@@ -1,4 +1,4 @@
-import { ActionAreaButton, RadioGroup } from "@wanteddev/wds";
+import { ActionAreaButton, RadioGroup, Typography } from "@wanteddev/wds";
import { useState } from "react";
import FeeTransferMethodOption from "@/features/fee/components/FeeTransferMethodOption";
@@ -93,7 +93,21 @@ function FeeTransferMethodStep({
)
}
- description={`학생회비는 한 학기에 ${formatWon(amountPerSemester)}이에요.\n남은 ${remainingSemesters}학기만큼 ${formatWon(transferAmount)}을 보내 주세요.`}
+ // 보낼 금액은 계좌이체면 은행 앱에 직접 넣어야 해서(토스트에는 적지 않는다) Primary 굵게 강조한다
+ description={
+ <>
+ {`학생회비는 한 학기에 ${formatWon(amountPerSemester)}이에요.\n남은 ${remainingSemesters}학기만큼 `}
+
+ {formatWon(transferAmount)}
+
+ 을 보내 주세요.
+ >
+ }
onBack={onBack}
title="어떻게 송금할까요?"
>
From c8ff38facf4875d2e604fa987df27eec9b9bb36b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=EC=9D=B4=EC=84=9C=EC=A4=80?=
<104981505+xeoxxn@users.noreply.github.com>
Date: Fri, 6 Nov 2026 12:19:36 +0900
Subject: [PATCH 7/7] =?UTF-8?q?docs:=20=ED=86=A0=EC=8A=A4=ED=8A=B8=20?=
=?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=98=B5=EC=85=98=EA=B3=BC=20=EC=86=A1?=
=?UTF-8?q?=EA=B8=88=20=EA=B8=88=EC=95=A1=20=EA=B0=95=EC=A1=B0=20=EB=B0=98?=
=?UTF-8?q?=EC=98=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
docs/conventions/wds-component-usage.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/docs/conventions/wds-component-usage.md b/docs/conventions/wds-component-usage.md
index 82edf857..f629effd 100644
--- a/docs/conventions/wds-component-usage.md
+++ b/docs/conventions/wds-component-usage.md
@@ -304,6 +304,7 @@ Figma 상세는 뒤로가기 버튼이 Hero 이미지 **위에 떠 있는** 오
코드는 `src/components/ui/ScreenToast.tsx`. 화면 위에 토스트를 띄우는 자리는 앞으로도 같을 것이라 공용으로 뒀다.
떠 있는 시간은 WDS Toast 기본값 3초(`duration="short"`)이고 `"long"`은 5초다(16초는 Snackbar의 long이다). 읽고 옮겨 적어야 하는 문구(복사가 막혔을 때의 학생회비 계좌번호)는 ms 숫자로 길게 준다(15초).
+메인 버튼 아래 텍스트 버튼이 하나 더 쌓인 화면(`ActionArea variant="strong"` — 학생회비 송금 확인)에서는 기본 위치(아래에서 100px)면 토스트가 메인 버튼을 28px 가린다. `aboveStackedActions`를 켜면 152px로 올라가 메인 버튼과의 간격이 버튼 하나일 때와 같은 24px이 된다(텍스트 버튼 44px + 간격 8px만큼).
## 행사 신청 완료 화면(`1712:192283`) 구현 중 확정된 매핑
@@ -890,7 +891,7 @@ Figma는 같은 알림 설정 화면을 **설정 섹션(`3524:152367`)과 알림
**송금 방법 단계(`FeeTransferMethodStep`)는 Figma에 없다.** 토스를 쓰지 않는 학생도 낼 수 있게 토스 이동 안내(`3562:163025`) 자리를 "어떻게 송금할까요?"로 바꿨다. WDS `RadioGroup` 안에 선택 카드 두 개(`FeeTransferMethodOption` — `RadioGroupItem`에 label prop이 없어서 카드 전체를 `