-
Welcome to Your Blank App
-
Start building your amazing project here!
+
+
+ {/* Header */}
+
+
+ {/* Balance Card */}
+
+
+
+
+ ₩2,580,000
+
+
+ 지난 달보다 12% 증가
+
+
+
+ {/* Budget Progress */}
+
예산 현황
+
+
+
+
+
+
+ {/* Recent Transactions */}
+
최근 거래
+
+ {transactions.map(transaction => (
+
+ ))}
+
+
+
+
+
+
+
+
);
};
diff --git a/src/pages/Settings.tsx b/src/pages/Settings.tsx
new file mode 100644
index 0000000..89349d5
--- /dev/null
+++ b/src/pages/Settings.tsx
@@ -0,0 +1,113 @@
+
+import React from 'react';
+import NavBar from '@/components/NavBar';
+import { User, CreditCard, Bell, Lock, HelpCircle, LogOut, ChevronRight } from 'lucide-react';
+import { cn } from '@/lib/utils';
+
+const SettingsOption = ({
+ icon: Icon,
+ label,
+ description,
+ onClick,
+ color = "text-gray-700"
+}: {
+ icon: React.ElementType;
+ label: string;
+ description?: string;
+ onClick?: () => void;
+ color?: string;
+}) => {
+ return (
+
+
+
+
+
+
+
{label}
+ {description &&
{description}
}
+
+
+
+
+ );
+};
+
+const Settings = () => {
+ return (
+
+
+ {/* Header */}
+
+ 설정
+
+ {/* User Profile */}
+
+
+
+
+
+
홍길동
+
honggildong@example.com
+
+
+
+
+ {/* Settings Options */}
+
+
계정
+
+
+
+
+
+
+
앱 설정
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default Settings;
diff --git a/src/pages/Transactions.tsx b/src/pages/Transactions.tsx
new file mode 100644
index 0000000..64019cd
--- /dev/null
+++ b/src/pages/Transactions.tsx
@@ -0,0 +1,146 @@
+
+import React, { useState } from 'react';
+import NavBar from '@/components/NavBar';
+import TransactionCard, { Transaction } from '@/components/TransactionCard';
+import AddTransactionButton from '@/components/AddTransactionButton';
+import { Calendar, Search, ChevronLeft, ChevronRight } from 'lucide-react';
+
+const Transactions = () => {
+ const [selectedMonth, setSelectedMonth] = useState('8월');
+
+ // Sample data - in a real app, this would come from a data source
+ const transactions: Transaction[] = [
+ {
+ id: '1',
+ title: '식료품 구매',
+ amount: 25000,
+ date: '8월 25일, 12:30 PM',
+ category: 'shopping',
+ type: 'expense'
+ },
+ {
+ id: '2',
+ title: '주유소',
+ amount: 50000,
+ date: '8월 24일, 3:45 PM',
+ category: 'transportation',
+ type: 'expense'
+ },
+ {
+ id: '3',
+ title: '월급',
+ amount: 2500000,
+ date: '8월 20일, 9:00 AM',
+ category: 'income',
+ type: 'income'
+ },
+ {
+ id: '4',
+ title: '아마존 프라임',
+ amount: 9900,
+ date: '8월 18일, 6:00 AM',
+ category: 'entertainment',
+ type: 'expense'
+ },
+ {
+ id: '5',
+ title: '집세',
+ amount: 650000,
+ date: '8월 15일, 10:00 AM',
+ category: 'housing',
+ type: 'expense'
+ },
+ {
+ id: '6',
+ title: '카페',
+ amount: 5500,
+ date: '8월 12일, 2:15 PM',
+ category: 'food',
+ type: 'expense'
+ },
+ ];
+
+ // Group transactions by date
+ const groupedTransactions: Record
= {};
+
+ transactions.forEach(transaction => {
+ const datePart = transaction.date.split(',')[0];
+ if (!groupedTransactions[datePart]) {
+ groupedTransactions[datePart] = [];
+ }
+ groupedTransactions[datePart].push(transaction);
+ });
+
+ return (
+
+
+ {/* Header */}
+
+ 거래 내역
+
+ {/* Search */}
+
+
+
+
+
+ {/* Month Selector */}
+
+
+
+
+
+ {selectedMonth}
+
+
+
+
+
+ {/* Summary */}
+
+
+
+ {/* Transactions By Date */}
+
+ {Object.entries(groupedTransactions).map(([date, transactions]) => (
+
+
+
+
+ {transactions.map(transaction => (
+
+ ))}
+
+
+ ))}
+
+
+
+
+
+
+ );
+};
+
+export default Transactions;
diff --git a/tailwind.config.ts b/tailwind.config.ts
index 8706086..3496d69 100644
--- a/tailwind.config.ts
+++ b/tailwind.config.ts
@@ -1,3 +1,4 @@
+
import type { Config } from "tailwindcss";
export default {
@@ -61,6 +62,17 @@ export default {
'accent-foreground': 'hsl(var(--sidebar-accent-foreground))',
border: 'hsl(var(--sidebar-border))',
ring: 'hsl(var(--sidebar-ring))'
+ },
+ neuro: {
+ background: '#f0f0f3',
+ light: '#ffffff',
+ dark: '#d1d9e6',
+ shadow: 'rgba(209, 217, 230, 0.5)',
+ highlight: 'rgba(255, 255, 255, 0.5)',
+ accent: '#6e59a5',
+ 'accent-light': '#9b87f5',
+ expense: '#e57373',
+ income: '#81c784'
}
},
borderRadius: {
@@ -84,11 +96,46 @@ export default {
to: {
height: '0'
}
+ },
+ 'float': {
+ '0%, 100%': { transform: 'translateY(0)' },
+ '50%': { transform: 'translateY(-5px)' }
+ },
+ 'pulse-subtle': {
+ '0%, 100%': { opacity: '1' },
+ '50%': { opacity: '0.8' }
+ },
+ 'slide-up': {
+ '0%': { transform: 'translateY(10px)', opacity: '0' },
+ '100%': { transform: 'translateY(0)', opacity: '1' }
+ },
+ 'slide-down': {
+ '0%': { transform: 'translateY(-10px)', opacity: '0' },
+ '100%': { transform: 'translateY(0)', opacity: '1' }
+ },
+ 'fade-in': {
+ '0%': { opacity: '0' },
+ '100%': { opacity: '1' }
+ },
+ 'scale-in': {
+ '0%': { transform: 'scale(0.95)', opacity: '0' },
+ '100%': { transform: 'scale(1)', opacity: '1' }
}
},
animation: {
'accordion-down': 'accordion-down 0.2s ease-out',
- 'accordion-up': 'accordion-up 0.2s ease-out'
+ 'accordion-up': 'accordion-up 0.2s ease-out',
+ 'float': 'float 3s ease-in-out infinite',
+ 'pulse-subtle': 'pulse-subtle 3s ease-in-out infinite',
+ 'slide-up': 'slide-up 0.3s ease-out',
+ 'slide-down': 'slide-down 0.3s ease-out',
+ 'fade-in': 'fade-in 0.4s ease-out',
+ 'scale-in': 'scale-in 0.3s ease-out'
+ },
+ boxShadow: {
+ 'neuro-flat': '5px 5px 10px rgba(209, 217, 230, 0.5), -5px -5px 10px rgba(255, 255, 255, 0.5)',
+ 'neuro-pressed': 'inset 5px 5px 10px rgba(209, 217, 230, 0.5), inset -5px -5px 10px rgba(255, 255, 255, 0.5)',
+ 'neuro-convex': '5px 5px 10px rgba(209, 217, 230, 0.5), -5px -5px 10px rgba(255, 255, 255, 0.5), inset 1px 1px 2px rgba(255, 255, 255, 0.25), inset -1px -1px 2px rgba(209, 217, 230, 0.25)'
}
}
},