From 3c3118ebbb3cc5addffb74dde5e64bf386085862 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Wed, 9 Sep 2026 20:36:47 +0000 Subject: [PATCH 1/6] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20=EB=B9=84?= =?UTF-8?q?=EB=8F=99=EA=B8=B0=20=EB=B2=84=ED=8A=BC=20=EB=A1=9C=EB=94=A9=20?= =?UTF-8?q?=EC=8A=A4=ED=94=BC=EB=84=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 여러 모달(조직 생성/삭제, 프로젝트 생성/삭제/이름 변경) 및 폼(관리자 로그인, 비밀번호 재설정)의 비동기 버튼 상태에 `Loader2` 기반의 애니메이션 스피너를 추가하여 상태 피드백을 강화했습니다. - `aria-hidden="true"`를 적용하여 스크린 리더 접근성을 준수했습니다. --- .Jules/palette.md | 3 +++ .../web/src/components/admin/admin-login-form.tsx | 11 +++++++++-- .../web/src/components/auth/reset-password-form.tsx | 10 +++++++++- packages/web/src/components/org/create-org-modal.tsx | 10 +++++++++- .../web/src/components/org/create-project-modal.tsx | 10 +++++++++- packages/web/src/components/org/delete-org-modal.tsx | 10 +++++++++- .../web/src/components/org/delete-project-modal.tsx | 10 +++++++++- .../web/src/components/org/rename-project-modal.tsx | 10 +++++++++- 8 files changed, 66 insertions(+), 8 deletions(-) diff --git a/.Jules/palette.md b/.Jules/palette.md index 104c1e4b..667bcdb2 100644 --- a/.Jules/palette.md +++ b/.Jules/palette.md @@ -9,3 +9,6 @@ ## 2024-11-20 - CopyPromptButton 접근성 향상 (동적 텍스트 및 상태) **Learning:** `CopyPromptButton`과 같이 버튼을 클릭했을 때 시각적으로만 상태가 변하고(예: 복사 아이콘이 체크 아이콘으로 변경), 텍스트가 동적으로 변경되는 컴포넌트에서는 스크린 리더 사용자가 상태 변화를 알아채기 어렵습니다. 또한 스크린 리더가 순수 장식용 아이콘까지 불필요하게 읽을 수 있습니다. **Action:** 동적으로 변경되는 텍스트를 ``로 감싸 스크린 리더가 즉시 변경 사항을 읽어주도록 해야 합니다. ` diff --git a/packages/web/src/components/auth/reset-password-form.tsx b/packages/web/src/components/auth/reset-password-form.tsx index 99066a69..be0c7c68 100644 --- a/packages/web/src/components/auth/reset-password-form.tsx +++ b/packages/web/src/components/auth/reset-password-form.tsx @@ -2,6 +2,7 @@ import { useState } from 'react' import Link from 'next/link' +import { Loader2 } from 'lucide-react' import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' import { Button, buttonVariants } from '@/components/ui/button' @@ -110,7 +111,14 @@ export function ResetPasswordForm({ token, email }: ResetPasswordFormProps) { )} diff --git a/packages/web/src/components/org/create-org-modal.tsx b/packages/web/src/components/org/create-org-modal.tsx index 37d84620..d51fd20e 100644 --- a/packages/web/src/components/org/create-org-modal.tsx +++ b/packages/web/src/components/org/create-org-modal.tsx @@ -1,6 +1,7 @@ 'use client' import { useState, useEffect } from 'react' +import { Loader2 } from 'lucide-react' import { useRouter } from 'next/navigation' import { AlertDialog, @@ -116,7 +117,14 @@ export function CreateOrgModal({ open, onOpenChange }: CreateOrgModalProps) { size="sm" disabled={!name.trim() || mutation.isPending} > - {mutation.isPending ? '생성 중…' : '생성'} + {mutation.isPending ? ( + <> +