From 92b223eea16adf4531bcc0a5d55bff9118a18916 Mon Sep 17 00:00:00 2001 From: caadiq Date: Tue, 24 Mar 2026 20:55:23 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=AA=A8=EB=B0=94=EC=9D=BC=20=EB=8C=80?= =?UTF-8?q?=EC=9D=91=20+=20=EC=82=AD=EC=A0=9C=20=EB=AA=A8=EB=93=9C=20UI=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 모바일: 헤더에 + 등록 버튼, 삭제는 아이콘 버튼 - 삭제 모드: 탭 아래 바에 전체선택/삭제/취소 배치 - 체크박스 CSS transition 애니메이션 - 100dvh 적용 (모바일 브라우저 대응) - 최소 너비 320px 설정 - 운송장 번호 공백/하이픈 자동 제거 - 날짜에 요일 표시 Co-Authored-By: Claude Opus 4.6 (1M context) --- frontend/src/App.jsx | 13 ++- frontend/src/pages/MainPage.jsx | 165 +++++++++++++++++++------------- 2 files changed, 110 insertions(+), 68 deletions(-) diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index af61dcb..7a824b0 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,23 +1,32 @@ +import { useState } from "react"; +import { Plus } from "lucide-react"; import MainPage from "@/pages/MainPage"; import Toast from "@/components/Toast"; import useToastStore from "@/stores/useToastStore"; function App() { const toastMessage = useToastStore((s) => s.message); + const [showForm, setShowForm] = useState(false); return ( -
+
Traeon 택배 배송조회 +
- +
diff --git a/frontend/src/pages/MainPage.jsx b/frontend/src/pages/MainPage.jsx index 1b959d8..7310d02 100644 --- a/frontend/src/pages/MainPage.jsx +++ b/frontend/src/pages/MainPage.jsx @@ -13,8 +13,7 @@ import { Loader2, Package, Trash2 } from "lucide-react"; const PAGE_LIMIT = 20; -function MainPage() { - const [showForm, setShowForm] = useState(false); +function MainPage({ showForm, setShowForm }) { const [selectedId, setSelectedId] = useState(null); const [deleteMode, setDeleteMode] = useState(false); const [checkedIds, setCheckedIds] = useState(new Set()); @@ -122,56 +121,91 @@ function MainPage() { return (
-
- -
- {deleteMode ? ( - <> - - - - - ) : ( - <> - {parcels.length > 0 && ( +
+
+ +
+ {!deleteMode && parcels.length > 0 && ( + <> - )} + + + )} + {!deleteMode && ( - - )} + )} +
+ + + {deleteMode && ( + +
+ +
+ + +
+
+
+ )} +
@@ -222,31 +256,30 @@ function MainPage() { }} >
- {deleteMode && ( - -
{ - e.stopPropagation(); - toggleCheck(parcel.id); - }} - className={`w-5 h-5 rounded-md border-2 flex items-center justify-center cursor-pointer transition-all ${ - checkedIds.has(parcel.id) - ? "bg-primary border-primary" - : "border-gray-300 hover:border-primary/50" - }`} - > - {checkedIds.has(parcel.id) && ( - - - - )} -
-
- )} +
{ + if (!deleteMode) return; + e.stopPropagation(); + toggleCheck(parcel.id); + }} + className={`w-5 h-5 rounded-md border-2 flex items-center justify-center shrink-0 transition-all duration-300 ${ + deleteMode + ? "opacity-100 scale-100 mr-0" + : "opacity-0 scale-0 w-0 -mr-2" + } ${ + deleteMode && checkedIds.has(parcel.id) + ? "bg-primary border-primary cursor-pointer" + : deleteMode + ? "border-gray-300 hover:border-primary/50 cursor-pointer" + : "border-transparent" + }`} + > + {checkedIds.has(parcel.id) && deleteMode && ( + + + + )} +