A modern job board built with Next.js 15(Latest version), TypeScript, and Tailwind CSS. Features infinite scrolling, real-time search filtering, and a responsive design.
- 🔍 Real-time search with URL persistence
- ♾️ Infinite scrolling for job listings
- 🎨 Dark/Light mode support
- 📱 Fully responsive design
- 🔗 Shareable job listings with URL-based filters
- 💾 Job bookmarking functionality
- ⌨️ Full keyboard navigation support
- ♿ Accessible components using shadcn/ui
- Next.js 15
- TypeScript
- Tailwind CSS
- Zustand for state management
- TanStack Query
- shadcn/ui components
- nuqs for URL state management
- date-fns for date formatting
- Node.js 20
- pnpm (preferred) or yarn
- Clone the repository:
git clone https://github.com/danieloemenike/GlobalDeskJobs.git
cd GlobalDeskJobs
- Install dependencies:
pnpm install
- Start the development server:
pnpm run dev
- Open http://localhost:3000 with your browser to see the result.
The application uses nuqs
for URL state management, allowing users to share their filtered job searches:
const [queryStates, setQueryStates] = useQueryStates({
search: parseAsString.withDefault(''),
location: parseAsString.withDefault(''),
minSalary: parseAsInteger.withDefault(0),
maxSalary: parseAsInteger.withDefault(500000),
});
Implemented using TanStack Query and Intersection Observer:
const { data, fetchNextPage, hasNextPage } = useJobsQuery({
search: queryStates.search,
// ... other filters
});
Uses Zustand for global state management, particularly for saved jobs:
export const useJobStore = create<JobStore>()(
persist(
(set) => ({
savedJobs: [],
toggleSavedJob: (jobId) =>
set((state) => ({
savedJobs: state.savedJobs.includes(jobId)
? state.savedJobs.filter((id) => id !== jobId)
: [...state.savedJobs, jobId],
})),
}),
{
name: 'job-store',
}
)
);
The application uses Tailwind CSS for styling. You can customize the theme in tailwind.config.js
:
theme: {
extend: {
colors: {
primary: { /* your colors */ },
// ... other customizations
},
},
},
You can modify the mock jobs data in lib/data/jobs.ts
to add or modify job listings.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
- shadcn/ui for the ui component library
- TanStack Query for data fetching
- Zustand for state management