Skip to content

Commit ee0b5c9

Browse files
committed
Upgrade
1 parent 6c74cec commit ee0b5c9

6 files changed

Lines changed: 254 additions & 20 deletions

File tree

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
name: 🐛 Bug Report
2+
description: Create a report to help us improve the app
3+
labels: ["bug"]
4+
body:
5+
- type: markdown
6+
attributes:
7+
value: |
8+
Thanks for taking the time to fill out this bug report!
9+
- type: textarea
10+
id: bug-description
11+
attributes:
12+
label: Bug Description
13+
description: A clear and concise description of what the bug is.
14+
validations:
15+
required: true
16+
- type: textarea
17+
id: steps-to-repro
18+
attributes:
19+
label: Steps to Reproduce
20+
description: Lists the steps to reproduce the behavior.
21+
placeholder: |
22+
1. Open 'Vault' screen
23+
2. Click on '+' button
24+
3. ...
25+
validations:
26+
required: true
27+
- type: textarea
28+
id: expected-behavior
29+
attributes:
30+
label: Expected Behavior
31+
description: A clear and concise description of what you expected to happen.
32+
validations:
33+
required: true
34+
- type: input
35+
id: browser-info
36+
attributes:
37+
label: Browser Info
38+
placeholder: e.g. Chrome 120, iOS Safari 17.2
39+
validations:
40+
required: false
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
name: ✨ Feature Request
2+
description: Suggest an idea for this project
3+
labels: ["enhancement"]
4+
body:
5+
- type: markdown
6+
attributes:
7+
value: |
8+
Have an idea to make Money Planner better? We'd love to hear it!
9+
- type: textarea
10+
id: theory
11+
attributes:
12+
label: Is your feature request related to a problem?
13+
description: A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
14+
validations:
15+
required: true
16+
- type: textarea
17+
id: feature-description
18+
attributes:
19+
label: Describe the solution you'd like
20+
description: A clear and concise description of what you want to happen.
21+
validations:
22+
required: true
23+
- type: textarea
24+
id: alternatives
25+
attributes:
26+
label: Describe alternatives you've considered
27+
description: A clear and concise description of any alternative solutions or features you've considered.
28+
validations:
29+
required: false
30+
- type: textarea
31+
id: context
32+
attributes:
33+
label: Additional context
34+
description: Add any other context or screenshots about the feature request here.
35+
validations:
36+
required: false

.github/workflows/ci.yml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
name: 🚀 CI/CD - Build & Lint
2+
3+
on:
4+
push:
5+
branches: [ "main", "master" ]
6+
pull_request:
7+
branches: [ "main", "master" ]
8+
9+
jobs:
10+
build:
11+
runs-on: ubuntu-latest
12+
13+
strategy:
14+
matrix:
15+
node-version: [20.x, 22.x]
16+
17+
steps:
18+
- uses: actions/checkout@v4
19+
20+
- name: 🛠️ Set up Node.js ${{ matrix.node-version }}
21+
uses: actions/setup-node@v4
22+
with:
23+
node-version: ${{ matrix.node-version }}
24+
cache: 'npm'
25+
26+
- name: 📦 Install dependencies
27+
run: npm ci
28+
29+
- name: 🔍 Lint
30+
run: npm run lint
31+
continue-on-error: true # Don't block build if there are lint warnings
32+
33+
- name: 🔨 Build
34+
run: npm run build
35+
36+
- name: 📄 Build Report
37+
run: |
38+
echo "Build successful for Node ${{ matrix.node-version }}"
39+
ls -R dist

