diff --git a/projects/expense-tracker/README.md b/projects/expense-tracker/README.md new file mode 100644 index 0000000..806b60e --- /dev/null +++ b/projects/expense-tracker/README.md @@ -0,0 +1,26 @@ +# Expense Tracker 💰 + +A simple and lightweight **Expense Tracker** web application built using **HTML, CSS, and JavaScript**. This app allows users to add, view, and remove expenses while automatically calculating the total amount. All data is stored in the browser using **localStorage**, so expenses persist even after a page refresh. + +--- + +## Features + +- Add expenses with name and amount +- Display a list of all expenses +- Remove individual expenses +- Automatically calculate total expenses +- Data persistence using browser localStorage +- Responsive and clean UI + +--- + +## Technologies Used + +- HTML5 +- CSS3 +- JavaScript +- Browser Local Storage + +--- + diff --git a/projects/expense-tracker/app.js b/projects/expense-tracker/app.js new file mode 100644 index 0000000..2dda86b --- /dev/null +++ b/projects/expense-tracker/app.js @@ -0,0 +1,70 @@ +// Select elements +const form = document.querySelector("form"); +const inputs = document.querySelectorAll("input"); + +let expenses = JSON.parse(localStorage.getItem("expenses")) || []; + +// Create expense list container +const list = document.createElement("ul"); +const totalText = document.createElement("h3"); + +document.querySelector(".container").appendChild(list); +document.querySelector(".container").appendChild(totalText); + +// Render expenses +function renderExpenses() { + list.innerHTML = ""; + let total = 0; + + expenses.forEach((expense, index) => { + const li = document.createElement("li"); + li.style.display = "flex"; + li.style.justifyContent = "space-between"; + li.style.alignItems = "center"; + li.style.margin = "5px 0"; + + const text = document.createElement("span"); + text.textContent = `${expense.name} - Rs ${expense.amount}`; + + const removeBtn = document.createElement("button"); + removeBtn.textContent = "Remove"; + removeBtn.style.cursor = "pointer"; + + removeBtn.addEventListener("click", () => { + expenses.splice(index, 1); + renderExpenses(); + }); + + li.appendChild(text); + li.appendChild(removeBtn); + list.appendChild(li); + + total += expense.amount; + }); + + totalText.textContent = `Total Expense: Rs ${total}`; + localStorage.setItem("expenses", JSON.stringify(expenses)); +} + +// Add expense +form.addEventListener("submit", function (e) { + e.preventDefault(); + + const name = inputs[0].value.trim(); + const amount = Number(inputs[1].value); + + if (name === "" || amount <= 0) { + alert("Please enter valid expense details"); + return; + } + + expenses.push({ name, amount }); + + inputs[0].value = ""; + inputs[1].value = ""; + + renderExpenses(); +}); + +// Load saved data on refresh +renderExpenses(); diff --git a/projects/expense-tracker/index.html b/projects/expense-tracker/index.html new file mode 100644 index 0000000..f873c5d --- /dev/null +++ b/projects/expense-tracker/index.html @@ -0,0 +1,25 @@ + + +
+ + +