diff --git a/src/App.jsx b/src/App.jsx
index f8eb84b..72f24a8 100644
--- a/src/App.jsx
+++ b/src/App.jsx
@@ -4,6 +4,7 @@ import './App.css';
import { Navbar } from './components/Navbar';
import Footer from './components/Footer';
+
function App() {
return (
<>
@@ -12,6 +13,8 @@ function App() {
+
+
>
);
}
diff --git a/src/components/About/AboutUs.css b/src/components/About/AboutUs.css
new file mode 100644
index 0000000..974ccc5
--- /dev/null
+++ b/src/components/About/AboutUs.css
@@ -0,0 +1,144 @@
+.aboutus-container {
+ min-height: 100vh;
+ padding: 40px 20px;
+ background-size: cover;
+ background-position: center;
+ background-attachment: fixed;
+ display: flex;
+ justify-content: center;
+ align-items: flex-start;
+ background-color: #1a1a1a; /* Dark grey background */
+}
+
+/* Glassmorphism Anime Card */
+.aboutus-card {
+ background: rgba(15, 15, 25, 0.8);
+ backdrop-filter: blur(15px);
+ -webkit-backdrop-filter: blur(15px);
+ border-radius: 20px;
+ border: 1px solid rgba(255, 0, 144, 0.3);
+ padding: 30px;
+ color: white;
+ max-width: 850px;
+ width: 100%;
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
+ animation: fadeInUp 0.8s ease;
+}
+
+/* Anime Neon Title */
+.aboutus-title {
+ font-size: 2.5rem;
+ font-weight: 800;
+ /* background: linear-gradient(45deg, #ffcb05, #ff3c00); */
+
+ margin-bottom: 20px;
+ /* text-shadow: 0 0 10px rgba(255, 61, 144, 0.8); */
+}
+
+/* Section Headers with Anime Energy */
+.aboutus-subtitle {
+ font-size: 1.5rem;
+ margin-top: 25px;
+ margin-bottom: 10px;
+ background: linear-gradient(45deg, #ffcb05, #ff3c00);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+/* Body text in soft anime gray */
+.aboutus-text {
+ color: #d1d1e9;
+ line-height: 1.7;
+ font-size: 1rem;
+}
+
+/* Feature List with bright bullet glow */
+.aboutus-list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.aboutus-list li {
+ padding: 10px 0;
+ border-bottom: 1px solid rgba(255, 0, 144, 0.2);
+ color: #ffd6f6;
+ font-weight: 500;
+ position: relative;
+}
+
+.aboutus-list li::before {
+ content: "★";
+ color: #ff61d8;
+ position: absolute;
+ left: -20px;
+ text-shadow: 0 0 6px rgba(255, 97, 216, 0.8);
+}
+
+/* Footer with soft sakura pink */
+.aboutus-footer {
+ margin-top: 30px;
+ font-style: italic;
+ color: #ffb6d9;
+ text-align: center;
+}
+
+/* Animation */
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(30px) scale(0.98);
+ filter: blur(3px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0) scale(1);
+ filter: blur(0);
+ }
+}
+
+/* 📱 Mobile Devices */
+@media (max-width: 768px) {
+ .aboutus-container {
+ padding: 20px 10px;
+ }
+
+ .aboutus-card {
+ padding: 20px;
+ }
+
+ .aboutus-title {
+ font-size: 2rem;
+ text-align: center;
+ }
+
+ .aboutus-subtitle {
+ font-size: 1.2rem;
+ text-align: center;
+ }
+
+ .aboutus-text {
+ font-size: 0.95rem;
+ text-align: center;
+ }
+
+ .aboutus-list li {
+ font-size: 0.9rem;
+ padding-left: 20px;
+ }
+}
+
+/* 📟 Tablet Devices */
+@media (min-width: 769px) and (max-width: 1024px) {
+ .aboutus-card {
+ padding: 25px;
+ }
+
+ .aboutus-title {
+ font-size: 2.2rem;
+ }
+
+ .aboutus-subtitle {
+ font-size: 1.3rem;
+ }
+}
diff --git a/src/components/About/AboutUs.jsx b/src/components/About/AboutUs.jsx
new file mode 100644
index 0000000..2e07b74
--- /dev/null
+++ b/src/components/About/AboutUs.jsx
@@ -0,0 +1,50 @@
+import React from "react";
+import "./AboutUs.css";
+
+const AboutUs = () => {
+ return (
+
+
+
About Anime Ecstasy
+
+ Welcome to Anime Ecstasy - your ultimate anime
+ discovery & watchlist companion.
+ This project is proudly part of GirlScript Summer of Code 2025 💛,
+ built for fans, by fans.
+ Our mission is to help you explore trending anime, track what you love,
+ and make your watchlist an unforgettable experience.
+
+
+
Key Features
+
+ - 🎬 Trending Anime Gallery with stunning visuals
+ - ⭐ Add & Remove from your personal Watchlist (saved in localStorage)
+ - 📖 Seamless Pagination for endless browsing
+ - 📱 Fully Responsive across all devices
+
+
+
Tech Stack
+
+ - ⚛️ React (Vite) – Modern frontend framework
+ - 🌐 Axios – Smooth API requests
+ - 💨 Tailwind CSS – Fast & beautiful UI styling
+ - 🐱 Anime API – Real-time anime data (Jikan / MyAnimeList)
+
+
+
Open Source & Contributions
+
+ Being a GSSoC 2025 project, Anime Ecstasy is open for contributions from
+ developers worldwide. Whether you are a beginner or a seasoned coder,
+ your ideas, bug fixes, and features are always welcome!
+
+
+
+ 💖 Created with passion for those who start one episode...
+ and somehow finish the whole season at 3 AM.
+
+
+
+ );
+};
+
+export default AboutUs;
diff --git a/src/components/Anime/Anime.jsx b/src/components/Anime/Anime.jsx
index 7265144..45fa19a 100644
--- a/src/components/Anime/Anime.jsx
+++ b/src/components/Anime/Anime.jsx
@@ -1,9 +1,133 @@
+// import React, { useEffect, useState } from 'react';
+// import Banner from './Banner.jsx';
+// import axios from 'axios';
+// import AnimeCard from './AnimeCard.jsx';
+// import Pagination from '../Pagination.jsx';
+// import Spinner from '../Spinner.jsx';
+// import { useSearchParams } from 'react-router-dom';
+// import { useProfile } from '../../context/ProfileContext.jsx';
+// import { useAuth } from '../../context/AuthContext.jsx';
+// import HomePageBannerSkeleton from '../skeletons/HomePageBannerSkeleton.jsx';
+// import AnimeCardSkeleton from '../skeletons/AnimeCardSkeleton.jsx';
+
+// function Anime() {
+// const [anime, setAnime] = useState([]);
+// const [page, setPage] = useState(1);
+// const totalPages = 10;
+// const [loading, setLoading] = useState(true);
+// const [searchParams] = useSearchParams();
+// const searchQuery = searchParams.get('search');
+
+// const { user } = useAuth();
+// const { watchlist, addToWatchlist, removeFromWatchlist } = useProfile();
+
+// const handleAddToWatchList = (animeObj) => {
+// if (!user) {
+// alert("Please log in to add anime to your watchlist.");
+// return;
+// }
+// addToWatchlist(animeObj);
+// };
+
+// const handleRemoveFromWatchList = (animeObj) => {
+// if (!user) return;
+// const animeToRemove = watchlist.find(item => item.mal_id === animeObj.mal_id);
+// if (animeToRemove) {
+// removeFromWatchlist(animeToRemove);
+// }
+// };
+
+// useEffect(() => {
+// async function fetchData() {
+// setLoading(true);
+// try {
+// const url = searchQuery
+// ? `${import.meta.env.VITE_JIKAN_API}anime?q=${searchQuery}`
+// : `${import.meta.env.VITE_API_URL}${page}`;
+// const res = await axios.get(url);
+// setAnime(res.data.data || []);
+// } catch (error) {
+// console.error("Error fetching data:", error);
+// } finally {
+// setLoading(false);
+// }
+// }
+
+// fetchData();
+// }, [page, searchQuery]);
+
+// useEffect(() => {
+// window.scrollTo({ top: 0, behavior: 'smooth' });
+// }, [page]);
+
+// if (!loading) (
+//
+//
+
+//
+// {searchQuery ? `Search Results for "${searchQuery}"` : 'Trending Anime'}
+//
+
+//
+// {[...Array(25)].map(() => (
+//
+// ))}
+//
+//
+// )
+
+// return (
+//
+//
+//
+//
+// {searchQuery ? `Search Results for "${searchQuery}"` : 'Trending Anime'}
+//
+
+// {anime.length ?
+//
+// {anime.map((animeObj) => (
+//
+// ))}
+//
+// :
+//
+// {[...Array(25)].map(() => (
+//
+// ))}
+//
+// }
+
+// {!searchQuery && (
+//
setPage((prev) => Math.min(totalPages, prev + 1))}
+// handlePrev={() => setPage((prev) => Math.max(1, prev - 1))}
+// pageNo={page}
+// totalPages={totalPages}
+// setPage={setPage}
+// />
+// )}
+//
+//
+// );
+// }
+
+// export default Anime;
+
+
import React, { useEffect, useState } from 'react';
import Banner from './Banner.jsx';
import axios from 'axios';
import AnimeCard from './AnimeCard.jsx';
import Pagination from '../Pagination.jsx';
-import Spinner from '../Spinner.jsx';
import { useSearchParams } from 'react-router-dom';
import { useProfile } from '../../context/ProfileContext.jsx';
import { useAuth } from '../../context/AuthContext.jsx';
@@ -52,7 +176,6 @@ function Anime() {
setLoading(false);
}
}
-
fetchData();
}, [page, searchQuery]);
@@ -60,21 +183,21 @@ function Anime() {
window.scrollTo({ top: 0, behavior: 'smooth' });
}, [page]);
- if (!loading) (
-
-
-
-
- {searchQuery ? `Search Results for "${searchQuery}"` : 'Trending Anime'}
-
-
-
- {[...Array(25)].map(() => (
-
- ))}
+ if (loading) {
+ return (
+
+
+
+ {searchQuery ? `Search Results for "${searchQuery}"` : 'Trending Anime'}
+
+
+ {[...Array(25)].map((_, index) => (
+
+ ))}
+
-
- )
+ );
+ }
return (
@@ -84,7 +207,7 @@ function Anime() {
{searchQuery ? `Search Results for "${searchQuery}"` : 'Trending Anime'}
- {anime.length ?
+ {anime.length > 0 ? (
{anime.map((animeObj) => (
))}
- :
+ ) : (
- {[...Array(25)].map(() => (
-
+ {[...Array(25)].map((_, index) => (
+
))}
- }
+ )}
{!searchQuery && (
{
const { user } = useAuth(); // Get user from context
diff --git a/src/firebase.js b/src/firebase.js
index 27fcb56..f1ab65e 100644
--- a/src/firebase.js
+++ b/src/firebase.js
@@ -9,15 +9,16 @@ import {
import { getFirestore } from 'firebase/firestore';
const firebaseConfig = {
- apiKey: import.meta.env.VITE_FIREBASE_API_KEY,
- authDomain: import.meta.env.VITE_FIREBASE_AUTH_DOMAIN,
- projectId: import.meta.env.VITE_FIREBASE_PROJECT_ID,
- storageBucket: import.meta.env.VITE_FIREBASE_STORAGE_BUCKET,
- messagingSenderId: import.meta.env.VITE_FIREBASE_MESSAGING_SENDER_ID,
- appId: import.meta.env.VITE_FIREBASE_APP_ID,
- measurementId: import.meta.env.VITE_FIREBASE_MEASUREMENT_ID,
+ apiKey: "",
+ authDomain: "",
+ projectId: "",
+ storageBucket: "",
+ messagingSenderId: "865293096496",
+ appId: "",
+ measurementId: ""
};
+
const app = initializeApp(firebaseConfig);
diff --git a/src/main.jsx b/src/main.jsx
index faf1adc..78d9acd 100644
--- a/src/main.jsx
+++ b/src/main.jsx
@@ -15,9 +15,9 @@ import WatchList from './components/WatchList/WatchList.jsx';
import Anime from './components/Anime/Anime.jsx';
import Login from './components/Auth/Login.jsx';
import Profile from './components/Profile/Profile.jsx';
-
+import AboutUs from './components/About/AboutUs.jsx';
import { AuthProvider } from './context/AuthContext.jsx';
-import { ProfileProvider } from './context/ProfileContext.jsx'; // Import the new provider
+import { ProfileProvider } from './context/ProfileContext.jsx';
// Define routes
const router = createBrowserRouter(
@@ -28,6 +28,7 @@ const router = createBrowserRouter(
} />
} />
} />
+ } />
)
);