Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
31fd421
chore: 자산 내역 관련 아이콘 추가
wupe1001 Jan 13, 2026
74f10af
refactor: BackPageGNB 수정
wupe1001 Jan 13, 2026
c61fa36
feat: 자산 목록 및 단일 자산 내역 페이지 구현
wupe1001 Jan 13, 2026
f887d95
refactor: 자산 상세 페이지 UI 컴포넌트 분리
wupe1001 Jan 13, 2026
800dff3
refactor: 자산 상세 내역 로직을 커스텀 훅으로 분리
wupe1001 Jan 14, 2026
157c4bc
chore: 디자인 시스템 설정에 은행 컬러 추가
wupe1001 Jan 14, 2026
4855063
refactor: 하드코딩된 색상을 디자인 토큰으로 교체
wupe1001 Jan 14, 2026
418edec
refactor: 총 거래 내역 건수의 출처를 커스텀 훅으로 이동
wupe1001 Jan 14, 2026
c7e5c07
feat: 분야별 내역 UI 구현
seunghee0321 Jan 15, 2026
d8b6962
refactor: 상세 페이지 진입 시 중복 연산 제거 및 데이터 전달 로직 최적화
seunghee0321 Jan 15, 2026
1a3e016
refactor: 월별 조회 기능 구현
seunghee0321 Jan 15, 2026
8413de0
feat: 비교 분석 페이지 UI 구현
seunghee0321 Jan 15, 2026
bd0ce0d
refactor: 분석 페이지 컴포넌트 구조화 및 UI 최적화
seunghee0321 Jan 15, 2026
7f8b598
chore: 분야별 분석 및 비교 분석 기능 통합
seunghee0321 Jan 15, 2026
c757c5a
chore: 머지 충돌 해결 및 최신 main 반영
seunghee0321 Jan 22, 2026
eac866f
refactor: 분석 페이지 UI 수정 및 페이지 전환 로직 개선
seunghee0321 Jan 22, 2026
9bcbfd9
refactor: 바텀시트 수정 및 분야별 상세 모달 적용
seunghee0321 Jan 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5,078 changes: 3,193 additions & 1,885 deletions package-lock.json

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions src/assets/icons/asset/Cafe.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions src/assets/icons/asset/Dish.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions src/assets/icons/asset/Living.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions src/assets/icons/asset/Medical.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 6 additions & 0 deletions src/assets/icons/asset/Others.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 4 additions & 0 deletions src/assets/icons/asset/Pen.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions src/assets/icons/asset/Shopping-Bag.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 13 additions & 8 deletions src/components/common/BottomSheet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,28 @@ const BottomSheet = ({ isOpen, onClose, title, children }: BottomSheetProps) =>
<AnimatePresence>
{isOpen && (
<>
{/* 1. 배경(Dimmer): MobileLayout의 너비에 맞추고 중앙 정렬 */}
<motion.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
onClick={onClose}
className="fixed inset-0 z-[100] bg-black/40"
/> <motion.div
initial={{ y: '100%' }}
animate={{ y: 0 }}
exit={{ y: '100%' }}
className="fixed inset-0 z-[100] bg-black/40 w-full max-w-[360px] mx-auto left-0 right-0"
/>

{/* 2. 시트 본체: MobileLayout 하단에 딱 붙도록 설정 */}
<motion.div
initial={{ y: '100%', x: '-50%' }} // x: '-50%'는 중앙 정렬을 위해 필요해요!
animate={{ y: 0, x: '-50%' }}
exit={{ y: '100%', x: '-50%' }}
transition={{ type: 'spring', damping: 25, stiffness: 200 }}
className="fixed bottom-0 left-0 right-0 z-[101] rounded-t-3xl bg-white px-8 pb-10 pt-12 shadow-2xl"
// 💡 left-1/2와 max-w-[360px]가 핵심입니다! ㅋ
className="fixed bottom-0 left-1/2 z-[101] w-full max-w-[360px] rounded-t-3xl bg-white px-8 pb-10 pt-12 shadow-2xl"
>
<div className="absolute left-1/2 top-4 h-1.5 w-12 -translate-x-1/2 rounded-full bg-gray-200" />

{title && <h2 className="mb-8 text-2xl font-bold text-gray-900">{title}</h2>}

{children}
</motion.div>
</>
Expand Down
5 changes: 5 additions & 0 deletions src/components/skeleton/Skeleton.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { cn } from '@/utils/cn';

export const Skeleton = ({ className }: { className?: string }) => {
return <div className={cn('animate-pulse bg-neutral-10 rounded', className)} />;
};
17 changes: 17 additions & 0 deletions src/features/asset/constants/AssetSectionLayout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { ReactNode } from 'react';
import { cn } from '@/utils/cn';

interface AssetSectionLayoutProps {
children: ReactNode;
className?: string;
/** 하단 회색 구분선(8px) 표시 여부 (기본값: true) */
showDivider?: boolean;
}

export const AssetSectionLayout = ({ children, className, showDivider = true }: AssetSectionLayoutProps) => {
return (
<section className={cn('px-5 py-8 bg-white', showDivider && 'border-b-[8px] border-neutral-5', className)}>
{children}
</section>
);
};
2 changes: 1 addition & 1 deletion src/features/asset/constants/account.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,4 @@ export interface TransactionGroup {
totalIncome: number;
totalExpense: number;
items: TransactionItem[];
}
}
43 changes: 35 additions & 8 deletions src/features/asset/constants/category.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,47 @@
import WIcon from '@/assets/icons/asset/W.svg';
import LeisureIcon from '@/assets/icons/asset/Leisure.svg';
import TrafficIcon from '@/assets/icons/asset/Traffic.svg';
import FoodIcon from '@/assets/icons/asset/Food.svg';
//import FoodIcon from '@/assets/icons/asset/Food.svg';
import ShoppingIcon from '@/assets/icons/asset/Shopping.svg';
import MedicalIcon from '@/assets/icons/asset/Medical.svg';
import DishIcon from '@/assets/icons/asset/Dish.svg';
import ShoppingBag from '@/assets/icons/asset/Shopping-Bag.svg';
import LivingIcon from '@/assets/icons/asset/Living.svg';
import CafeIcon from '@/assets/icons/asset/Cafe.svg';
import DefaultIcon from '@/assets/icons/asset/Default.svg';
import OthersIcon from '@/assets/icons/asset/Others.svg';

export interface CategoryStyle {
bgColor: string;
barColor: string;
icon: string;
}

export const CATEGORY_STYLES: Record<string, CategoryStyle> = {
transfer: { bgColor: 'bg-atomic-yellow-90', icon: WIcon }, // 이체
shopping: { bgColor: 'bg-atomic-light-blue-90', icon: ShoppingIcon }, // 쇼핑
traffic: { bgColor: 'bg-atomic-red-90', icon: TrafficIcon }, // 교통
food: { bgColor: 'bg-atomic-yellow-90', icon: FoodIcon }, // 음식
leisure: { bgColor: 'bg-neutral-10', icon: LeisureIcon }, // 여가
default: { bgColor: 'bg-neutral-30', icon: DefaultIcon }, // 기본값
// 💡 새로 추가할 한글 라벨 정의
export const CATEGORY_LABELS: Record<string, string> = {
transfer: '이체',
traffic: '교통 · 자동차',
shopping: '쇼핑',
food: '식비',
leisure: '취미 · 여가',
medical: '의료 · 건강',
market: '편의점 · 마트 · 잡화',
living: '주거 · 통신',
cafe: '카페 · 디저트',
others: '그외', // 상세 페이지에서도 쓰이니 추가해두면 좋아요
default: '카테고리 없음',
};

export const CATEGORY_STYLES: Record<string, CategoryStyle> = {
transfer: { bgColor: 'bg-atomic-yellow-90', barColor: 'bg-atomic-yellow-50', icon: WIcon }, // 이체
shopping: { bgColor: 'bg-atomic-orange-90', barColor: 'bg-atomic-orange-50', icon: ShoppingBag }, // 쇼핑
traffic: { bgColor: 'bg-atomic-red-90', barColor: 'bg-atomic-red-50', icon: TrafficIcon }, // 교통
food: { bgColor: 'bg-atomic-blue-90', barColor: 'bg-atomic-blue-50', icon: DishIcon }, // 음식
leisure: { bgColor: 'bg-neutral-10', barColor: 'bg-neutral-30', icon: LeisureIcon }, // 여가
default: { bgColor: 'bg-neutral-30', barColor: 'bg-neutral-50', icon: DefaultIcon }, // 기본값
medical: { bgColor: 'bg-neutral-40', barColor: 'bg-neutral-60', icon: MedicalIcon }, // 의료
market: { bgColor: 'bg-atomic-light-blue-90', barColor: 'bg-atomic-light-blue-50', icon: ShoppingIcon }, // 마켓
living: { bgColor: 'bg-atomic-purple-90', barColor: 'bg-atomic-purple-50', icon: LivingIcon }, // 주거
cafe: { bgColor: 'bg-atomic-green-90', barColor: 'bg-atomic-green-50', icon: CafeIcon }, // 카페
others: { bgColor: 'bg-neutral-60', barColor: 'bg-neutral-80', icon: OthersIcon }, // 그외
};
Loading