A modern, responsive movie and TV show discovery application built with React, Vite, Tailwind CSS, and React Router.
Movie Explorer uses the TVMaze API to browse shows, search for titles, and explore detailed information through a polished cinematic interface.
π Built as Programming Hero Foundation Program β Assignment 02
- π¬ Browse a collection of TV shows
- π Search shows by title
- β³ Debounced search to reduce unnecessary API requests
- π Search state synchronized with the URL
- ποΈ Movie/show details displayed in an interactive modal
- π Selected movie ID stored in the URL
- β¨οΈ Close modal with the
Escapekey - π±οΈ Close modal by clicking outside
- β³ Loading skeletons for better user experience
β οΈ API error handling- πΌοΈ Fallback poster for unavailable images
- π± Fully responsive design
- π¨ Cinematic dark UI with Tailwind CSS
- β»οΈ Reusable React components
- π§Ή Clean API service and data normalization
| Technology | Purpose |
|---|---|
| React | Building the user interface |
| Vite | Development server and build tool |
| Tailwind CSS | Styling and responsive design |
| React Router | Client-side routing and URL state |
| Lucide React | Interface icons |
| TVMaze API | Movie and TV show data |
| JavaScript (ES6+) | Application logic |
| Vercel | Deployment |
This project focuses on practical React fundamentals and modern frontend development patterns.
- Components and component composition
- Props
useStateuseEffect- Controlled inputs
- Conditional rendering
- List rendering with
.map() - Custom hooks
- API integration with
fetch - Promises and
async/await AbortController- Debouncing
- React Router
useSearchParams- URL-based application state
- Event handling
- Reusable UI components
- Loading and error states
The search functionality keeps the user's query in the URL.
For example:
/movies?search=under
This makes the search state:
- Shareable
- Refresh-friendly
- Easy to navigate
- Controlled through React Router
When a show is selected, its ID can also be stored in the URL:
/movies?search=under&movie=1
Closing the details modal removes the movie parameter while preserving the search query.
Selecting a show opens a responsive details modal containing information such as:
- Title
- Rating
- Release year
- Runtime
- Network
- Status
- Genres
- Overview
- Backdrop image
The modal also supports:
Escapekey to close- Outside click to close
- Dedicated close button
- Responsive layout
- Scrollable content for smaller screens
Search requests are debounced before calling the TVMaze API.
Instead of sending a request for every keystroke:
u
un
und
unde
under
the application waits briefly until the user stops typing before performing the search.
AbortController is also used to cancel outdated requests when a new search begins or the component is unmounted.
This helps keep the UI responsive and avoids unnecessary API requests.
Movie data is provided by the TVMaze API.
GET /shows
Fetches the available shows.
GET /search/shows?q={query}
Searches for shows by title.
GET /shows/{id}
Fetches a specific show by ID.
The application also normalizes the API response into a consistent structure before passing the data to the UI components.
A simplified structure of the application:
src/
βββ api/
β βββ tvmaze.js
β
βββ assets/
β
βββ components/
β βββ MovieCard.jsx
β βββ MovieCardSkeleton.jsx
β βββ MovieGrid.jsx
β βββ MovieModal.jsx
β βββ Navbar.jsx
β βββ SearchBar.jsx
β βββ Footer.jsx
β
βββ pages/
β βββ HomePage.jsx
β βββ MovieListingPage.jsx
β
βββ App.jsx
βββ index.css
βββ main.jsx
The exact structure may change as the project evolves.
The interface follows a cinematic dark design system with:
- Dark background surfaces
- Gold accent colors
- Glassmorphism
- Responsive grids
- Subtle hover animations
- Image overlays
- Skeleton loading states
- Accessible focus states
- Mobile-first layouts
The goal is to keep the interface visually polished without sacrificing usability.
git clone https://github.com/marleyDip/Programming-Hero_Foundation-Program-Assignment-02_Movie-Explorer_React-Tailwind-CSS-Routing-Vite.gitcd Programming-Hero_Foundation-Program-Assignment-02_Movie-Explorer_React-Tailwind-CSS-Routing-Vitenpm installnpm run devVite will provide the local development URL in your terminal.
Create a production build:
npm run buildPreview the production build:
npm run previewMovie Explorer
https://sofian-movie-explorer.vercel.app/
This project was developed as part of the Programming Hero Foundation Program β Assignment 02.
The project helped practice:
- React fundamentals
- API integration
- Routing
- Search functionality
- Component-based architecture
- Responsive UI development
- Tailwind CSS
- URL state management
Passionate about building modern, scalable, and user-focused web applications while continuously strengthening JavaScript, TypeScript, problem-solving, and full-stack development skills.
This project was created for educational and learning purposes.