PROFILE_README.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# Hi there, I'm Steven Tanardi! 👋 🚀
2+
3+
![Profile Banner](./docs/assets/profile_banner.png)
4+
5+
### 👨‍💻 About Me
6+
- 🎓 **Computer Science Student** @ National Quemoy University (國立金門大學)
7+
- 💡 Passionate about building **high-end web applications** with modern tech stacks.
8+
- 🛠️ Currently focusing on **React 19**, **Vite**, and **Supabase**.
9+
- 🥅 Goal: To create tools that make life easier and more beautiful.
10+
11+
---
12+
13+
### 🛠️ Tech Stack & Tools
14+
15+
![JavaScript](https://img.shields.io/badge/JavaScript-F7DF1E?style=flat-square&logo=javascript&logoColor=black)
16+
![React](https://img.shields.io/badge/React-20232A?style=flat-square&logo=react&logoColor=61DAFB)
17+
![Vite](https://img.shields.io/badge/Vite-646CFF?style=flat-square&logo=vite&logoColor=white)
18+
![Supabase](https://img.shields.io/badge/Supabase-3ECF8E?style=flat-square&logo=supabase&logoColor=green)
19+
![Tailwind](https://img.shields.io/badge/Tailwind_CSS-38B2AC?style=flat-square&logo=tailwind-css&logoColor=white)
20+
![Framer Motion](https://img.shields.io/badge/Framer_Motion-0055FF?style=flat-square&logo=framer&logoColor=white)
21+
![C#](https://img.shields.io/badge/C%23-239120?style=flat-square&logo=c-sharp&logoColor=white)
22+
23+
---
24+
25+
### 🔥 Featured Projects
26+
27+
#### 💰 [Money Planner](https://github.com/Steventanardi/MoneyPlanner)
28+
A premium financial management tool with **glassmorphism** design. Features include bank management, recurring item tracking, safe-to-spend calculations, and detailed visual insights using Recharts. Perfect for anyone looking for financial clarity with style.
29+
30+
#### 🏗️ [Property-Parser](https://github.com/Steventanardi/Property-Parser)
31+
An efficient C#-based tool for parsing property data, demonstrating solid back-end architecture and data processing logic.
32+
33+
---
34+
35+
### 📊 GitHub Stats (Auto-Generated)
36+
37+
![Steven's GitHub stats](https://github-readme-stats.vercel.app/api?username=Steventanardi&show_icons=true&theme=tokyonight)
38+
![Top Langs](https://github-readme-stats.vercel.app/api/top-langs/?username=Steventanardi&layout=compact&theme=tokyonight)
39+
40+
---
41+
42+
### 📫 Let's Connect!
43+
- 🐙 GitHub: [@Steventanardi](https://github.com/Steventanardi)
44+
- 🌐 [LinkedIn](https://www.linkedin.com/in/steventanardi/) (Add your link if you have one!)
45+
46+
---
47+
48+
"Simplicity is the soul of efficient development." 💎

README.md

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,86 @@
1-
# React + Vite
1+
# 💰 Money Planner — Premium Personal Finance Tracker
22

3-
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
3+
![Money Planner Hero Banner](./docs/assets/hero_banner.png)
44

5-
Currently, two official plugins are available:
5+
[![Vite](https://img.shields.io/badge/Vite-646CFF?style=for-the-badge&logo=vite&logoColor=white)](https://vitejs.dev/)
6+
[![React](https://img.shields.io/badge/React-20232A?style=for-the-badge&logo=react&logoColor=61DAFB)](https://react.dev/)
7+
[![Supabase](https://img.shields.io/badge/Supabase-3ECF8E?style=for-the-badge&logo=supabase&logoColor=white)](https://supabase.com/)
8+
[![TailwindCSS](https://img.shields.io/badge/Tailwind_CSS-38B2AC?style=for-the-badge&logo=tailwind-css&logoColor=white)](https://tailwindcss.com/)
9+
[![Framer Motion](https://img.shields.io/badge/Framer_Motion-0055FF?style=for-the-badge&logo=framer&logoColor=white)](https://www.framer.com/motion/)
610

7-
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
8-
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
11+
A high-end, privacy-focused financial management application built with **React 19**, **Vite**, and **Supabase**. Designed with a premium glassmorphic aesthetic and smooth micro-interactions to make managing your money feel like a breeze.
912

10-
## React Compiler
13+
## ✨ Key Features
1114

12-
The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).
15+
- **🏦 Smart Bank Management**: Seamlessly manage multiple banks, wallets, and joint accounts with real-time balance tracking.
16+
- **📈 Advanced Insights**: Visualize your spending habits with dynamic **Recharts** area and bar charts.
17+
- **💎 Premium UX/UI**: Fully responsive design with **Glassmorphism**, dark mode support, and buttery-smooth **Framer Motion** transitions.
18+
- **🛡️ Emergency Fund Tracker**: Dedicated tracking for your liquid safety net with adjustable reserve goals.
19+
- **🔄 Recurring Items**: Never miss a subscription or bill with automated recurring transaction management.
20+
- **📂 Data Portability**: Export your entire financial history to CSV for deep analysis in Excel/Sheets.
21+
- **🌍 Multi-Currency Support**: Real-time exchange rate updates (TWD/IDR and more) to keep your global finances in check.
22+
- **📱 Progressive Web App (PWA)**: Installable on your mobile device for an app-like experience without the App Store.
1323

14-
## Expanding the ESLint configuration
24+
## 🛠️ Tech Stack
1525

16-
If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project.
26+
- **Core**: React 19, Vite
27+
- **State Management**: Zustand
28+
- **Data Fetching**: TanStack Query (React Query)
29+
- **Database & Auth**: Supabase
30+
- **Animations**: Framer Motion
31+
- **Icons**: Lucide React
32+
- **Charts**: Recharts
33+
- **Styling**: Modern CSS with HSL variables
34+
- **OCR**: Tesseract.js (for future receipt scanning features)
35+
36+
## 🚀 Getting Started
37+
38+
### Prerequisites
39+
40+
- **Node.js**: `v20.0.0` or higher
41+
- **npm**: Installed with Node.js
42+
43+
### Installation
44+
45+
1. **Clone the repository**:
46+
```bash
47+
git clone https://github.com/Steventanardi/MoneyPlanner.git
48+
cd MoneyPlanner
49+
```
50+
51+
2. **Install dependencies**:
52+
```bash
53+
npm install
54+
```
55+
56+
3. **Run the development server**:
57+
```bash
58+
npm run dev
59+
```
60+
61+
4. **Access the app**:
62+
Open [http://localhost:5173](http://localhost:5173) in your browser.
63+
64+
## 📜 Deployment
65+
66+
The project is optimized for deployment on **Vercel** or **Netlify**. Ensure you set up your Supabase environment variables in your deployment dashboard.
67+
68+
## 🤝 Contributing
69+
70+
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.
71+
72+
1. Fork the Project
73+
2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)
74+
3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)
75+
4. Push to the Branch (`git push origin feature/AmazingFeature`)
76+
5. Open a Pull Request
77+
78+
## 👤 Author
79+
80+
**Steven Tanardi**
81+
- GitHub: [@Steventanardi](https://github.com/Steventanardi)
82+
- University: National Quemoy University (國立金門大學)
83+
84+
---
85+
86+
Developed with ❤️ for better financial clarity.

src/components/PullToRefresh.jsx

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,15 @@ const PullToRefresh = ({ onRefresh, children }) => {
99
const controls = useAnimation();
1010
const threshold = 100;
1111

12+
const [isAtTop, setIsAtTop] = useState(true);
13+
14+
const handleScroll = (e) => {
15+
setIsAtTop(e.target.scrollTop === 0);
16+
};
17+
1218
const handleDrag = (event, info) => {
13-
if (isRefreshing) return;
19+
if (isRefreshing || !isAtTop) return;
1420

15-
// Only allow pulling down if at the very top of the container
16-
const scrollTop = containerRef.current?.scrollTop || 0;
17-
if (scrollTop > 0) {
18-
setPullDistance(0);
19-
return;
20-
}
21-
2221
if (info.offset.y > 0) {
2322
const resistance = 0.4;
2423
setPullDistance(info.offset.y * resistance);
@@ -50,14 +49,15 @@ const PullToRefresh = ({ onRefresh, children }) => {
5049
return (
5150
<div
5251
ref={containerRef}
52+
onScroll={handleScroll}
5353
className="no-scrollbar"
5454
style={{
5555
position: 'relative',
5656
width: '100%',
5757
height: '100%',
5858
overflowY: 'auto',
5959
overflowX: 'hidden',
60-
backgroundColor: 'inherit'
60+
touchAction: isAtTop && pullDistance > 0 ? 'none' : 'auto'
6161
}}
6262
>
6363
{/* Pull Indicator Area */}
@@ -71,7 +71,7 @@ const PullToRefresh = ({ onRefresh, children }) => {
7171
alignItems: 'center',
7272
justifyContent: 'center',
7373
overflow: 'hidden',
74-
zIndex: 4000, // Higher than most things except essential overlays
74+
zIndex: 4000,
7575
background: 'transparent',
7676
pointerEvents: 'none'
7777
}}>
@@ -98,11 +98,12 @@ const PullToRefresh = ({ onRefresh, children }) => {
9898
</motion.div>
9999
</div>
100100

101-
{/* Content Area - This becomes the drag target */}
101+
{/* Content Area - Only drag if we are at the top */}
102102
<motion.div
103103
drag="y"
104104
dragConstraints={{ top: 0, bottom: 0 }}
105105
dragElastic={0.6}
106+
dragListener={isAtTop && !isRefreshing}
106107
onDrag={handleDrag}
107108
onDragEnd={handleDragEnd}
108109
animate={{ y: isRefreshing ? (threshold / 2) : pullDistance }}

0 commit comments

Comments
 (0)