├── public ├── azimov.webp ├── bgimage.webp └── mainlogo.webp ├── postcss.config.mjs ├── middlewares └── Fetcher.tsx ├── types └── RootTypes.tsx ├── next.config.ts ├── app ├── blogs │ ├── page.tsx │ └── [title] │ │ └── page.tsx ├── trainers │ └── page.tsx ├── services │ └── page.tsx ├── page.tsx ├── about │ └── page.tsx ├── layout.tsx └── globals.css ├── lib └── utils.ts ├── components ├── shared │ ├── Title.tsx │ ├── breadcrumb.tsx │ ├── footer.tsx │ ├── header.tsx │ └── image-gallery.tsx └── ui │ ├── button.tsx │ ├── card.tsx │ └── sheet.tsx ├── eslint.config.mjs ├── components.json ├── .gitignore ├── tsconfig.json ├── package.json ├── README.md └── modules ├── About.tsx ├── Hero.tsx ├── Services.tsx ├── Testimonial.tsx ├── Blogs.tsx └── Trainers.tsx /public/azimov.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarbondev/seven-sport-center-client/HEAD/public/azimov.webp -------------------------------------------------------------------------------- /public/bgimage.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarbondev/seven-sport-center-client/HEAD/public/bgimage.webp -------------------------------------------------------------------------------- /public/mainlogo.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sarbondev/seven-sport-center-client/HEAD/public/mainlogo.webp -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | const config = { 2 | plugins: ["@tailwindcss/postcss"], 3 | }; 4 | 5 | export default config; 6 | -------------------------------------------------------------------------------- /middlewares/Fetcher.tsx: -------------------------------------------------------------------------------- 1 | // export const BASE_URL = "http://localhost:3000/api"; 2 | export const BASE_URL = "https://server.7sportcenter.uz/api"; 3 | 4 | export const fetcher = (url: string) => 5 | fetch(`${BASE_URL}${url}`).then((res) => res.json()); 6 | -------------------------------------------------------------------------------- /types/RootTypes.tsx: -------------------------------------------------------------------------------- 1 | export interface BlogPost { 2 | _id?: string; 3 | photos: string[]; 4 | title: string; 5 | description: string; 6 | createdAt?: string; 7 | } 8 | 9 | export interface TrainerMember { 10 | photo: string; 11 | fullName: string; 12 | level: string; 13 | experience: string; 14 | students: string; 15 | } 16 | -------------------------------------------------------------------------------- /next.config.ts: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | images: { 4 | remotePatterns: [ 5 | { 6 | protocol: "https", 7 | hostname: "**", 8 | }, 9 | { 10 | protocol: "http", 11 | hostname: "**", 12 | }, 13 | ], 14 | }, 15 | }; 16 | 17 | module.exports = nextConfig; 18 | -------------------------------------------------------------------------------- /app/blogs/page.tsx: -------------------------------------------------------------------------------- 1 | import BlogsModule from "@/modules/Blogs"; 2 | import { Metadata } from "next"; 3 | import React from "react"; 4 | 5 | export const metadata: Metadata = { 6 | title: "BLOGLAR", 7 | description: "Sport yangiliklar.", 8 | }; 9 | 10 | function page() { 11 | return ( 12 |
13 | 14 |
15 | ); 16 | } 17 | 18 | export default page; 19 | -------------------------------------------------------------------------------- /app/trainers/page.tsx: -------------------------------------------------------------------------------- 1 | import TrainersModule from "@/modules/Trainers"; 2 | import { Metadata } from "next"; 3 | import React from "react"; 4 | 5 | export const metadata: Metadata = { 6 | title: "MURABBIYLAR", 7 | description: "Seven sport center murabbiylar jamoasi.", 8 | }; 9 | 10 | function page() { 11 | return ( 12 |
13 | 14 |
15 | ); 16 | } 17 | 18 | export default page; 19 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from "clsx"; 2 | import { twMerge } from "tailwind-merge"; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | 8 | export function formatDate(dateString: string): string { 9 | const date = new Date(dateString); 10 | 11 | return date.toLocaleDateString("uz-UZ", { 12 | day: "2-digit", 13 | month: "short", 14 | year: "numeric", 15 | }); 16 | } 17 | -------------------------------------------------------------------------------- /components/shared/Title.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | function Title({ 4 | children, 5 | }: Readonly<{ 6 | children: React.ReactNode; 7 | }>) { 8 | return ( 9 |
10 |
11 | 12 | {children} 13 | 14 |
15 | ); 16 | } 17 | 18 | export default Title; 19 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import { dirname } from "path"; 2 | import { fileURLToPath } from "url"; 3 | import { FlatCompat } from "@eslint/eslintrc"; 4 | 5 | const __filename = fileURLToPath(import.meta.url); 6 | const __dirname = dirname(__filename); 7 | 8 | const compat = new FlatCompat({ 9 | baseDirectory: __dirname, 10 | }); 11 | 12 | const eslintConfig = [ 13 | ...compat.extends("next/core-web-vitals", "next/typescript"), 14 | ]; 15 | 16 | export default eslintConfig; 17 | -------------------------------------------------------------------------------- /app/services/page.tsx: -------------------------------------------------------------------------------- 1 | import Services from "@/modules/Services"; 2 | import Testimonial from "@/modules/Testimonial"; 3 | import { Metadata } from "next"; 4 | import React from "react"; 5 | 6 | export const metadata: Metadata = { 7 | title: "XIZMATLAR", 8 | description: "BIZ SIZGA NIMALARNI TAKLIF ETAMIZ.", 9 | }; 10 | 11 | function page() { 12 | return ( 13 |
14 | 15 | 16 |
17 | ); 18 | } 19 | 20 | export default page; 21 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "", 8 | "css": "app/globals.css", 9 | "baseColor": "zinc", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "modules": "@/modules", 15 | "components": "@/components", 16 | "utils": "@/lib/utils", 17 | "ui": "@/components/ui", 18 | "lib": "@/lib", 19 | "hooks": "@/hooks" 20 | }, 21 | "iconLibrary": "lucide" 22 | } 23 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | import About from "@/modules/About"; 2 | import BlogsModule from "@/modules/Blogs"; 3 | import Hero from "@/modules/Hero"; 4 | import Services from "@/modules/Services"; 5 | import Testimonial from "@/modules/Testimonial"; 6 | import TrainersModule from "@/modules/Trainers"; 7 | import React from "react"; 8 | 9 | function Home() { 10 | return ( 11 | <> 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | ); 20 | } 21 | 22 | export default Home; 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | .pnpm-debug.log* 32 | 33 | # env files (can opt-in for committing if needed) 34 | .env* 35 | 36 | # vercel 37 | .vercel 38 | 39 | # typescript 40 | *.tsbuildinfo 41 | next-env.d.ts 42 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /app/about/page.tsx: -------------------------------------------------------------------------------- 1 | import About from "@/modules/About"; 2 | import Testimonial from "@/modules/Testimonial"; 3 | import TrainersModule from "@/modules/Trainers"; 4 | import { Metadata } from "next"; 5 | import React from "react"; 6 | 7 | export const metadata: Metadata = { 8 | title: "BIZ HAQIMIZDA", 9 | description: 10 | "Namanngan shahridagi dzyudo klubi bolalar uchun sport va tarbiyaning mukammal uyg'unligini taqdim etadi. Bizning malakali murabbiylarimiz har bir yosh sportchiga maxsus yondashuv bilan shug'ullanadi.", 11 | }; 12 | 13 | function page() { 14 | return ( 15 |
16 | 17 | 18 | 19 |
20 | ); 21 | } 22 | 23 | export default page; 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev --turbopack", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "@radix-ui/react-dialog": "^1.1.6", 13 | "@radix-ui/react-slot": "^1.1.2", 14 | "axios": "^1.8.3", 15 | "class-variance-authority": "^0.7.1", 16 | "clsx": "^2.1.1", 17 | "embla-carousel-react": "^8.5.2", 18 | "lucide-react": "^0.482.0", 19 | "next": "15.2.2", 20 | "react": "^19.0.0", 21 | "react-dom": "^19.0.0", 22 | "swr": "^2.3.3", 23 | "tailwind-merge": "^3.0.2", 24 | "tailwindcss-animate": "^1.0.7" 25 | }, 26 | "devDependencies": { 27 | "@eslint/eslintrc": "^3", 28 | "@tailwindcss/postcss": "^4", 29 | "@types/node": "^20", 30 | "@types/react": "^19", 31 | "@types/react-dom": "^19", 32 | "eslint": "^9", 33 | "eslint-config-next": "15.2.2", 34 | "tailwindcss": "^4", 35 | "typescript": "^5" 36 | }, 37 | "rules": { 38 | "@typescript-eslint/no-explicit-any": "off" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Judo Club Website 2 | 3 | Этот репозиторий содержит код веб-сайта для дзюдо-клуба. Сайт разработан с использованием современных технологий и предоставляет удобный интерфейс для пользователей. 4 | 5 | ## Технологии 6 | 7 | - **Next.js** - Фреймворк для React, обеспечивающий серверный рендеринг и статическую генерацию страниц. 8 | - **Express.js** - Минималистичный фреймворк для создания серверного API. 9 | - **ShadCN UI & TailwindCSS** - Набор готовых компонентов для стилизации интерфейса. 10 | - **JSON Web Token (JWT)** - Технология для аутентификации и авторизации пользователей. 11 | 12 | ## Установка и запуск 13 | 14 | ### 1. Клонирование репозитория 15 | 16 | ```sh 17 | git clone https://github.com/rakhsrb/seven-sport-center-client 18 | cd seven-sport-center-client 19 | ``` 20 | 21 | ### 2. Установка зависимостей 22 | 23 | ```sh 24 | npm install 25 | ``` 26 | 27 | ### 3. Запуск проекта 28 | 29 | #### Запуск фронтенда (Next.js) 30 | 31 | ```sh 32 | npm run dev 33 | ``` 34 | 35 | #### Запуск бэкенда (Express.js) 36 | 37 | ```sh 38 | npm run server 39 | ``` 40 | 41 | ## Контакты 42 | 43 | Если у вас есть вопросы или предложения, свяжитесь с нами! 44 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import Header from "@/components/shared/header"; 3 | import Footer from "@/components/shared/footer"; 4 | import "./globals.css"; 5 | 6 | export const metadata: Metadata = { 7 | title: "Namangan shahridagi dzyudo klubi | Seven Sport Center", 8 | icons: "./mainlogo.webp", 9 | description: 10 | "Seven Sport Center – Namangan shahridagi yetakchi dzyudo klubi. Bolalar uchun mashgulotlar.", 11 | keywords: "дзюдо, спорт, Namangan, дзюдо клуб, тренировки", 12 | openGraph: { 13 | title: "Namangan shahridagi dzyudo klubi | Seven Sport Center", 14 | description: 15 | "Namangandagi eng yaxshi dzyudo klubida mashq qiling! Professional murabbiylar, zamonaviy sharoitlar, qulay jadval.", 16 | url: "https://seven-sport-center-client.vercel.app/", 17 | images: [ 18 | { 19 | url: "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSSfAq6xh00HGmB98f1qWb0o4V0ZAZfPEpXgsvbMXSylo_k1HWl1CMzOBsywiYYGDpFUmE&usqp=CAU", 20 | width: 1200, 21 | height: 630, 22 | alt: "Дзюдо клуб в Намангане", 23 | }, 24 | ], 25 | }, 26 | }; 27 | 28 | export default function RootLayout({ 29 | children, 30 | }: Readonly<{ 31 | children: React.ReactNode; 32 | }>) { 33 | return ( 34 | 35 | 36 |
37 |
{children}
38 |