Initial commit - modstagram-next
41
.gitignore
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
||||
|
||||
# dependencies
|
||||
/node_modules
|
||||
/.pnp
|
||||
.pnp.*
|
||||
.yarn/*
|
||||
!.yarn/patches
|
||||
!.yarn/plugins
|
||||
!.yarn/releases
|
||||
!.yarn/versions
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
/out/
|
||||
|
||||
# production
|
||||
/build
|
||||
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# env files (can opt-in for committing if needed)
|
||||
.env*
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
26
Dockerfile
Normal file
@@ -0,0 +1,26 @@
|
||||
FROM node:18-alpine AS builder
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package*.json ./
|
||||
RUN npm install
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN npm run build
|
||||
|
||||
FROM node:18-alpine AS runner
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=builder /app/.next ./.next
|
||||
COPY --from=builder /app/public ./public
|
||||
COPY --from=builder /app/package*.json ./
|
||||
COPY --from=builder /app/node_modules ./node_modules
|
||||
|
||||
ENV NODE_ENV=production
|
||||
ENV HOST=0.0.0.0
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
CMD ["npm", "start"]
|
||||
36
README.md
Normal file
@@ -0,0 +1,36 @@
|
||||
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
|
||||
|
||||
## Getting Started
|
||||
|
||||
First, run the development server:
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
# or
|
||||
yarn dev
|
||||
# or
|
||||
pnpm dev
|
||||
# or
|
||||
bun dev
|
||||
```
|
||||
|
||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
||||
|
||||
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
|
||||
|
||||
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
|
||||
|
||||
## Learn More
|
||||
|
||||
To learn more about Next.js, take a look at the following resources:
|
||||
|
||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
||||
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
||||
|
||||
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
|
||||
|
||||
## Deploy on Vercel
|
||||
|
||||
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
||||
|
||||
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
|
||||
22
components.json
Normal file
@@ -0,0 +1,22 @@
|
||||
{
|
||||
"$schema": "https://ui.shadcn.com/schema.json",
|
||||
"style": "new-york",
|
||||
"rsc": true,
|
||||
"tsx": true,
|
||||
"tailwind": {
|
||||
"config": "",
|
||||
"css": "app/globals.css",
|
||||
"baseColor": "neutral",
|
||||
"cssVariables": true,
|
||||
"prefix": ""
|
||||
},
|
||||
"iconLibrary": "lucide",
|
||||
"aliases": {
|
||||
"components": "@/components",
|
||||
"utils": "@/lib/utils",
|
||||
"ui": "@/components/ui",
|
||||
"lib": "@/lib",
|
||||
"hooks": "@/hooks"
|
||||
},
|
||||
"registries": {}
|
||||
}
|
||||
16
docker-compose.yml
Normal file
@@ -0,0 +1,16 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
next-app:
|
||||
build: .
|
||||
container_name: modstagram-next
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "3004:3000"
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- HOST=0.0.0.0
|
||||
volumes:
|
||||
- ./:/app
|
||||
- /app/node_modules
|
||||
- /app/.next
|
||||
43
eslint.config.mjs
Normal file
@@ -0,0 +1,43 @@
|
||||
|
||||
import { dirname } from "path";
|
||||
import { fileURLToPath } from "url";
|
||||
import { FlatCompat } from "@eslint/eslintrc";
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
|
||||
const compat = new FlatCompat({
|
||||
baseDirectory: __dirname,
|
||||
});
|
||||
|
||||
const eslintConfig = [
|
||||
...compat.extends("next/core-web-vitals", "next/typescript"),
|
||||
{
|
||||
ignores: [
|
||||
"node_modules/**",
|
||||
".next/**",
|
||||
"out/**",
|
||||
"build/**",
|
||||
"next-env.d.ts",
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
export default eslintConfig;
|
||||
|
||||
// import { dirname } from "path";
|
||||
// import { fileURLToPath } from "url";
|
||||
// import { FlatCompat } from "@eslint/eslintrc";
|
||||
|
||||
// const __filename = fileURLToPath(import.meta.url);
|
||||
// const __dirname = dirname(__filename);
|
||||
|
||||
// const compat = new FlatCompat({
|
||||
// baseDirectory: __dirname,
|
||||
// });
|
||||
|
||||
// const eslintConfig = [
|
||||
// ...compat.extends("next/core-web-vitals", "next/typescript"),
|
||||
// ];
|
||||
|
||||
// export default eslintConfig;
|
||||
1
google04b13fd53edd8dd1.html
Normal file
@@ -0,0 +1 @@
|
||||
google-site-verification: google04b13fd53edd8dd1.html
|
||||
218
next-sitemap.config.js
Normal file
@@ -0,0 +1,218 @@
|
||||
// next-sitemap.config.js
|
||||
/** @type {import('next-sitemap').IConfig} */
|
||||
module.exports = {
|
||||
siteUrl: 'https://modstagram.com', // دامنه اصلی سایت شما
|
||||
generateRobotsTxt: true, // تولید فایل robots.txt
|
||||
sitemapSize: 7000, // حداکثر تعداد URL در هر فایل سایتمپ
|
||||
changefreq: 'daily', // فرکانس پیشفرض تغییر صفحات
|
||||
priority: 0.7, // اولویت پیشفرض صفحات
|
||||
|
||||
// تابع transform برای فیلتر کردن و تنظیمات خاص هر مسیر
|
||||
transform: async (config, path) => {
|
||||
// مسیرهایی که نباید در سایتمپ باشند و نیازی به ایندکس شدن ندارند
|
||||
const excludedPaths = [
|
||||
'/settings',
|
||||
'/auth',
|
||||
'/new-post',
|
||||
'/offer',
|
||||
'/private/', // مسیرهای خصوصی
|
||||
// صفحات مربوط به پرداخت و ثبتنام/ورود
|
||||
'/projects/payment/success',
|
||||
'/projects/payment/failed',
|
||||
'/billboards/payment/success',
|
||||
'/billboards/payment/failed',
|
||||
'/forget-password',
|
||||
'/change-passowrd',
|
||||
'/login-with-username',
|
||||
'/login',
|
||||
'/register-otp',
|
||||
'/verify-otp',
|
||||
'/register',
|
||||
'/forget-password-otp',
|
||||
'/register/password',
|
||||
'/register/fullname',
|
||||
'/register/usertype',
|
||||
'/register/username',
|
||||
'/verify/avatar',
|
||||
'/verify/auth',
|
||||
'/verify/colors',
|
||||
'/verify/confirm',
|
||||
'/verify/expertise',
|
||||
'/verify/gender',
|
||||
'/verify/national-cart',
|
||||
'/verify/location',
|
||||
'/verify/public-relations',
|
||||
'/verify/cooperation-type',
|
||||
'/verify/services',
|
||||
'/verify/sizes',
|
||||
'/new-project', // اگر این یک صفحه فرم داخلی است که نیازی به ایندکس شدن ندارد
|
||||
'/billboards/new', // اگر این یک صفحه فرم داخلی است که نیازی به ایندکس شدن ندارد
|
||||
'/search', // اگر صفحه جستجو محتوای قابل ایندکس ندارد
|
||||
];
|
||||
|
||||
// اگر مسیر در لیست excludedPaths باشد، آن را از سایتمپ حذف کن
|
||||
if (excludedPaths.some(p => path.startsWith(p))) {
|
||||
return null;
|
||||
}
|
||||
|
||||
let pageChangefreq = config.changefreq;
|
||||
let pagePriority = config.priority;
|
||||
|
||||
// تنظیمات خاص برای مسیرهای مختلف
|
||||
if (path.startsWith('/users/')) { // مسیر برای پروفایلهای کاربران
|
||||
pageChangefreq = 'weekly';
|
||||
pagePriority = 0.6;
|
||||
}
|
||||
if (path.startsWith('/projects/') || path.startsWith('/billboards/')) {
|
||||
pageChangefreq = 'daily';
|
||||
pagePriority = 0.8;
|
||||
}
|
||||
if (path === '/') { // صفحه اصلی
|
||||
pageChangefreq = 'daily';
|
||||
pagePriority = 1.0;
|
||||
}
|
||||
if (path === '/about-us') { // صفحه درباره ما
|
||||
pageChangefreq = 'monthly';
|
||||
pagePriority = 0.8;
|
||||
}
|
||||
|
||||
return {
|
||||
loc: path, // آدرس کامل صفحه
|
||||
changefreq: pageChangefreq, // فرکانس تغییر صفحه
|
||||
priority: pagePriority, // اولویت صفحه
|
||||
lastmod: config.autoLastmod ? new Date().toISOString() : undefined, // تاریخ آخرین تغییر
|
||||
alternateRefs: config.alternateRefs ?? [],
|
||||
};
|
||||
},
|
||||
|
||||
// تابع additionalPaths برای اضافه کردن مسیرهای داینامیک از API
|
||||
additionalPaths: async (config) => {
|
||||
const paths = [];
|
||||
const BASE_URL_API = "https://app.modstagram.ir/api/v1"; // آدرس پایه API شما
|
||||
paths.push({
|
||||
loc: '/',
|
||||
changefreq: 'daily',
|
||||
priority: 1.0
|
||||
});
|
||||
paths.push({
|
||||
loc: '/projects',
|
||||
changefreq: 'daily',
|
||||
priority: 0.9
|
||||
});
|
||||
paths.push({
|
||||
loc: '/billboards',
|
||||
changefreq: 'daily', // یا weekly بسته به میزان تغییر محتوا
|
||||
priority: 0.9
|
||||
});
|
||||
try {
|
||||
// واکشی دادههای پروژهها
|
||||
const projectsRes = await fetch(`${BASE_URL_API}/projects?limit=500`);
|
||||
const projectsData = await projectsRes.json();
|
||||
if (projectsData && Array.isArray(projectsData.projects)) {
|
||||
projectsData.projects.forEach((project) => {
|
||||
if (project.id && project.title) {
|
||||
paths.push({
|
||||
// مسیر پروژهها (با استفاده از تمپلیت لیتِرال صحیح)
|
||||
loc: `/projects/${project.id}/${encodeURIComponent(project.title)}`,
|
||||
changefreq: 'daily',
|
||||
priority: 0.8
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// واکشی دادههای بیلبوردها
|
||||
const billboardsRes = await fetch(`${BASE_URL_API}/advertising/web?limit=500`);
|
||||
const billboardsData = await billboardsRes.json();
|
||||
if (billboardsData && Array.isArray(billboardsData.advertisings)) {
|
||||
billboardsData.advertisings.forEach((billboard) => {
|
||||
if (billboard._id && billboard.title) {
|
||||
paths.push({
|
||||
// مسیر بیلبوردها (با استفاده از تمپلیت لیتِرال صحیح)
|
||||
loc: `/billboards/${billboard._id}/${encodeURIComponent(billboard.title)}`,
|
||||
changefreq: 'daily',
|
||||
priority: 0.8
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// واکشی دادههای کاربران (مدلها)
|
||||
const usersRes = await fetch(`${BASE_URL_API}/users/web?limit=500`);
|
||||
const usersData = await usersRes.json();
|
||||
if (usersData && Array.isArray(usersData.users)) {
|
||||
usersData.users.forEach((user) => {
|
||||
if (user.user_name) {
|
||||
paths.push({
|
||||
// مسیر پروفایل کاربران (مسیر در Next.js شما /users/[username] است)
|
||||
loc: `/users/${encodeURIComponent(user.user_name)}`,
|
||||
changefreq: 'weekly',
|
||||
priority: 0.6
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
// لاگ کردن خطا در صورت مشکل در واکشی دادهها از API
|
||||
console.error('Error fetching additional paths for sitemap:', error);
|
||||
}
|
||||
|
||||
return paths; // بازگرداندن آرایهای از مسیرهای داینامیک
|
||||
},
|
||||
|
||||
// تنظیمات مربوط به فایل robots.txt
|
||||
robotsTxtOptions: {
|
||||
policies: [
|
||||
{
|
||||
userAgent: '*', // اعمال سیاستها برای همه رباتها
|
||||
allow: '/', // اجازه دسترسی به کل سایت
|
||||
disallow: [
|
||||
'/api/', // مسیرهای API
|
||||
'/_next/', // فایلهای داخلی Next.js
|
||||
'/settings', // صفحات تنظیمات
|
||||
'/auth', // صفحات احراز هویت (ورود، ثبتنام)
|
||||
'/private/', // مسیرهای خصوصی موجود
|
||||
'/new-post', // صفحات ایجاد پست جدید
|
||||
'/offer', // صفحات پیشنهاد
|
||||
// اضافه کردن مسیرهای پرداخت و ثبتنام/ورود به disallow
|
||||
'/projects/payment/success',
|
||||
'/projects/payment/failed',
|
||||
'/billboards/payment/success',
|
||||
'/billboards/payment/failed',
|
||||
'/forget-password',
|
||||
'/change-passowrd',
|
||||
'/login-with-username',
|
||||
'/login',
|
||||
'/register-otp',
|
||||
'/verify-otp',
|
||||
'/register',
|
||||
'/forget-password-otp',
|
||||
'/register/password',
|
||||
'/register/fullname',
|
||||
'/register/usertype',
|
||||
'/register/username',
|
||||
'/verify/avatar',
|
||||
'/verify/auth',
|
||||
'/verify/colors',
|
||||
'/verify/confirm',
|
||||
'/verify/expertise',
|
||||
'/verify/gender',
|
||||
'/verify/national-cart',
|
||||
'/verify/location',
|
||||
'/verify/public-relations',
|
||||
'/verify/cooperation-type',
|
||||
'/verify/services',
|
||||
'/verify/sizes',
|
||||
'/new-project',
|
||||
'/billboards/new',
|
||||
'/search', // اگر این صفحه برای ایندکس شدن نامناسب است
|
||||
],
|
||||
},
|
||||
],
|
||||
// اضافه کردن آدرس سایتمپ به robots.txt
|
||||
additionalSitemaps: [
|
||||
'https://modstagram.com/sitemap.xml',
|
||||
],
|
||||
},
|
||||
};
|
||||
74
next.config.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
const nextConfig = {
|
||||
// ۱. نادیده گرفتن خطاهای بیلد
|
||||
eslint: {
|
||||
ignoreDuringBuilds: true,
|
||||
},
|
||||
typescript: {
|
||||
ignoreBuildErrors: true,
|
||||
},
|
||||
|
||||
// ۲. تنظیمات تصاویر
|
||||
images: {
|
||||
remotePatterns: [
|
||||
{
|
||||
protocol: 'https',
|
||||
hostname: 'app.modstagram.ir',
|
||||
port: '',
|
||||
pathname: '/**',
|
||||
},
|
||||
{
|
||||
protocol: 'https',
|
||||
hostname: 'blog.modstagram.com', // اجازه دادن به نمایش تصاویر وبلاگ
|
||||
port: '',
|
||||
pathname: '/**',
|
||||
},
|
||||
{
|
||||
protocol: 'http',
|
||||
hostname: 'localhost',
|
||||
port: '',
|
||||
pathname: '/**',
|
||||
},
|
||||
],
|
||||
formats: ['image/avif', 'image/webp'],
|
||||
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
|
||||
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
|
||||
minimumCacheTTL: 31536000,
|
||||
},
|
||||
|
||||
// ۳. هدایت ترافیک سابفولدر به وردپرس (بخش جدید)
|
||||
async rewrites() {
|
||||
return [
|
||||
{
|
||||
source: '/blog',
|
||||
destination: 'https://blog.modstagram.com/blog',
|
||||
},
|
||||
{
|
||||
source: '/blog/:path*',
|
||||
destination: 'https://blog.modstagram.com/blog/:path*',
|
||||
},
|
||||
];
|
||||
},
|
||||
|
||||
// ۴. تنظیمات هدرها
|
||||
async headers() {
|
||||
return [
|
||||
{
|
||||
source: '/(.*)',
|
||||
headers: [
|
||||
{ key: 'X-DNS-Prefetch-Control', value: 'on' },
|
||||
{ key: 'Strict-Transport-Security', value: 'max-age=63072000; includeSubDomains; preload' },
|
||||
{ key: 'X-XSS-Protection', value: '1; mode=block' },
|
||||
{ key: 'X-Frame-Options', value: 'SAMEORIGIN' },
|
||||
{ key: 'X-Content-Type-Options', value: 'nosniff' },
|
||||
{ key: 'Referrer-Policy', value: 'origin-when-cross-origin' },
|
||||
{ key: 'Cache-Control', value: 'public, s-maxage=1, stale-while-revalidate=59' },
|
||||
],
|
||||
},
|
||||
];
|
||||
},
|
||||
|
||||
reactStrictMode: false,
|
||||
};
|
||||
|
||||
export default nextConfig;
|
||||
12575
package-lock.json
generated
Normal file
127
package.json
Normal file
@@ -0,0 +1,127 @@
|
||||
{
|
||||
"name": "modstagram-next",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "next start -p 3000 -H 0.0.0.0",
|
||||
"dev": "next dev -p 3000 -H 0.0.0.0",
|
||||
"build": "next build",
|
||||
"lint": "next lint",
|
||||
"postbuild": "next-sitemap"
|
||||
},
|
||||
"dependencies": {
|
||||
"@dnd-kit/core": "^6.3.1",
|
||||
"@dnd-kit/modifiers": "^9.0.0",
|
||||
"@dnd-kit/sortable": "^10.0.0",
|
||||
"@dnd-kit/utilities": "^3.2.2",
|
||||
"@headlessui/react": "^2.2.8",
|
||||
"@hookform/resolvers": "^5.2.2",
|
||||
"@radix-ui/react-alert-dialog": "^1.1.15",
|
||||
"@radix-ui/react-avatar": "^1.1.10",
|
||||
"@radix-ui/react-checkbox": "^1.3.3",
|
||||
"@radix-ui/react-dialog": "^1.1.15",
|
||||
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
||||
"@radix-ui/react-icons": "^1.3.2",
|
||||
"@radix-ui/react-label": "^2.1.7",
|
||||
"@radix-ui/react-navigation-menu": "^1.2.14",
|
||||
"@radix-ui/react-popover": "^1.1.15",
|
||||
"@radix-ui/react-progress": "^1.1.7",
|
||||
"@radix-ui/react-radio-group": "^1.3.8",
|
||||
"@radix-ui/react-scroll-area": "^1.2.10",
|
||||
"@radix-ui/react-select": "^2.2.6",
|
||||
"@radix-ui/react-separator": "^1.1.7",
|
||||
"@radix-ui/react-slider": "^1.3.6",
|
||||
"@radix-ui/react-slot": "^1.2.3",
|
||||
"@radix-ui/react-switch": "^1.2.6",
|
||||
"@radix-ui/react-tabs": "^1.1.13",
|
||||
"@radix-ui/react-toast": "^1.2.15",
|
||||
"@radix-ui/react-toggle": "^1.1.10",
|
||||
"@radix-ui/react-toggle-group": "^1.1.11",
|
||||
"@radix-ui/react-tooltip": "^1.2.8",
|
||||
"@radix-ui/themes": "^3.2.1",
|
||||
"@shadcn/ui": "^0.0.4",
|
||||
"@tabler/icons-react": "^3.34.1",
|
||||
"@tanstack/react-query": "^5.87.1",
|
||||
"@tanstack/react-table": "^8.21.3",
|
||||
"@vitalets/google-translate-api": "^9.2.1",
|
||||
"axios": "^1.7.9",
|
||||
"chart.js": "^4.5.0",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"embla-carousel-react": "^8.6.0",
|
||||
"formik": "^2.4.6",
|
||||
"framer-motion": "^12.23.12",
|
||||
"i18next": "^25.3.6",
|
||||
"i18next-browser-languagedetector": "^8.2.0",
|
||||
"i18next-http-backend": "^3.0.2",
|
||||
"jalali-moment": "^3.3.11",
|
||||
"js-cookie": "^3.0.5",
|
||||
"jszip": "^3.10.1",
|
||||
"leaflet": "^1.9.4",
|
||||
"lodash": "^4.17.21",
|
||||
"lucide-react": "^0.541.0",
|
||||
"mapbox-gl": "^3.9.3",
|
||||
"next": "^15.5.2",
|
||||
"next-i18next": "^15.4.2",
|
||||
"next-seo": "^6.8.0",
|
||||
"next-sitemap": "^4.2.3",
|
||||
"next-themes": "^0.4.6",
|
||||
"node-fetch": "^3.3.2",
|
||||
"openai": "^5.21.0",
|
||||
"radix-ui": "^1.4.3",
|
||||
"rc-rate": "^2.13.0",
|
||||
"react": "^18.3.1",
|
||||
"react-chartjs-2": "^5.3.0",
|
||||
"react-confetti": "^6.4.0",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-easy-crop": "^5.5.0",
|
||||
"react-hook-form": "^7.65.0",
|
||||
"react-hot-toast": "^2.5.1",
|
||||
"react-i18next": "^15.6.1",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-leaflet": "^4.2.1",
|
||||
"react-map-gl": "^7.1.8",
|
||||
"react-modal": "^3.16.3",
|
||||
"react-multi-date-picker": "^4.5.2",
|
||||
"react-otp-input": "^3.1.1",
|
||||
"react-slick": "^0.31.0",
|
||||
"react-use": "^17.6.0",
|
||||
"recharts": "^2.15.4",
|
||||
"sharp": "^0.34.5",
|
||||
"slick-carousel": "^1.8.1",
|
||||
"socket.io-client": "^4.8.1",
|
||||
"sonner": "^2.0.7",
|
||||
"swiper": "^11.2.2",
|
||||
"tailwind-merge": "^3.3.1",
|
||||
"tailwindcss-rtl": "^0.9.0",
|
||||
"three": "^0.180.0",
|
||||
"translate-google": "^1.5.0",
|
||||
"uuid": "^11.1.0",
|
||||
"vaul": "^1.1.2",
|
||||
"yet-another-react-lightbox": "^3.25.0",
|
||||
"yup": "^1.7.1",
|
||||
"zod": "^3.25.76"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/eslintrc": "^3",
|
||||
"@ffmpeg/ffmpeg": "^0.12.10",
|
||||
"@ffmpeg/util": "^0.12.1",
|
||||
"@tailwindcss/postcss": "^4.2.4",
|
||||
"@types/js-cookie": "^3.0.6",
|
||||
"@types/leaflet": "^1.9.20",
|
||||
"@types/lodash": "^4.17.20",
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19",
|
||||
"@types/react-dom": "^19",
|
||||
"@types/react-modal": "^3.16.3",
|
||||
"@types/react-slick": "^0.23.13",
|
||||
"autoprefixer": "^10.4.21",
|
||||
"eslint": "^9",
|
||||
"eslint-config-next": "15.1.5",
|
||||
"postcss": "^8.5.14",
|
||||
"tailwindcss": "^4.2.4",
|
||||
"ts-node": "^10.9.2",
|
||||
"tw-animate-css": "^1.3.8",
|
||||
"typescript": "^5"
|
||||
}
|
||||
}
|
||||
127
package.jsonغ
Normal file
@@ -0,0 +1,127 @@
|
||||
{
|
||||
"name": "modstagram-next",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "next start -p 3000 -H 0.0.0.0",
|
||||
"dev": "next dev -p 3000 -H 0.0.0.0",
|
||||
"build": "next build"
|
||||
"lint": "next lint",
|
||||
"postbuild": "next-sitemap"
|
||||
},
|
||||
"dependencies": {
|
||||
"@dnd-kit/core": "^6.3.1",
|
||||
"@dnd-kit/modifiers": "^9.0.0",
|
||||
"@dnd-kit/sortable": "^10.0.0",
|
||||
"@dnd-kit/utilities": "^3.2.2",
|
||||
"@headlessui/react": "^2.2.8",
|
||||
"@hookform/resolvers": "^5.2.2",
|
||||
"@radix-ui/react-alert-dialog": "^1.1.15",
|
||||
"@radix-ui/react-avatar": "^1.1.10",
|
||||
"@radix-ui/react-checkbox": "^1.3.3",
|
||||
"@radix-ui/react-dialog": "^1.1.15",
|
||||
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
||||
"@radix-ui/react-icons": "^1.3.2",
|
||||
"@radix-ui/react-label": "^2.1.7",
|
||||
"@radix-ui/react-navigation-menu": "^1.2.14",
|
||||
"@radix-ui/react-popover": "^1.1.15",
|
||||
"@radix-ui/react-progress": "^1.1.7",
|
||||
"@radix-ui/react-radio-group": "^1.3.8",
|
||||
"@radix-ui/react-scroll-area": "^1.2.10",
|
||||
"@radix-ui/react-select": "^2.2.6",
|
||||
"@radix-ui/react-separator": "^1.1.7",
|
||||
"@radix-ui/react-slider": "^1.3.6",
|
||||
"@radix-ui/react-slot": "^1.2.3",
|
||||
"@radix-ui/react-switch": "^1.2.6",
|
||||
"@radix-ui/react-tabs": "^1.1.13",
|
||||
"@radix-ui/react-toast": "^1.2.15",
|
||||
"@radix-ui/react-toggle": "^1.1.10",
|
||||
"@radix-ui/react-toggle-group": "^1.1.11",
|
||||
"@radix-ui/react-tooltip": "^1.2.8",
|
||||
"@radix-ui/themes": "^3.2.1",
|
||||
"@shadcn/ui": "^0.0.4",
|
||||
"@tabler/icons-react": "^3.34.1",
|
||||
"@tanstack/react-query": "^5.87.1",
|
||||
"@tanstack/react-table": "^8.21.3",
|
||||
"@vitalets/google-translate-api": "^9.2.1",
|
||||
"axios": "^1.7.9",
|
||||
"chart.js": "^4.5.0",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"embla-carousel-react": "^8.6.0",
|
||||
"formik": "^2.4.6",
|
||||
"framer-motion": "^12.23.12",
|
||||
"i18next": "^25.3.6",
|
||||
"i18next-browser-languagedetector": "^8.2.0",
|
||||
"i18next-http-backend": "^3.0.2",
|
||||
"jalali-moment": "^3.3.11",
|
||||
"js-cookie": "^3.0.5",
|
||||
"jszip": "^3.10.1",
|
||||
"leaflet": "^1.9.4",
|
||||
"lodash": "^4.17.21",
|
||||
"lucide-react": "^0.541.0",
|
||||
"mapbox-gl": "^3.9.3",
|
||||
"next": "^15.5.2",
|
||||
"next-i18next": "^15.4.2",
|
||||
"next-seo": "^6.8.0",
|
||||
"next-sitemap": "^4.2.3",
|
||||
"next-themes": "^0.4.6",
|
||||
"node-fetch": "^3.3.2",
|
||||
"openai": "^5.21.0",
|
||||
"radix-ui": "^1.4.3",
|
||||
"rc-rate": "^2.13.0",
|
||||
"react": "^18.3.1",
|
||||
"react-chartjs-2": "^5.3.0",
|
||||
"react-confetti": "^6.4.0",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-easy-crop": "^5.5.0",
|
||||
"react-hook-form": "^7.65.0",
|
||||
"react-hot-toast": "^2.5.1",
|
||||
"react-i18next": "^15.6.1",
|
||||
"react-icons": "^5.5.0",
|
||||
"react-leaflet": "^4.2.1",
|
||||
"react-map-gl": "^7.1.8",
|
||||
"react-modal": "^3.16.3",
|
||||
"react-multi-date-picker": "^4.5.2",
|
||||
"react-otp-input": "^3.1.1",
|
||||
"react-slick": "^0.31.0",
|
||||
"react-use": "^17.6.0",
|
||||
"recharts": "^2.15.4",
|
||||
"sharp": "^0.34.5",
|
||||
"slick-carousel": "^1.8.1",
|
||||
"socket.io-client": "^4.8.1",
|
||||
"sonner": "^2.0.7",
|
||||
"swiper": "^11.2.2",
|
||||
"tailwind-merge": "^3.3.1",
|
||||
"tailwindcss-rtl": "^0.9.0",
|
||||
"three": "^0.180.0",
|
||||
"translate-google": "^1.5.0",
|
||||
"uuid": "^11.1.0",
|
||||
"vaul": "^1.1.2",
|
||||
"yet-another-react-lightbox": "^3.25.0",
|
||||
"yup": "^1.7.1",
|
||||
"zod": "^3.25.76"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/eslintrc": "^3",
|
||||
"@ffmpeg/ffmpeg": "^0.12.10",
|
||||
"@ffmpeg/util": "^0.12.1",
|
||||
"@tailwindcss/postcss": "^4.2.4",
|
||||
"@types/js-cookie": "^3.0.6",
|
||||
"@types/leaflet": "^1.9.20",
|
||||
"@types/lodash": "^4.17.20",
|
||||
"@types/node": "^20",
|
||||
"@types/react": "^19",
|
||||
"@types/react-dom": "^19",
|
||||
"@types/react-modal": "^3.16.3",
|
||||
"@types/react-slick": "^0.23.13",
|
||||
"autoprefixer": "^10.4.21",
|
||||
"eslint": "^9",
|
||||
"eslint-config-next": "15.1.5",
|
||||
"postcss": "^8.5.14",
|
||||
"tailwindcss": "^4.2.4",
|
||||
"ts-node": "^10.9.2",
|
||||
"tw-animate-css": "^1.3.8",
|
||||
"typescript": "^5"
|
||||
}
|
||||
}
|
||||
5
postcss.config.mjs
Normal file
@@ -0,0 +1,5 @@
|
||||
export default {
|
||||
plugins: {
|
||||
"@tailwindcss/postcss": {},
|
||||
},
|
||||
};
|
||||
BIN
public/fonts/IRANSansX-Black.woff
Normal file
BIN
public/fonts/IRANSansX-Bold.woff
Normal file
BIN
public/fonts/IRANSansX-DemiBold.woff
Normal file
BIN
public/fonts/IRANSansX-ExtraBold.woff
Normal file
BIN
public/fonts/IRANSansX-Light.woff
Normal file
BIN
public/fonts/IRANSansX-Medium.woff
Normal file
BIN
public/fonts/IRANSansX-Regular.woff
Normal file
BIN
public/fonts/IRANSansX-Thin.woff
Normal file
BIN
public/fonts/IRANSansX-UltraLight.woff
Normal file
BIN
public/images/eyes/01.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
public/images/eyes/02.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/eyes/03.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
public/images/eyes/04.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/05.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/eyes/06.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/07.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
public/images/eyes/08.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
public/images/eyes/09.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
public/images/eyes/10.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/11.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/12.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/13.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
public/images/eyes/14.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/15.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/16.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/eyes/17.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/18.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/19.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/20.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/21.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
public/images/eyes/22.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/eyes/23.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
public/images/eyes/24.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
public/images/eyes/25.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/images/eyes/26.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/images/fake-avatar.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
public/images/hairs/01.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/02.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/03.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/hairs/04.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/05.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/06.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
public/images/hairs/07.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/08.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/09.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/10.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/11.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/12.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/13.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/14.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/15.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/hairs/16.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/hairs/17.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/hairs/18.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/hairs/19.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/20.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/hairs/21.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/22.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/hairs/23.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/24.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/hairs/25.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/hairs/26.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/27.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/28.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
public/images/hairs/29.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/30.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/31.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/32.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/33.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/34.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/35.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/36.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
public/images/hairs/37.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/38.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/39.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/40.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/41.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/42.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/43.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/44.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/45.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
public/images/hairs/46.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
public/images/hairs/47.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
public/images/hairs/48.png
Normal file
|
After Width: | Height: | Size: 25 KiB |
BIN
public/images/hairs/49.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
public/images/hairs/50.png
Normal file
|
After Width: | Height: | Size: 25 KiB |