Initial commit: Arad Arisman corporate website

Next.js site for Arad Arisman (livestock/poultry feed supplements) with:
- Homepage with full-screen image slider, product/category showcases, stats
- About, Contact pages
- Products catalog with pagination and detail pages
- Blog with pagination and detail pages
- RTL Persian layout with Vazirmatn font
This commit is contained in:
2026-08-09 21:05:26 +03:30
commit e34fbe6e72
88 changed files with 9578 additions and 0 deletions
+11
View File
@@ -0,0 +1,11 @@
{
"version": "0.0.1",
"configurations": [
{
"name": "arad-arisman-dev",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev"],
"port": 3000
}
]
}
+44
View File
@@ -0,0 +1,44 @@
# 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
# claude code local settings
.claude/settings.local.json
+9
View File
@@ -0,0 +1,9 @@
<!-- BEGIN:nextjs-agent-rules -->
# This is NOT the Next.js you know
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
<!-- END:nextjs-agent-rules -->
+1
View File
@@ -0,0 +1 @@
@AGENTS.md
+36
View 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.
+18
View File
@@ -0,0 +1,18 @@
import { defineConfig, globalIgnores } from "eslint/config";
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTs from "eslint-config-next/typescript";
const eslintConfig = defineConfig([
...nextVitals,
...nextTs,
// Override default ignores of eslint-config-next.
globalIgnores([
// Default ignores of eslint-config-next:
".next/**",
"out/**",
"build/**",
"next-env.d.ts",
]),
]);
export default eslintConfig;
+14
View File
@@ -0,0 +1,14 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
images: {
remotePatterns: [
{
protocol: "https",
hostname: "images.unsplash.com",
},
],
},
};
export default nextConfig;
+6895
View File
File diff suppressed because it is too large Load Diff
+26
View File
@@ -0,0 +1,26 @@
{
"name": "arad-arisman",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "eslint"
},
"dependencies": {
"next": "16.3.0",
"react": "19.2.8",
"react-dom": "19.2.8"
},
"devDependencies": {
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "16.3.0",
"tailwindcss": "^4",
"typescript": "^5"
}
}
+7
View File
@@ -0,0 +1,7 @@
const config = {
plugins: {
"@tailwindcss/postcss": {},
},
};
export default config;
+11
View File
@@ -0,0 +1,11 @@
Create a website from this website
https://www.aradarisman.com/
You can use content and images
Lang:fa
Directions: rtl
Use next js
Design only homepage
Use the same font or some cool Persian font
Sections are the same
+1
View File
@@ -0,0 +1 @@
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 391 B

+1
View File
@@ -0,0 +1 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 546 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 546 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 526 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+1
View File
@@ -0,0 +1 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 128 B

+1
View File
@@ -0,0 +1 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>

After

Width:  |  Height:  |  Size: 385 B

+119
View File
@@ -0,0 +1,119 @@
import type { Metadata } from "next";
import Image from "next/image";
import Link from "next/link";
import Container from "@/components/Container";
import PageBanner from "@/components/PageBanner";
import MissionVision from "@/components/MissionVision";
import ImportCountries from "@/components/ImportCountries";
import Features from "@/components/Features";
import Partners from "@/components/Partners";
export const metadata: Metadata = {
title: "درباره ما | آراد آریسمان",
description:
"آشنایی با شرکت آراد آریسمان؛ بیش از ۲۳ سال تجربه در تولید و عرضه مکمل‌های غذایی دام، طیور و زنبور عسل.",
};
export default function AboutPage() {
return (
<>
<PageBanner
title="درباره آراد آریسمان"
subtitle="بیش از دو دهه تجربه در تولید و عرضه مکمل‌های غذایی دام، طیور و زنبور عسل"
breadcrumb="درباره ما"
/>
<section className="py-16 sm:py-20">
<Container className="grid grid-cols-1 lg:grid-cols-2 items-center gap-12">
<div className="relative aspect-[4/3] rounded-3xl overflow-hidden shadow-xl bg-surface order-2 lg:order-1">
<Image
src="/images/category-3.jpg"
alt="محصولات آراد آریسمان"
fill
className="object-contain p-6"
sizes="(min-width: 1024px) 45vw, 90vw"
/>
</div>
<div className="order-1 lg:order-2 text-center lg:text-start">
<span className="text-sm font-bold text-accent">داستان ما</span>
<h2 className="mt-3 text-3xl sm:text-4xl font-extrabold text-primary">
تغذیه مطمئن، پرورش موفق
</h2>
<p className="mt-6 leading-8 text-foreground">
شرکت آراد آریسمان پیشرو در تولید و عرضه افزودنیهای خوراک، ویتامینها و
مکملهای غذایی دام و طیور با بیش از ۲۳ سال فعالیت در بازار ایران میباشد.
واردات این شرکت عمدتا از تولیدکنندگان معتبر بینالمللی غذای دام و طیور از
کشورهای انگلستان، فرانسه، ترکیه، هندوستان و چین میباشد.
</p>
<p className="mt-4 leading-8 text-foreground">
در طول این سالها، تمرکز اصلی ما بر تضمین کیفیت، ثبات ترکیبات و پاسخگویی
به نیاز واقعی دامداران، مرغداران و پرورشدهندگان زنبور عسل بوده است؛
نتیجهی این رویکرد، اعتماد پایدار بیش از ۲۳۰ مشتری در سراسر کشور است.
</p>
<div className="mt-8 flex justify-center lg:justify-start gap-10">
<div>
<div className="text-3xl font-extrabold text-primary">۲۳+</div>
<div className="mt-1 text-sm text-foreground">سال تجربه</div>
</div>
<div>
<div className="text-3xl font-extrabold text-primary">۲۳۰+</div>
<div className="mt-1 text-sm text-foreground">رضایت مشتری</div>
</div>
<div>
<div className="text-3xl font-extrabold text-primary">۵</div>
<div className="mt-1 text-sm text-foreground">کشور واردات</div>
</div>
</div>
</div>
</Container>
</section>
<MissionVision />
<section className="bg-surface">
<Container className="pt-16 sm:pt-20 text-center max-w-xl mx-auto">
<span className="text-sm font-bold text-accent">چرا آراد آریسمان</span>
<h2 className="mt-3 text-3xl sm:text-4xl font-extrabold text-primary">
مزایای مکملهای آراد آریسمان
</h2>
</Container>
<Features />
</section>
<ImportCountries />
<Partners />
<section className="py-16 sm:py-20">
<Container>
<div className="rounded-3xl bg-primary px-8 py-14 sm:px-16 text-center">
<h2 className="text-2xl sm:text-3xl font-extrabold text-white">
برای مشاوره و خرید محصولات همین حالا با ما در تماس باشید
</h2>
<p className="mt-4 text-white/80 max-w-xl mx-auto">
کارشناسان آراد آریسمان آماده پاسخگویی به سوالات شما درباره مکملها و
نحوه مصرف آنها هستند.
</p>
<div className="mt-8 flex flex-wrap justify-center gap-4">
<Link
href="/contact"
className="rounded-full bg-white px-7 py-3.5 text-primary font-semibold hover:bg-white/90 transition-colors"
>
تماس با ما
</Link>
<a
href="tel:09104067935"
dir="ltr"
className="rounded-full border border-white/30 px-7 py-3.5 text-white font-semibold hover:bg-white/10 transition-colors"
>
09104067935
</a>
</div>
</div>
</Container>
</section>
</>
);
}
+119
View File
@@ -0,0 +1,119 @@
import type { Metadata } from "next";
import Image from "next/image";
import Link from "next/link";
import { notFound } from "next/navigation";
import Container from "@/components/Container";
import PageBanner from "@/components/PageBanner";
import PostCard from "@/components/PostCard";
import { getPostBySlug, getRelatedPosts, posts } from "@/data/posts";
export function generateStaticParams() {
return posts.map((p) => ({ slug: p.slug }));
}
export async function generateMetadata({
params,
}: {
params: Promise<{ slug: string }>;
}): Promise<Metadata> {
const { slug } = await params;
const post = getPostBySlug(slug);
if (!post) return {};
return {
title: `${post.title} | آراد آریسمان`,
description: post.excerpt,
};
}
export default async function BlogDetailPage({
params,
}: {
params: Promise<{ slug: string }>;
}) {
const { slug } = await params;
const post = getPostBySlug(slug);
if (!post) notFound();
const related = getRelatedPosts(post);
return (
<>
<PageBanner title={post.title} breadcrumb="مقالات" />
<section className="py-16 sm:py-20">
<Container className="max-w-3xl">
<Link
href="/blog"
className="inline-flex items-center gap-2 text-sm font-semibold text-primary hover:text-primary-dark transition-colors"
>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path
d="M10.7 18.7a1 1 0 0 1-1.4 0l-6-6a1 1 0 0 1 0-1.4l6-6a1 1 0 1 1 1.4 1.4L6 11.3h14a1 1 0 1 1 0 2H6l4.7 4.3a1 1 0 0 1 0 1.4Z"
fill="currentColor"
/>
</svg>
بازگشت به مقالات
</Link>
<div className="mt-6 flex items-center gap-3 text-sm text-foreground/70">
<span className="rounded-full bg-primary/5 px-3 py-1 text-xs font-semibold text-primary">
{post.category}
</span>
<span>{post.date}</span>
<span className="h-1 w-1 rounded-full bg-foreground/30" />
<span>{post.readingTime}</span>
</div>
<div className="relative mt-6 aspect-[16/9] rounded-3xl overflow-hidden shadow-xl bg-surface">
<Image
src={post.cover}
alt={post.title}
fill
priority
className="object-cover"
sizes="(min-width: 1024px) 768px, 100vw"
/>
</div>
<div className="mt-8 space-y-5">
{post.content.map((paragraph) => (
<p key={paragraph} className="leading-8 text-foreground">
{paragraph}
</p>
))}
</div>
<div className="mt-10 rounded-2xl bg-surface p-6 flex flex-wrap items-center justify-between gap-4">
<div>
<p className="font-bold text-secondary">نویسنده: تیم آراد آریسمان</p>
<p className="mt-1 text-sm text-foreground">
برای مشاوره تخصصی تغذیه دام و طیور با ما در تماس باشید.
</p>
</div>
<Link
href="/contact"
className="rounded-full bg-primary px-6 py-3 text-white font-semibold hover:bg-primary-dark transition-colors shrink-0"
>
تماس با ما
</Link>
</div>
</Container>
</section>
{related.length > 0 && (
<section className="pb-16 sm:pb-20 bg-surface pt-16">
<Container>
<h2 className="text-2xl font-extrabold text-primary">
مقالات مرتبط
</h2>
<div className="mt-8 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
{related.map((p) => (
<PostCard key={p.id} post={p} />
))}
</div>
</Container>
</section>
)}
</>
);
}
+52
View File
@@ -0,0 +1,52 @@
import type { Metadata } from "next";
import Container from "@/components/Container";
import PageBanner from "@/components/PageBanner";
import PostCard from "@/components/PostCard";
import Pagination from "@/components/Pagination";
import { posts } from "@/data/posts";
export const metadata: Metadata = {
title: "مقالات | آراد آریسمان",
description:
"مقالات آموزشی درباره تغذیه دام، طیور و زنبور عسل از تیم آراد آریسمان.",
};
const PAGE_SIZE = 6;
export default async function BlogPage({
searchParams,
}: {
searchParams: Promise<{ page?: string }>;
}) {
const { page } = await searchParams;
const totalPages = Math.max(1, Math.ceil(posts.length / PAGE_SIZE));
const currentPage = Math.min(Math.max(1, Number(page) || 1), totalPages);
const start = (currentPage - 1) * PAGE_SIZE;
const pageItems = posts.slice(start, start + PAGE_SIZE);
return (
<>
<PageBanner
title="مقالات آراد آریسمان"
subtitle="نکات آموزشی و تخصصی درباره تغذیه دام، طیور و زنبور عسل"
breadcrumb="مقالات"
/>
<section className="py-16 sm:py-20">
<Container>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
{pageItems.map((post) => (
<PostCard key={post.id} post={post} />
))}
</div>
<Pagination
currentPage={currentPage}
totalPages={totalPages}
basePath="/blog"
/>
</Container>
</section>
</>
);
}
+101
View File
@@ -0,0 +1,101 @@
import type { Metadata } from "next";
import Container from "@/components/Container";
import PageBanner from "@/components/PageBanner";
import ContactInfo from "@/components/ContactInfo";
import ContactForm from "@/components/ContactForm";
export const metadata: Metadata = {
title: "تماس با ما | آراد آریسمان",
description:
"راه‌های ارتباطی با شرکت آراد آریسمان؛ آدرس، تلفن تماس و فرم ارسال پیام.",
};
const mapQuery = encodeURIComponent(
"قم، شهرک صنعتی شکوهیه، خیابان شهید بروجردی"
);
export default function ContactPage() {
return (
<>
<PageBanner
title="تماس با ما"
subtitle="سوالات، پیشنهادات یا درخواست مشاوره خود را برای ما بفرستید؛ کارشناسان آراد آریسمان در اسرع وقت پاسخگوی شما خواهند بود."
breadcrumb="تماس با ما"
/>
<section className="py-16 sm:py-20">
<Container>
<ContactInfo />
<div className="mt-14 grid grid-cols-1 lg:grid-cols-5 gap-10">
<div className="lg:col-span-3 rounded-2xl border border-black/5 bg-white p-6 sm:p-8 shadow-sm">
<h2 className="text-xl font-bold text-secondary">
فرم ارسال پیام
</h2>
<p className="mt-2 text-sm text-foreground">
فرم زیر را تکمیل کنید تا در اسرع وقت با شما تماس بگیریم.
</p>
<div className="mt-6">
<ContactForm />
</div>
</div>
<div className="lg:col-span-2 flex flex-col gap-5">
<div className="relative flex-1 min-h-[280px] rounded-2xl overflow-hidden border border-black/5 shadow-sm">
<iframe
title="نقشه آراد آریسمان"
src={`https://www.google.com/maps?q=${mapQuery}&output=embed`}
className="absolute inset-0 h-full w-full border-0"
loading="lazy"
referrerPolicy="no-referrer-when-downgrade"
/>
</div>
<div className="rounded-2xl bg-secondary p-7 text-white">
<h3 className="font-bold">ما را در شبکههای اجتماعی دنبال کنید</h3>
<div className="mt-5 flex items-center gap-4">
<a
href="#"
aria-label="تلگرام"
className="flex h-10 w-10 items-center justify-center rounded-full bg-white/10 hover:bg-accent hover:text-secondary transition-colors"
>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path
d="M21.5 3.5 2.8 10.9c-1 .4-1 1.7.1 2l4.7 1.5 1.8 5.6c.2.6 1 .8 1.4.3l2.5-2.7 4.9 3.6c.6.5 1.6.1 1.8-.6l3-15.6c.2-1-.7-1.8-1.5-1.5z"
fill="currentColor"
/>
</svg>
</a>
<a
href="#"
aria-label="واتساپ"
className="flex h-10 w-10 items-center justify-center rounded-full bg-white/10 hover:bg-accent hover:text-secondary transition-colors"
>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path
d="M12 2a10 10 0 0 0-8.6 15.1L2 22l5-1.4A10 10 0 1 0 12 2Zm0 18.2a8.1 8.1 0 0 1-4.2-1.1l-.3-.2-3 .8.8-2.9-.2-.3A8.2 8.2 0 1 1 12 20.2Zm4.5-6.1c-.2-.1-1.5-.7-1.7-.8-.2-.1-.4-.1-.6.1-.2.2-.7.8-.8 1-.2.2-.3.2-.5.1a6.7 6.7 0 0 1-2-1.2 7.4 7.4 0 0 1-1.4-1.7c-.1-.2 0-.4.1-.5l.4-.4c.1-.2.2-.3.2-.5.1-.2 0-.4 0-.5-.1-.1-.6-1.5-.8-2-.2-.5-.4-.4-.6-.4h-.5c-.2 0-.5.1-.7.3-.2.2-.9.9-.9 2.2s.9 2.6 1.1 2.8c.1.2 1.9 3 4.7 4.1.7.3 1.2.4 1.6.6.7.2 1.3.2 1.8.1.5-.1 1.5-.6 1.7-1.2.2-.6.2-1.1.2-1.2-.1-.2-.3-.2-.5-.3Z"
fill="currentColor"
/>
</svg>
</a>
<a
href="tel:09104067935"
aria-label="تماس تلفنی"
className="flex h-10 w-10 items-center justify-center rounded-full bg-white/10 hover:bg-accent hover:text-secondary transition-colors"
>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path
d="M6.6 10.8c1.4 2.8 3.8 5.1 6.6 6.6l2.2-2.2c.3-.3.7-.4 1-.2 1.1.4 2.3.6 3.6.6.6 0 1 .4 1 1V20c0 .6-.4 1-1 1C10.6 21 3 13.4 3 4c0-.6.4-1 1-1h3.5c.6 0 1 .4 1 1 0 1.3.2 2.5.6 3.6.1.4 0 .8-.2 1L6.6 10.8z"
fill="currentColor"
/>
</svg>
</a>
</div>
</div>
</div>
</div>
</Container>
</section>
</>
);
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

+28
View File
@@ -0,0 +1,28 @@
@import "tailwindcss";
:root {
--background: #ffffff;
--foreground: #5c6873;
--primary: #16423d;
--primary-dark: #0c2925;
--secondary: #121c27;
--accent: #cfa15b;
--surface: #f4f6f5;
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-primary: var(--primary);
--color-primary-dark: var(--primary-dark);
--color-secondary: var(--secondary);
--color-accent: var(--accent);
--color-surface: var(--surface);
--font-sans: var(--font-vazirmatn);
}
body {
background: var(--background);
color: var(--foreground);
font-family: var(--font-vazirmatn), Tahoma, sans-serif;
}
+33
View File
@@ -0,0 +1,33 @@
import type { Metadata } from "next";
import { Vazirmatn } from "next/font/google";
import Header from "@/components/Header";
import Footer from "@/components/Footer";
import "./globals.css";
const vazirmatn = Vazirmatn({
variable: "--font-vazirmatn",
subsets: ["arabic"],
weight: ["300", "400", "500", "600", "700", "800"],
});
export const metadata: Metadata = {
title: "آراد آریسمان | صفحه اصلی",
description:
"شرکت آراد آریسمان، تولید و عرضه مکمل‌ها، ویتامین‌ها و افزودنی‌های خوراک دام و طیور با بیش از ۲۳ سال تجربه.",
};
export default function RootLayout({ children }: LayoutProps<"/">) {
return (
<html
lang="fa"
dir="rtl"
className={`${vazirmatn.variable} h-full antialiased`}
>
<body className="min-h-full flex flex-col">
<Header />
<main className="flex-1 pt-[125px]">{children}</main>
<Footer />
</body>
</html>
);
}
+21
View File
@@ -0,0 +1,21 @@
import HeroSlider from "@/components/HeroSlider";
import Features from "@/components/Features";
import Categories from "@/components/Categories";
import Stats from "@/components/Stats";
import Products from "@/components/Products";
import About from "@/components/About";
import Partners from "@/components/Partners";
export default function Home() {
return (
<>
<HeroSlider />
<Features />
<Categories />
<Stats />
<Products />
<About />
<Partners />
</>
);
}
+174
View File
@@ -0,0 +1,174 @@
import type { Metadata } from "next";
import Image from "next/image";
import Link from "next/link";
import { notFound } from "next/navigation";
import Container from "@/components/Container";
import PageBanner from "@/components/PageBanner";
import ProductCard from "@/components/ProductCard";
import {
getProductBySlug,
getRelatedProducts,
products,
} from "@/data/products";
export function generateStaticParams() {
return products.map((p) => ({ slug: p.slug }));
}
export async function generateMetadata({
params,
}: {
params: Promise<{ slug: string }>;
}): Promise<Metadata> {
const { slug } = await params;
const product = getProductBySlug(slug);
if (!product) return {};
return {
title: `${product.title} | آراد آریسمان`,
description: product.shortDesc,
};
}
export default async function ProductDetailPage({
params,
}: {
params: Promise<{ slug: string }>;
}) {
const { slug } = await params;
const product = getProductBySlug(slug);
if (!product) notFound();
const related = getRelatedProducts(product);
return (
<>
<PageBanner
title={product.title}
subtitle={product.shortDesc}
breadcrumb={product.title}
/>
<section className="py-16 sm:py-20">
<Container>
<Link
href="/products"
className="inline-flex items-center gap-2 text-sm font-semibold text-primary hover:text-primary-dark transition-colors"
>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<path
d="M10.7 18.7a1 1 0 0 1-1.4 0l-6-6a1 1 0 0 1 0-1.4l6-6a1 1 0 1 1 1.4 1.4L6 11.3h14a1 1 0 1 1 0 2H6l4.7 4.3a1 1 0 0 1 0 1.4Z"
fill="currentColor"
/>
</svg>
بازگشت به محصولات
</Link>
<div className="mt-8 grid grid-cols-1 lg:grid-cols-2 gap-12">
<div className="relative aspect-square rounded-3xl overflow-hidden shadow-xl bg-surface">
<Image
src={product.image}
alt={product.title}
fill
priority
className="object-cover"
sizes="(min-width: 1024px) 45vw, 90vw"
/>
<span className="absolute top-4 right-4 rounded-full bg-white/90 backdrop-blur px-4 py-1.5 text-sm font-semibold text-primary">
{product.category}
</span>
</div>
<div>
<h1 className="text-2xl sm:text-3xl font-extrabold text-primary">
{product.title}
</h1>
<p className="mt-3 text-foreground leading-8">
{product.shortDesc}
</p>
<div className="mt-6 flex items-center gap-3">
<span className="text-xl font-extrabold text-primary">
تماس بگیرید
</span>
<span className="text-sm text-foreground/60">
({product.packaging})
</span>
</div>
<div className="mt-6 flex flex-wrap gap-3">
<a
href="tel:09104067935"
dir="ltr"
className="rounded-full bg-primary px-7 py-3.5 text-white font-semibold hover:bg-primary-dark transition-colors"
>
09104067935
</a>
<Link
href="/contact"
className="rounded-full border border-primary/30 px-7 py-3.5 text-primary font-semibold hover:bg-primary/5 transition-colors"
>
استعلام قیمت
</Link>
</div>
<div className="mt-8 rounded-2xl border border-black/5 bg-white p-6">
<h2 className="font-bold text-secondary">نحوه مصرف</h2>
<p className="mt-2 text-sm leading-7 text-foreground">
{product.usage}
</p>
</div>
<div className="mt-6">
<h2 className="font-bold text-secondary">مزایای محصول</h2>
<ul className="mt-3 space-y-2">
{product.benefits.map((b) => (
<li key={b} className="flex items-start gap-2 text-sm text-foreground">
<span className="mt-1 flex h-4 w-4 shrink-0 items-center justify-center rounded-full bg-primary/10 text-primary">
<svg width="10" height="10" viewBox="0 0 24 24" fill="none">
<path
d="M5 13l4 4L19 7"
stroke="currentColor"
strokeWidth="3"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
</span>
{b}
</li>
))}
</ul>
</div>
</div>
</div>
<div className="mt-14 rounded-2xl border border-black/5 bg-white p-6 sm:p-8">
<h2 className="text-lg font-bold text-secondary">معرفی محصول</h2>
<div className="mt-4 space-y-4">
{product.description.map((paragraph) => (
<p key={paragraph} className="leading-8 text-foreground">
{paragraph}
</p>
))}
</div>
</div>
</Container>
</section>
{related.length > 0 && (
<section className="pb-16 sm:pb-20">
<Container>
<h2 className="text-2xl font-extrabold text-primary">
محصولات مرتبط
</h2>
<div className="mt-8 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
{related.map((p) => (
<ProductCard key={p.id} product={p} />
))}
</div>
</Container>
</section>
)}
</>
);
}
+55
View File
@@ -0,0 +1,55 @@
import type { Metadata } from "next";
import Container from "@/components/Container";
import PageBanner from "@/components/PageBanner";
import ProductCard from "@/components/ProductCard";
import Pagination from "@/components/Pagination";
import { products } from "@/data/products";
export const metadata: Metadata = {
title: "محصولات | آراد آریسمان",
description:
"مکمل‌های غذایی، ویتامینه و معدنی دام، طیور و زنبور عسل؛ محصولات آراد آریسمان را مشاهده کنید.",
};
const PAGE_SIZE = 6;
export default async function ProductsPage({
searchParams,
}: {
searchParams: Promise<{ page?: string }>;
}) {
const { page } = await searchParams;
const totalPages = Math.max(1, Math.ceil(products.length / PAGE_SIZE));
const currentPage = Math.min(
Math.max(1, Number(page) || 1),
totalPages
);
const start = (currentPage - 1) * PAGE_SIZE;
const pageItems = products.slice(start, start + PAGE_SIZE);
return (
<>
<PageBanner
title="محصولات آراد آریسمان"
subtitle="مکمل‌های غذایی، ویتامینه و معدنی برای دام، طیور و زنبور عسل"
breadcrumb="محصولات"
/>
<section className="py-16 sm:py-20">
<Container>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
{pageItems.map((product) => (
<ProductCard key={product.id} product={product} />
))}
</div>
<Pagination
currentPage={currentPage}
totalPages={totalPages}
basePath="/products"
/>
</Container>
</section>
</>
);
}
+47
View File
@@ -0,0 +1,47 @@
import Image from "next/image";
import Container from "./Container";
export default function About() {
return (
<section id="about" className="py-16 sm:py-20 bg-surface">
<Container className="grid grid-cols-1 lg:grid-cols-2 items-center gap-12">
<div className="relative aspect-[4/3] rounded-3xl overflow-hidden shadow-xl order-2 lg:order-1">
<Image
src="/images/hero-2.jpg"
alt="محصولات آراد آریسمان"
fill
className="object-cover object-left"
sizes="(min-width: 1024px) 45vw, 90vw"
/>
</div>
<div className="order-1 lg:order-2 text-center lg:text-start">
<span className="text-sm font-bold text-accent">درباره ما</span>
<h2 className="mt-3 text-3xl sm:text-4xl font-extrabold text-primary">
آراد آریسمان
</h2>
<p className="mt-6 leading-8 text-foreground">
شرکت آراد آریسمان پیشرو در تولید و عرضه افزودنیهای خوراک، ویتامینها و
مکملهای غذایی دام و طیور با بیش از ۲۳ سال فعالیت در بازار ایران میباشد.
واردات این شرکت عمدتا از تولیدکنندگان معتبر بینالمللی غذای دام و طیور از
کشورهای انگلستان، فرانسه، ترکیه، هندوستان و چین میباشد.
</p>
<div className="mt-8 flex justify-center lg:justify-start gap-10">
<div>
<div className="text-3xl font-extrabold text-primary">۲۳+</div>
<div className="mt-1 text-sm text-foreground">سال تجربه</div>
</div>
<div>
<div className="text-3xl font-extrabold text-primary">۲۳۰+</div>
<div className="mt-1 text-sm text-foreground">رضایت مشتری</div>
</div>
<div>
<div className="text-3xl font-extrabold text-primary">۵</div>
<div className="mt-1 text-sm text-foreground">کشور واردات</div>
</div>
</div>
</div>
</Container>
</section>
);
}
+55
View File
@@ -0,0 +1,55 @@
import Image from "next/image";
import Container from "./Container";
const categories = [
{ title: "مکمل ویتامینه مرغ گوشتی", img: "/images/category-1.jpg" },
{ title: "سبوس برنج فراوری شده", img: "/images/category-2.jpg" },
{ title: "مکمل غذایی دام", img: "/images/category-3.jpg" },
{ title: "کنسانتره طیور", img: "/images/category-4.jpg" },
{ title: "کنسانتره گوسفند", img: "/images/category-5.jpg" },
{ title: "مکمل معدنی مرغ گوشتی", img: "/images/category-6.jpg" },
{ title: "مکمل گوسفند", img: "/images/category-7.jpg" },
{ title: "مکمل زنبور عسل", img: "/images/category-8.jpg" },
{ title: "مکمل معدنی مرغ تخمگذار", img: "/images/category-9.jpg" },
{ title: "مکمل ویتامینه مرغ تخمگذار", img: "/images/category-10.jpg" },
];
export default function Categories() {
return (
<section className="py-16 sm:py-20 bg-surface">
<Container>
<div className="text-center max-w-xl mx-auto">
<span className="text-sm font-bold text-accent">آراد آریسمان</span>
<h2 className="mt-3 text-3xl sm:text-4xl font-extrabold text-primary">
تغذیه مطمئن، پرورش موفق
</h2>
<p className="mt-4 text-foreground">
دستهبندی کامل محصولات ما برای طیور، دام و زنبور عسل
</p>
</div>
<div className="mt-12 flex gap-5 overflow-x-auto pb-4 snap-x snap-mandatory [scrollbar-width:thin]">
{categories.map((c) => (
<a
key={c.title}
href="#products"
className="group relative shrink-0 snap-start w-[220px] sm:w-[240px] aspect-[3/4] rounded-2xl overflow-hidden shadow-md"
>
<Image
src={c.img}
alt={c.title}
fill
className="object-cover group-hover:scale-105 transition-transform duration-500"
sizes="240px"
/>
<div className="absolute inset-0 bg-gradient-to-t from-secondary/90 via-secondary/20 to-transparent" />
<span className="absolute bottom-5 inset-x-4 text-white font-bold text-lg leading-7">
{c.title}
</span>
</a>
))}
</div>
</Container>
</section>
);
}
+120
View File
@@ -0,0 +1,120 @@
"use client";
import { FormEvent, useState } from "react";
export default function ContactForm() {
const [submitted, setSubmitted] = useState(false);
const [sending, setSending] = useState(false);
function handleSubmit(e: FormEvent<HTMLFormElement>) {
e.preventDefault();
const formEl = e.currentTarget;
setSending(true);
window.setTimeout(() => {
setSending(false);
setSubmitted(true);
formEl.reset();
}, 600);
}
if (submitted) {
return (
<div className="rounded-2xl border border-primary/20 bg-primary/5 p-8 text-center">
<div className="mx-auto flex h-14 w-14 items-center justify-center rounded-full bg-primary text-white">
<svg width="26" height="26" viewBox="0 0 24 24" fill="none">
<path
d="M5 13l4 4L19 7"
stroke="currentColor"
strokeWidth="2.5"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
</div>
<h3 className="mt-5 text-lg font-bold text-secondary">
پیام شما ثبت شد
</h3>
<p className="mt-2 text-sm text-foreground">
از تماس شما سپاسگزاریم. کارشناسان ما در اسرع وقت با شما تماس خواهند
گرفت.
</p>
<button
type="button"
onClick={() => setSubmitted(false)}
className="mt-6 rounded-full border border-primary/30 px-6 py-2.5 text-sm font-semibold text-primary hover:bg-primary/5 transition-colors"
>
ارسال پیام جدید
</button>
</div>
);
}
return (
<form onSubmit={handleSubmit} className="space-y-5">
<div className="grid grid-cols-1 sm:grid-cols-2 gap-5">
<div>
<label htmlFor="name" className="block text-sm font-medium text-secondary mb-2">
نام و نام خانوادگی
</label>
<input
id="name"
name="name"
type="text"
required
placeholder="نام شما"
className="w-full rounded-xl border border-black/10 bg-white px-4 py-3 text-sm outline-none focus:border-primary transition-colors"
/>
</div>
<div>
<label htmlFor="phone" className="block text-sm font-medium text-secondary mb-2">
شماره تماس
</label>
<input
id="phone"
name="phone"
type="tel"
required
dir="ltr"
placeholder="09xxxxxxxxx"
className="w-full rounded-xl border border-black/10 bg-white px-4 py-3 text-sm text-right outline-none focus:border-primary transition-colors"
/>
</div>
</div>
<div>
<label htmlFor="subject" className="block text-sm font-medium text-secondary mb-2">
موضوع
</label>
<input
id="subject"
name="subject"
type="text"
placeholder="موضوع پیام"
className="w-full rounded-xl border border-black/10 bg-white px-4 py-3 text-sm outline-none focus:border-primary transition-colors"
/>
</div>
<div>
<label htmlFor="message" className="block text-sm font-medium text-secondary mb-2">
پیام شما
</label>
<textarea
id="message"
name="message"
required
rows={5}
placeholder="پیام خود را بنویسید..."
className="w-full rounded-xl border border-black/10 bg-white px-4 py-3 text-sm outline-none focus:border-primary transition-colors resize-none"
/>
</div>
<button
type="submit"
disabled={sending}
className="w-full sm:w-auto rounded-full bg-primary px-8 py-3.5 text-white font-semibold hover:bg-primary-dark transition-colors disabled:opacity-60"
>
{sending ? "در حال ارسال..." : "ارسال پیام"}
</button>
</form>
);
}
+63
View File
@@ -0,0 +1,63 @@
const cards = [
{
title: "آدرس ما",
lines: ["قم، شهرک صنعتی شکوهیه، فاز دو،", "خیابان شهید بروجردی، نبش کلاهدوز یک، پلاک ۸۶۶"],
icon: (
<svg width="24" height="24" viewBox="0 0 24 24" fill="none">
<path
d="M12 22s7-6.3 7-12a7 7 0 1 0-14 0c0 5.7 7 12 7 12Zm0-9a3 3 0 1 1 0-6 3 3 0 0 1 0 6Z"
fill="currentColor"
/>
</svg>
),
},
{
title: "تلفن تماس",
lines: ["09104067935", "۰۲۵۳۳۳۴۲۶۳۳ ، ۰۲۵۳۳۳۴۲۹۶۷ ، ۰۲۵۳۳۳۴۲۹۸۳"],
icon: (
<svg width="24" height="24" viewBox="0 0 24 24" fill="none">
<path
d="M6.6 10.8c1.4 2.8 3.8 5.1 6.6 6.6l2.2-2.2c.3-.3.7-.4 1-.2 1.1.4 2.3.6 3.6.6.6 0 1 .4 1 1V20c0 .6-.4 1-1 1C10.6 21 3 13.4 3 4c0-.6.4-1 1-1h3.5c.6 0 1 .4 1 1 0 1.3.2 2.5.6 3.6.1.4 0 .8-.2 1L6.6 10.8z"
fill="currentColor"
/>
</svg>
),
},
{
title: "ساعات کاری",
lines: ["شنبه تا چهارشنبه: ۸ الی ۱۷", "پنجشنبه: ۸ الی ۱۳"],
icon: (
<svg width="24" height="24" viewBox="0 0 24 24" fill="none">
<path
d="M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20Zm1-10.4 4 2.3-1 1.7-5-2.9V6h2v5.6Z"
fill="currentColor"
/>
</svg>
),
},
];
export default function ContactInfo() {
return (
<div className="grid grid-cols-1 sm:grid-cols-3 gap-5">
{cards.map((c) => (
<div
key={c.title}
className="rounded-2xl border border-black/5 bg-white p-7 shadow-sm"
>
<div className="flex h-12 w-12 items-center justify-center rounded-xl bg-primary/5 text-primary">
{c.icon}
</div>
<h3 className="mt-4 font-bold text-secondary">{c.title}</h3>
<div className="mt-2 space-y-1 text-sm leading-7 text-foreground" dir={c.title === "تلفن تماس" ? "ltr" : undefined}>
{c.lines.map((line) => (
<p key={line} className={c.title === "تلفن تماس" ? "text-right" : undefined}>
{line}
</p>
))}
</div>
</div>
))}
</div>
);
}
+15
View File
@@ -0,0 +1,15 @@
import { ReactNode } from "react";
export default function Container({
children,
className = "",
}: {
children: ReactNode;
className?: string;
}) {
return (
<div className={`mx-auto w-full max-w-7xl px-5 sm:px-8 ${className}`}>
{children}
</div>
);
}
+56
View File
@@ -0,0 +1,56 @@
import Image from "next/image";
import Container from "./Container";
const features = [
{
icon: "/images/feature-icon-1.png",
title: "کیفیت تخم و گوشت",
desc: "ارتقای طعم، رنگ و ارزش تغذیه‌ای",
},
{
icon: "/images/feature-icon-2.png",
title: "بهره‌وری بالا",
desc: "مصرف بهینه خوراک و بازده اقتصادی بیشتر",
},
{
icon: "/images/feature-icon-3.png",
title: "تقویت ایمنی",
desc: "کاهش بیماری‌ها و تلفات گله",
},
{
icon: "/images/feature-icon-4.png",
title: "افزایش رشد",
desc: "بهبود وزن‌گیری سریع و یکنواخت",
},
];
export default function Features() {
return (
<section className="py-16 sm:py-20">
<Container>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
{features.map((f) => (
<div
key={f.title}
className="group rounded-2xl border border-black/5 bg-white p-7 shadow-sm hover:shadow-lg hover:-translate-y-1 transition-all"
>
<div className="flex h-16 w-16 items-center justify-center rounded-xl bg-primary/5">
<Image src={f.icon} alt="" width={40} height={40} />
</div>
<h3 className="mt-5 text-lg font-bold text-secondary">{f.title}</h3>
<p className="mt-2 text-sm leading-6 text-foreground">{f.desc}</p>
<span className="mt-4 inline-flex items-center justify-center h-8 w-8 rounded-full border border-primary/20 text-primary rotate-180 group-hover:bg-primary group-hover:text-white group-hover:rotate-0 transition-all">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<path
d="M13.3 5.3a1 1 0 0 1 1.4 0l6 6a1 1 0 0 1 0 1.4l-6 6a1 1 0 1 1-1.4-1.4L18 12.7H4a1 1 0 1 1 0-2h14L13.3 6.7a1 1 0 0 1 0-1.4Z"
fill="currentColor"
/>
</svg>
</span>
</div>
))}
</div>
</Container>
</section>
);
}
+81
View File
@@ -0,0 +1,81 @@
import Image from "next/image";
import Link from "next/link";
import Container from "./Container";
const phones = ["09104067935", "۰۲۵۳۳۳۴۲۶۳۳", "۰۲۵۳۳۳۴۲۹۶۷", "۰۲۵۳۳۳۴۲۹۸۳"];
const quickLinks = [
{ label: "صفحه اصلی", href: "/" },
{ label: "محصولات", href: "/products" },
{ label: "مقالات", href: "/blog" },
{ label: "درباره ما", href: "/about" },
{ label: "تماس با ما", href: "/contact" },
];
export default function Footer() {
return (
<footer id="footer" className="relative bg-secondary text-white/80 overflow-hidden">
<Image
src="/images/footer-shape.png"
alt=""
fill
className="object-cover object-left opacity-10 pointer-events-none select-none"
/>
<Container className="relative py-16 grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-10">
<div>
<Image
src="/images/footer-logo.png"
alt="آراد آریسمان"
width={140}
height={40}
className="h-10 w-auto"
/>
<p className="mt-5 text-sm leading-7 text-white/60">
شرکت آراد آریسمان، پیشرو در تولید و عرضه افزودنیهای خوراک، ویتامینها و
مکملهای غذایی دام و طیور با بیش از ۲۳ سال تجربه.
</p>
</div>
<div>
<h4 className="text-white font-bold mb-5">لینکهای سریع</h4>
<ul className="space-y-3 text-sm">
{quickLinks.map((l) => (
<li key={l.label}>
<Link href={l.href} className="hover:text-accent transition-colors">
{l.label}
</Link>
</li>
))}
</ul>
</div>
<div>
<h4 className="text-white font-bold mb-5">آدرس ما</h4>
<p className="text-sm leading-7 text-white/60">
قم، شهرک صنعتی شکوهیه، فاز دو، خیابان شهید بروجردی، نبش کلاهدوز یک، پلاک ۸۶۶
</p>
</div>
<div>
<h4 className="text-white font-bold mb-5">راههای ارتباطی</h4>
<ul className="space-y-3 text-sm">
{phones.map((p) => (
<li key={p}>
<a href={`tel:${p}`} dir="ltr" className="hover:text-accent transition-colors block text-right">
{p}
</a>
</li>
))}
<li className="text-white/50">۰۲۵۳۳۳۴۲۹۴۲ (فاکس)</li>
</ul>
</div>
</Container>
<div className="border-t border-white/10">
<Container className="py-5 text-center text-sm text-white/50">
طراحی و توسعه توسط تیم تجارت الکترونیک مشکی
</Container>
</div>
</footer>
);
}
+133
View File
@@ -0,0 +1,133 @@
"use client";
import Image from "next/image";
import Link from "next/link";
import { usePathname } from "next/navigation";
import { useEffect, useState } from "react";
import Container from "./Container";
const navLinks = [
{ label: "صفحه اصلی", href: "/" },
{ label: "محصولات", href: "/products" },
{ label: "مقالات", href: "/blog" },
{ label: "درباره ما", href: "/about" },
{ label: "تماس با ما", href: "/contact" },
];
export default function Header() {
const pathname = usePathname();
const [scrolledPast, setScrolledPast] = useState(false);
const canBeTransparent = pathname === "/";
const scrolled = !canBeTransparent || scrolledPast;
useEffect(() => {
if (!canBeTransparent) return;
function onScroll() {
setScrolledPast(window.scrollY > 20);
}
onScroll();
window.addEventListener("scroll", onScroll, { passive: true });
return () => window.removeEventListener("scroll", onScroll);
}, [canBeTransparent]);
return (
<header className="fixed inset-x-0 top-0 z-50">
<div className="bg-secondary text-white">
<Container className="flex h-11 items-center justify-between text-sm">
<a
href="tel:09104067935"
className="flex items-center gap-2 text-white/90 hover:text-accent transition-colors"
>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" className="shrink-0">
<path
d="M6.6 10.8c1.4 2.8 3.8 5.1 6.6 6.6l2.2-2.2c.3-.3.7-.4 1-.2 1.1.4 2.3.6 3.6.6.6 0 1 .4 1 1V20c0 .6-.4 1-1 1C10.6 21 3 13.4 3 4c0-.6.4-1 1-1h3.5c.6 0 1 .4 1 1 0 1.3.2 2.5.6 3.6.1.4 0 .8-.2 1L6.6 10.8z"
fill="currentColor"
/>
</svg>
<span dir="ltr">09104067935</span>
</a>
<div className="flex items-center gap-4">
<a href="#" aria-label="تلگرام" className="text-white/90 hover:text-accent transition-colors">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path
d="M21.5 3.5 2.8 10.9c-1 .4-1 1.7.1 2l4.7 1.5 1.8 5.6c.2.6 1 .8 1.4.3l2.5-2.7 4.9 3.6c.6.5 1.6.1 1.8-.6l3-15.6c.2-1-.7-1.8-1.5-1.5z"
fill="currentColor"
/>
</svg>
</a>
<a href="#" aria-label="واتساپ" className="text-white/90 hover:text-accent transition-colors">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path
d="M12 2a10 10 0 0 0-8.6 15.1L2 22l5-1.4A10 10 0 1 0 12 2Zm0 18.2a8.1 8.1 0 0 1-4.2-1.1l-.3-.2-3 .8.8-2.9-.2-.3A8.2 8.2 0 1 1 12 20.2Zm4.5-6.1c-.2-.1-1.5-.7-1.7-.8-.2-.1-.4-.1-.6.1-.2.2-.7.8-.8 1-.2.2-.3.2-.5.1a6.7 6.7 0 0 1-2-1.2 7.4 7.4 0 0 1-1.4-1.7c-.1-.2 0-.4.1-.5l.4-.4c.1-.2.2-.3.2-.5.1-.2 0-.4 0-.5-.1-.1-.6-1.5-.8-2-.2-.5-.4-.4-.6-.4h-.5c-.2 0-.5.1-.7.3-.2.2-.9.9-.9 2.2s.9 2.6 1.1 2.8c.1.2 1.9 3 4.7 4.1.7.3 1.2.4 1.6.6.7.2 1.3.2 1.8.1.5-.1 1.5-.6 1.7-1.2.2-.6.2-1.1.2-1.2-.1-.2-.3-.2-.5-.3Z"
fill="currentColor"
/>
</svg>
</a>
<a href="#" aria-label="ایمیل" className="text-white/90 hover:text-accent transition-colors">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path
d="M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2Zm0 2v.2l8 5.4 8-5.4V6H4Zm16 12V8.6l-7.4 5a1 1 0 0 1-1.2 0L4 8.6V18h16Z"
fill="currentColor"
/>
</svg>
</a>
</div>
</Container>
</div>
<div
className={`border-b transition-all duration-300 ${
scrolled
? "bg-white/95 backdrop-blur border-black/5 shadow-sm"
: "bg-white/10 backdrop-blur-md border-white/10"
}`}
>
<Container className="flex h-20 items-center justify-between">
<Link href="/" className="shrink-0">
<Image
src={scrolled ? "/images/logo-wordmark.png" : "/images/footer-logo.png"}
alt="آراد آریسمان"
width={140}
height={40}
className="h-10 w-auto"
priority
/>
</Link>
<nav className="hidden lg:flex items-center gap-8">
{navLinks.map((link) => (
<Link
key={link.label}
href={link.href}
className={`text-[15px] font-medium transition-colors ${
scrolled
? "text-secondary/80 hover:text-primary"
: "text-white/90 hover:text-accent"
}`}
>
{link.label}
</Link>
))}
</nav>
<a
href="#"
className={`flex items-center gap-2 rounded-full border px-5 py-2.5 text-[15px] font-medium transition-colors ${
scrolled
? "border-primary/20 text-primary hover:bg-primary hover:text-white"
: "border-white/40 text-white hover:bg-white/10"
}`}
>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path
d="M12 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10Zm0 2c-4.4 0-8 2.2-8 5v3h16v-3c0-2.8-3.6-5-8-5Z"
fill="currentColor"
/>
</svg>
ورود
</a>
</Container>
</div>
</header>
);
}
+65
View File
@@ -0,0 +1,65 @@
import Image from "next/image";
import Container from "./Container";
export default function Hero() {
return (
<section className="relative overflow-hidden bg-surface">
<Container className="grid grid-cols-1 lg:grid-cols-2 items-center gap-10 py-14 lg:py-0">
<div className="relative order-2 lg:order-1 lg:h-[560px] flex items-end">
<div className="relative w-full aspect-[4/3] lg:aspect-auto lg:h-[480px] rounded-3xl overflow-hidden shadow-xl">
<Image
src="/images/hero-1.jpg"
alt="محصولات آراد آریسمان در مزرعه گندم"
fill
priority
className="object-cover object-left"
sizes="(min-width: 1024px) 45vw, 90vw"
/>
</div>
<div className="absolute bottom-6 -start-2 sm:start-2 flex gap-3">
<div className="flex flex-col justify-center gap-1 rounded-2xl bg-secondary/70 backdrop-blur px-5 py-4 text-white min-w-[140px]">
<span className="text-xs font-bold text-accent">۰۱</span>
<span className="text-sm font-semibold leading-6">
مکملــی
<br />
مطمئن
</span>
</div>
<div className="flex flex-col justify-center gap-1 rounded-2xl bg-primary/80 backdrop-blur px-5 py-4 text-white min-w-[150px]">
<span className="text-xs font-bold text-accent">۰۲</span>
<span className="text-sm font-semibold leading-6">
تغذیهای
<br />
کامل
</span>
</div>
</div>
</div>
<div className="order-1 lg:order-2 text-center lg:text-start">
<h1 className="text-4xl sm:text-5xl lg:text-6xl font-extrabold text-primary leading-[1.15]">
آراد آریسمان
</h1>
<p className="mt-5 text-lg sm:text-xl text-foreground max-w-md mx-auto lg:mx-0">
قدرت رشد، از دل تغذیه سالم
</p>
<div className="mt-8 flex flex-wrap justify-center lg:justify-start gap-4">
<a
href="#products"
className="rounded-full bg-primary px-7 py-3.5 text-white font-semibold hover:bg-primary-dark transition-colors"
>
مشاهده محصولات
</a>
<a
href="#about"
className="rounded-full border border-primary/30 px-7 py-3.5 text-primary font-semibold hover:bg-primary/5 transition-colors"
>
درباره ما
</a>
</div>
</div>
</Container>
</section>
);
}
+200
View File
@@ -0,0 +1,200 @@
"use client";
import Image from "next/image";
import Link from "next/link";
import { useCallback, useEffect, useRef, useState } from "react";
import { toFa } from "@/lib/format";
type Slide = {
image: string;
eyebrow: string;
title: string;
subtitle: string;
};
const slides: Slide[] = [
{
image:
"https://images.unsplash.com/photo-1583364428520-fa6c5013c0c3?fm=jpg&q=80&w=2400&auto=format&fit=crop",
eyebrow: "بیش از ۲۳ سال تجربه",
title: "کیفیتی که به آن اعتماد دارید",
subtitle: "بیش از ۲۳۰ مشتری در سراسر کشور، انتخاب اول خود را کرده‌اند",
},
{
image:
"https://images.unsplash.com/photo-1589348792383-8ebcbec4ef88?fm=jpg&q=80&w=2400&auto=format&fit=crop",
eyebrow: "دام سالم، تولید پایدار",
title: "همراه شما در تمام دوره‌های پرورش",
subtitle:
"از دوره پروار تا شیردهی؛ مکمل‌هایی متناسب با نیاز واقعی گله شما",
},
{
image:
"https://images.unsplash.com/photo-1723357018190-c0163698165b?fm=jpg&q=80&w=2400&auto=format&fit=crop",
eyebrow: "طیور پرقدرت",
title: "افزایش بازده با تغذیه اصولی",
subtitle:
"بهبود کیفیت تخم و گوشت، تقویت ایمنی و رشد یکنواخت گله طیور",
},
];
const AUTOPLAY_MS = 6000;
export default function HeroSlider() {
const [index, setIndex] = useState(0);
const timerRef = useRef<ReturnType<typeof setInterval> | null>(null);
const goTo = useCallback((i: number) => {
setIndex((i + slides.length) % slides.length);
}, []);
const next = useCallback(() => goTo(index + 1), [goTo, index]);
const prev = useCallback(() => goTo(index - 1), [goTo, index]);
useEffect(() => {
timerRef.current = setInterval(() => {
setIndex((i) => (i + 1) % slides.length);
}, AUTOPLAY_MS);
return () => {
if (timerRef.current) clearInterval(timerRef.current);
};
}, [index]);
function pause() {
if (timerRef.current) clearInterval(timerRef.current);
}
function resume() {
if (timerRef.current) clearInterval(timerRef.current);
timerRef.current = setInterval(() => {
setIndex((i) => (i + 1) % slides.length);
}, AUTOPLAY_MS);
}
return (
<section
role="region"
aria-roledescription="carousel"
aria-label="اسلایدر معرفی آراد آریسمان"
onMouseEnter={pause}
onMouseLeave={resume}
className="relative -mt-[125px] h-svh min-h-[520px] w-full overflow-hidden bg-secondary"
>
{slides.map((slide, i) => (
<div
key={slide.title}
aria-hidden={i !== index}
className={`absolute inset-0 transition-opacity duration-1000 ease-in-out ${
i === index ? "opacity-100 z-10" : "opacity-0 z-0"
}`}
>
<Image
src={slide.image}
alt={slide.title}
fill
priority={i === 0}
className="object-cover"
sizes="100vw"
/>
<div className="absolute inset-0 bg-gradient-to-t from-black/70 via-black/30 to-black/10" />
<div className="relative z-10 flex h-full items-center pt-[125px]">
<div className="mx-auto w-full max-w-7xl px-5 sm:px-8">
<div className="max-w-xl text-center sm:text-start mx-auto sm:mx-0 sm:ps-12">
<span
className={`inline-block rounded-full bg-white/10 backdrop-blur px-4 py-1.5 text-sm font-semibold text-accent transition-all duration-700 delay-200 ${
i === index
? "translate-y-0 opacity-100"
: "translate-y-4 opacity-0"
}`}
>
{slide.eyebrow}
</span>
<h1
className={`mt-5 text-3xl sm:text-5xl font-extrabold leading-[1.25] text-white transition-all duration-700 delay-300 ${
i === index
? "translate-y-0 opacity-100"
: "translate-y-4 opacity-0"
}`}
>
{slide.title}
</h1>
<p
className={`mt-5 text-base sm:text-lg text-white/85 transition-all duration-700 delay-500 ${
i === index
? "translate-y-0 opacity-100"
: "translate-y-4 opacity-0"
}`}
>
{slide.subtitle}
</p>
<div
className={`mt-8 flex flex-wrap justify-center sm:justify-start gap-4 transition-all duration-700 delay-700 ${
i === index
? "translate-y-0 opacity-100"
: "translate-y-4 opacity-0"
}`}
>
<Link
href="/products"
className="rounded-full bg-primary px-7 py-3.5 text-white font-semibold hover:bg-primary-dark transition-colors"
>
مشاهده محصولات
</Link>
<Link
href="/contact"
className="rounded-full border border-white/40 px-7 py-3.5 text-white font-semibold hover:bg-white/10 transition-colors"
>
تماس با ما
</Link>
</div>
</div>
</div>
</div>
</div>
))}
<button
type="button"
onClick={prev}
aria-label="اسلاید قبلی"
className="absolute top-1/2 start-3 sm:start-6 z-20 hidden h-11 w-11 -translate-y-1/2 items-center justify-center rounded-full bg-white/15 text-white backdrop-blur hover:bg-white/25 transition-colors sm:flex"
>
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" className="rotate-180">
<path
d="M10.7 18.7a1 1 0 0 1-1.4 0l-6-6a1 1 0 0 1 0-1.4l6-6a1 1 0 1 1 1.4 1.4L6 11.3h14a1 1 0 1 1 0 2H6l4.7 4.3a1 1 0 0 1 0 1.4Z"
fill="currentColor"
/>
</svg>
</button>
<button
type="button"
onClick={next}
aria-label="اسلاید بعدی"
className="absolute top-1/2 end-3 sm:end-6 z-20 hidden h-11 w-11 -translate-y-1/2 items-center justify-center rounded-full bg-white/15 text-white backdrop-blur hover:bg-white/25 transition-colors sm:flex"
>
<svg width="20" height="20" viewBox="0 0 24 24" fill="none">
<path
d="M10.7 18.7a1 1 0 0 1-1.4 0l-6-6a1 1 0 0 1 0-1.4l6-6a1 1 0 1 1 1.4 1.4L6 11.3h14a1 1 0 1 1 0 2H6l4.7 4.3a1 1 0 0 1 0 1.4Z"
fill="currentColor"
/>
</svg>
</button>
<div className="absolute bottom-6 inset-x-0 z-20 flex items-center justify-center gap-2">
{slides.map((slide, i) => (
<button
key={slide.title}
type="button"
onClick={() => goTo(i)}
aria-label={`رفتن به اسلاید ${toFa(i + 1)}`}
aria-current={i === index}
className={`h-2 rounded-full transition-all ${
i === index ? "w-8 bg-accent" : "w-2 bg-white/50 hover:bg-white/80"
}`}
/>
))}
</div>
</section>
);
}
+40
View File
@@ -0,0 +1,40 @@
import Container from "./Container";
const countries = [
{ name: "انگلستان", flag: "🇬🇧" },
{ name: "فرانسه", flag: "🇫🇷" },
{ name: "ترکیه", flag: "🇹🇷" },
{ name: "هندوستان", flag: "🇮🇳" },
{ name: "چین", flag: "🇨🇳" },
];
export default function ImportCountries() {
return (
<section className="py-16 sm:py-20 bg-surface">
<Container>
<div className="text-center max-w-xl mx-auto">
<span className="text-sm font-bold text-accent">شرکای بینالمللی</span>
<h2 className="mt-3 text-3xl sm:text-4xl font-extrabold text-primary">
واردات از تولیدکنندگان معتبر جهانی
</h2>
<p className="mt-4 text-foreground">
آراد آریسمان محصولات خود را عمدتا از تولیدکنندگان معتبر بینالمللی
این کشورها وارد میکند
</p>
</div>
<div className="mt-12 grid grid-cols-2 sm:grid-cols-5 gap-5">
{countries.map((c) => (
<div
key={c.name}
className="flex flex-col items-center gap-3 rounded-2xl bg-white border border-black/5 py-8 shadow-sm"
>
<span className="text-4xl">{c.flag}</span>
<span className="font-semibold text-secondary">{c.name}</span>
</div>
))}
</div>
</Container>
</section>
);
}
+30
View File
@@ -0,0 +1,30 @@
import Container from "./Container";
const items = [
{
title: "ماموریت ما",
desc: "تامین و عرضه مکمل‌های غذایی، ویتامین‌ها و افزودنی‌های خوراک با بالاترین استانداردهای کیفی جهانی، برای ارتقای بهره‌وری و سلامت دام، طیور و زنبور عسل در سراسر کشور.",
},
{
title: "چشم‌انداز ما",
desc: "تبدیل شدن به معتبرترین و قابل‌اعتمادترین برند وارد‌کننده و عرضه‌کننده مکمل‌های دام و طیور در ایران، با تکیه بر دانش فنی و شراکت با تولیدکنندگان بین‌المللی.",
},
];
export default function MissionVision() {
return (
<section className="py-16 sm:py-20">
<Container className="grid grid-cols-1 sm:grid-cols-2 gap-6">
{items.map((item) => (
<div
key={item.title}
className="rounded-2xl border border-black/5 bg-white p-8 shadow-sm"
>
<h3 className="text-xl font-bold text-primary">{item.title}</h3>
<p className="mt-4 leading-8 text-foreground">{item.desc}</p>
</div>
))}
</Container>
</section>
);
}
+47
View File
@@ -0,0 +1,47 @@
import Link from "next/link";
import Container from "./Container";
export default function PageBanner({
title,
subtitle,
breadcrumb,
}: {
title: string;
subtitle?: string;
breadcrumb: string;
}) {
return (
<section className="relative overflow-hidden bg-surface py-14 sm:py-16">
<div
aria-hidden
className="absolute inset-0 text-primary/[0.07]"
style={{
backgroundImage: "radial-gradient(currentColor 1.5px, transparent 1.5px)",
backgroundSize: "22px 22px",
}}
/>
<div
aria-hidden
className="absolute -top-24 -end-24 h-64 w-64 rounded-full bg-primary/10 blur-3xl"
/>
<div
aria-hidden
className="absolute -bottom-28 -start-16 h-56 w-56 rounded-full bg-accent/15 blur-3xl"
/>
<Container className="relative">
<h1 className="text-3xl sm:text-4xl font-extrabold text-primary">{title}</h1>
{subtitle && (
<p className="mt-3 max-w-2xl text-foreground">{subtitle}</p>
)}
<div className="mt-4 flex items-center gap-2 text-sm text-foreground">
<Link href="/" className="hover:text-primary transition-colors">
خانه
</Link>
<span className="text-foreground/50">/</span>
<span className="font-medium text-primary">{breadcrumb}</span>
</div>
</Container>
</section>
);
}
+71
View File
@@ -0,0 +1,71 @@
import Link from "next/link";
import { toFa } from "@/lib/format";
export default function Pagination({
currentPage,
totalPages,
basePath,
}: {
currentPage: number;
totalPages: number;
basePath: string;
}) {
if (totalPages <= 1) return null;
const pages = Array.from({ length: totalPages }, (_, i) => i + 1);
function hrefFor(page: number) {
return page === 1 ? basePath : `${basePath}?page=${page}`;
}
const prevDisabled = currentPage === 1;
const nextDisabled = currentPage === totalPages;
return (
<nav
aria-label="صفحه‌بندی"
className="mt-12 flex flex-wrap items-center justify-center gap-2"
>
<Link
href={hrefFor(Math.max(1, currentPage - 1))}
aria-disabled={prevDisabled}
tabIndex={prevDisabled ? -1 : undefined}
className={`flex h-10 items-center justify-center rounded-full border px-4 text-sm font-medium transition-colors ${
prevDisabled
? "pointer-events-none border-black/5 text-foreground/30"
: "border-black/10 text-secondary hover:border-primary hover:text-primary"
}`}
>
قبلی
</Link>
{pages.map((p) => (
<Link
key={p}
href={hrefFor(p)}
aria-current={p === currentPage ? "page" : undefined}
className={`flex h-10 w-10 items-center justify-center rounded-full text-sm font-semibold transition-colors ${
p === currentPage
? "bg-primary text-white"
: "text-secondary hover:bg-primary/10"
}`}
>
{toFa(p)}
</Link>
))}
<Link
href={hrefFor(Math.min(totalPages, currentPage + 1))}
aria-disabled={nextDisabled}
tabIndex={nextDisabled ? -1 : undefined}
className={`flex h-10 items-center justify-center rounded-full border px-4 text-sm font-medium transition-colors ${
nextDisabled
? "pointer-events-none border-black/5 text-foreground/30"
: "border-black/10 text-secondary hover:border-primary hover:text-primary"
}`}
>
بعدی
</Link>
</nav>
);
}
+32
View File
@@ -0,0 +1,32 @@
import Image from "next/image";
import Container from "./Container";
const partners = [
"/images/partner-1.png",
"/images/partner-2.png",
"/images/partner-3.png",
"/images/partner-4.png",
"/images/partner-5.png",
"/images/partner-6.png",
];
export default function Partners() {
return (
<section className="py-14 border-y border-black/5">
<Container>
<div className="flex flex-wrap items-center justify-around gap-x-14 gap-y-8 grayscale opacity-70">
{partners.map((src, i) => (
<Image
key={i}
src={src}
alt="نماد اعتماد"
width={95}
height={82}
className="h-20 sm:h-24 w-auto object-contain"
/>
))}
</div>
</Container>
</section>
);
}
+53
View File
@@ -0,0 +1,53 @@
import Image from "next/image";
import Link from "next/link";
import type { Post } from "@/data/posts";
export default function PostCard({ post }: { post: Post }) {
return (
<Link
href={`/blog/${post.slug}`}
className="group flex flex-col rounded-2xl border border-black/5 bg-white overflow-hidden shadow-sm hover:shadow-lg transition-shadow"
>
<div className="relative aspect-[16/10] bg-surface">
<Image
src={post.cover}
alt={post.title}
fill
className="object-cover group-hover:scale-105 transition-transform duration-500"
sizes="(min-width: 1024px) 33vw, (min-width: 640px) 50vw, 100vw"
/>
<span className="absolute top-3 right-3 rounded-full bg-white/90 backdrop-blur px-3 py-1 text-xs font-semibold text-primary">
{post.category}
</span>
</div>
<div className="flex flex-1 flex-col p-5">
<div className="flex items-center gap-3 text-xs text-foreground/70">
<span>{post.date}</span>
<span className="h-1 w-1 rounded-full bg-foreground/30" />
<span>{post.readingTime}</span>
</div>
<h3 className="mt-3 font-bold text-secondary leading-7 line-clamp-2">
{post.title}
</h3>
<p className="mt-2 text-sm leading-6 text-foreground line-clamp-2 flex-1">
{post.excerpt}
</p>
<span className="mt-4 inline-flex items-center gap-2 text-sm font-semibold text-primary">
ادامه مطلب
<svg
width="14"
height="14"
viewBox="0 0 24 24"
fill="none"
className="rotate-180 group-hover:-translate-x-1 transition-transform"
>
<path
d="M13.3 5.3a1 1 0 0 1 1.4 0l6 6a1 1 0 0 1 0 1.4l-6 6a1 1 0 1 1-1.4-1.4L18 12.7H4a1 1 0 1 1 0-2h14L13.3 6.7a1 1 0 0 1 0-1.4Z"
fill="currentColor"
/>
</svg>
</span>
</div>
</Link>
);
}
+44
View File
@@ -0,0 +1,44 @@
import Image from "next/image";
import Link from "next/link";
import type { Product } from "@/data/products";
export default function ProductCard({ product }: { product: Product }) {
return (
<Link
href={`/products/${product.slug}`}
className="group rounded-2xl border border-black/5 bg-white overflow-hidden shadow-sm hover:shadow-lg transition-shadow"
>
<div className="relative aspect-square bg-surface">
<Image
src={product.image}
alt={product.title}
fill
className="object-cover group-hover:scale-105 transition-transform duration-500"
sizes="(min-width: 1024px) 25vw, (min-width: 640px) 33vw, 50vw"
/>
<span className="absolute top-3 right-3 rounded-full bg-white/90 backdrop-blur px-3 py-1 text-xs font-semibold text-primary">
{product.category}
</span>
</div>
<div className="p-4">
<h3 className="font-semibold text-secondary leading-6 line-clamp-2 min-h-12">
{product.title}
</h3>
<p className="mt-1 text-sm text-foreground line-clamp-2">
{product.shortDesc}
</p>
<div className="mt-3 flex items-center justify-between">
<span className="text-sm font-bold text-primary">تماس بگیرید</span>
<span className="flex h-8 w-8 items-center justify-center rounded-full bg-primary/5 text-primary rotate-180 group-hover:bg-primary group-hover:text-white transition-colors">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none">
<path
d="M13.3 5.3a1 1 0 0 1 1.4 0l6 6a1 1 0 0 1 0 1.4l-6 6a1 1 0 1 1-1.4-1.4L18 12.7H4a1 1 0 1 1 0-2h14L13.3 6.7a1 1 0 0 1 0-1.4Z"
fill="currentColor"
/>
</svg>
</span>
</div>
</div>
</Link>
);
}
+38
View File
@@ -0,0 +1,38 @@
import Link from "next/link";
import Container from "./Container";
import ProductCard from "./ProductCard";
import { products } from "@/data/products";
export default function Products() {
const featured = products.slice(0, 8);
return (
<section id="products" className="py-16 sm:py-20">
<Container>
<div className="flex items-end justify-between flex-wrap gap-4">
<h2 className="text-3xl sm:text-4xl font-extrabold text-primary">
محصولات جدید
</h2>
<Link
href="/products"
className="flex items-center gap-2 text-primary font-semibold hover:text-primary-dark transition-colors"
>
مشاهده بیشتر
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" className="rotate-180">
<path
d="M13.3 5.3a1 1 0 0 1 1.4 0l6 6a1 1 0 0 1 0 1.4l-6 6a1 1 0 1 1-1.4-1.4L18 12.7H4a1 1 0 1 1 0-2h14L13.3 6.7a1 1 0 0 1 0-1.4Z"
fill="currentColor"
/>
</svg>
</Link>
</div>
<div className="mt-10 grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-5 sm:gap-6">
{featured.map((product) => (
<ProductCard key={product.id} product={product} />
))}
</div>
</Container>
</section>
);
}
+34
View File
@@ -0,0 +1,34 @@
import Image from "next/image";
import Container from "./Container";
const stats = [
{ value: "۲۳۰+", label: "رضایت مشتری" },
{ value: "۲۳", label: "سال تجربه" },
];
export default function Stats() {
return (
<section className="relative py-20 sm:py-28">
<Image
src="/images/stats-banner.jpg"
alt=""
fill
className="object-cover"
sizes="100vw"
/>
<div className="absolute inset-0 bg-primary-dark/80" />
<Container className="relative">
<div className="grid grid-cols-2 max-w-xl mx-auto text-center gap-8">
{stats.map((s) => (
<div key={s.label}>
<div className="text-4xl sm:text-5xl font-extrabold text-white">
{s.value}
</div>
<div className="mt-3 text-white/80">{s.label}</div>
</div>
))}
</div>
</Container>
</section>
);
}
+211
View File
@@ -0,0 +1,211 @@
export type Post = {
id: number;
slug: string;
title: string;
excerpt: string;
cover: string;
category: string;
date: string;
readingTime: string;
content: string[];
};
export const posts: Post[] = [
{
id: 1,
slug: "increase-egg-production-tips",
title: "۵ نکته کلیدی برای افزایش بازده تخم‌گذاری مرغ‌های تخمگذار",
excerpt:
"بازده تخم‌گذاری به عوامل متعددی از جمله تغذیه، نور و مدیریت گله بستگی دارد. در این مقاله به مهم‌ترین نکاتی که می‌توانند بازده گله شما را بهبود دهند می‌پردازیم.",
cover: "/images/product-1.jpg",
category: "طیور",
date: "۱۲ اردیبهشت ۱۴۰۴",
readingTime: "۵ دقیقه مطالعه",
content: [
"تولید تخم‌مرغ با کیفیت و پایدار، حاصل ترکیبی از تغذیه صحیح، مدیریت محیط پرورش و سلامت عمومی گله است. در ادامه به پنج نکته کلیدی برای بهبود بازده تخم‌گذاری اشاره می‌کنیم.",
"۱. تعادل جیره غذایی: جیره مرغ تخمگذار باید ترکیبی متعادل از انرژی، پروتئین، کلسیم و فسفر باشد. کمبود یا مازاد هر یک از این اجزا می‌تواند مستقیما بر کیفیت پوسته و میزان تولید اثر بگذارد.",
"۲. تامین کلسیم کافی: با نزدیک‌شدن به اوج تولید، نیاز مرغ به کلسیم افزایش می‌یابد. استفاده از مکمل‌های معدنی استاندارد به حفظ استحکام پوسته و کاهش تخم‌های شکسته کمک می‌کند.",
"۳. مدیریت نور: برنامه نوری منظم و پایدار نقش مهمی در تحریک و حفظ چرخه تولید دارد. تغییرات ناگهانی در ساعات روشنایی می‌تواند باعث افت موقت تولید شود.",
"۴. کنترل استرس محیطی: دمای نامناسب، تراکم بالا و جابجایی‌های مکرر از عوامل استرس‌زا هستند که بر بازده تولید تاثیر منفی می‌گذارند.",
"۵. استفاده از مکمل‌های ویتامینه: مکمل‌های ویتامینه با تامین ویتامین‌های ضروری، به حفظ سلامت عمومی گله و پایداری تولید در بلندمدت کمک می‌کنند.",
"رعایت این نکات به همراه مشورت مستمر با کارشناسان تغذیه دام و طیور، می‌تواند بازده اقتصادی واحدهای پرورش مرغ تخمگذار را به‌طور محسوسی افزایش دهد.",
],
},
{
id: 2,
slug: "increase-calf-growth-rate",
title: "چگونه رشد گوساله‌های پرواری را افزایش دهیم؟",
excerpt:
"دستیابی به وزن هدف در کوتاه‌ترین زمان ممکن، هدف اصلی هر واحد پرواربندی است. در این مطلب راهکارهای عملی برای افزایش رشد گوساله‌های پرواری را بررسی می‌کنیم.",
cover: "/images/stats-banner.jpg",
category: "دام سنگین",
date: "۳ خرداد ۱۴۰۴",
readingTime: "۶ دقیقه مطالعه",
content: [
"افزایش وزن‌گیری روزانه و بهبود بازده تبدیل خوراک، دو شاخص کلیدی موفقیت در واحدهای پرواربندی گوساله هستند. دستیابی به این اهداف نیازمند برنامه‌ریزی دقیق تغذیه‌ای و مدیریتی است.",
"شروع دوره پروار با گوساله‌های سالم و عاری از استرس انتقال، پایه‌ای برای موفقیت دوره است. دوره تطبیق اولیه باید با دقت و بدون تغییرات ناگهانی در جیره انجام شود.",
"افزایش تدریجی سهم کنسانتره در جیره، همراه با تامین فیبر کافی از منابعی مانند سبوس گندم، به حفظ سلامت شکمبه و جلوگیری از اسیدوز کمک می‌کند.",
"استفاده از مکمل‌های معدنی و ویتامینه استاندارد، نقش مهمی در پیشگیری از اختلالات متابولیک و حفظ اشتها در طول دوره پروار دارد.",
"پایش منظم وزن گله در بازه‌های زمانی مشخص، امکان ارزیابی روند رشد و اصلاح به‌موقع برنامه تغذیه‌ای را فراهم می‌کند.",
"در نهایت، همکاری نزدیک با کارشناس تغذیه دام برای تنظیم جیره متناسب با نژاد، سن و وزن گوساله‌ها، بهترین نتیجه اقتصادی را در پی خواهد داشت.",
],
},
{
id: 3,
slug: "vitamin-supplements-poultry-importance",
title: "اهمیت مکمل‌های ویتامینه در تغذیه طیور",
excerpt:
"ویتامین‌ها اگرچه در مقادیر کم مورد نیاز هستند، اما نقشی حیاتی در سلامت، رشد و تولید طیور ایفا می‌کنند. در این مقاله به نقش مکمل‌های ویتامینه می‌پردازیم.",
cover: "/images/product-3.jpg",
category: "طیور",
date: "۱۸ خرداد ۱۴۰۴",
readingTime: "۴ دقیقه مطالعه",
content: [
"ویتامین‌ها گروهی از ترکیبات آلی هستند که بدن طیور به مقدار کم به آن‌ها نیاز دارد، اما نقش آن‌ها در فرآیندهای حیاتی بسیار پررنگ است.",
"ویتامین‌های محلول در چربی مانند A، D3، E و K در عملکردهایی مانند بینایی، جذب کلسیم، سیستم ایمنی و انعقاد خون نقش دارند. ویتامین‌های گروه B نیز در متابولیسم انرژی و رشد سلولی موثرند.",
"در سیستم‌های پرورش صنعتی، طیور معمولا دسترسی محدودی به منابع طبیعی ویتامین دارند؛ به همین دلیل تامین این ترکیبات از طریق مکمل‌های استاندارد ضروری است.",
"کمبود ویتامین می‌تواند خود را به شکل کاهش رشد، افت تولید، ضعف سیستم ایمنی و افزایش حساسیت به بیماری‌ها نشان دهد.",
"استفاده منظم و متناسب با سن و مرحله تولید از مکمل‌های ویتامینه استاندارد، یکی از موثرترین و مقرون‌به‌صرفه‌ترین راهکارها برای حفظ سلامت و بازده گله است.",
],
},
{
id: 4,
slug: "choosing-right-sheep-concentrate",
title: "راهنمای انتخاب کنسانتره مناسب برای گوسفند",
excerpt:
"انتخاب کنسانتره مناسب باید بر اساس هدف پرورش، سن و وضعیت فیزیولوژیک گله انجام شود. در این مطلب معیارهای انتخاب کنسانتره گوسفند را بررسی می‌کنیم.",
cover: "/images/product-5.jpg",
category: "گوسفند",
date: "۲ تیر ۱۴۰۴",
readingTime: "۵ دقیقه مطالعه",
content: [
"کنسانتره‌های موجود در بازار از نظر ترکیب انرژی، پروتئین و ریزمغذی‌ها با یکدیگر متفاوت هستند و انتخاب نادرست می‌تواند بر بازده اقتصادی پرورش تاثیر منفی بگذارد.",
"برای گله‌های پرواری، کنسانتره باید انرژی بالایی داشته باشد تا وزن‌گیری روزانه در کوتاه‌ترین زمان ممکن حاصل شود. در مقابل، برای میش‌های مولد، تعادل پروتئین و مواد معدنی اهمیت بیشتری دارد.",
"توجه به مرحله فیزیولوژیک گله (نگهداری، آبستنی، شیردهی یا پروار) در انتخاب فرمول کنسانتره ضروری است، زیرا نیاز غذایی در هر مرحله متفاوت است.",
"کیفیت مواد اولیه و ثبات ترکیبات کنسانتره از بچی به بچ دیگر، از عوامل مهم در انتخاب تامین‌کننده معتبر است.",
"مشورت با کارشناس تغذیه دام برای تنظیم دقیق جیره بر اساس شرایط منطقه، نژاد گله و اهداف تولیدی، بهترین نتیجه را در پی خواهد داشت.",
],
},
{
id: 5,
slug: "mineral-supplements-role-livestock-health",
title: "نقش مکمل‌های معدنی در سلامت دام",
excerpt:
"عناصر معدنی اگرچه درصد کمی از وزن بدن دام را تشکیل می‌دهند، اما نقشی اساسی در سلامت، رشد و تولیدمثل دارند. در این مقاله به این نقش می‌پردازیم.",
cover: "/images/product-4.jpg",
category: "دام سنگین",
date: "۱۵ تیر ۱۴۰۴",
readingTime: "۴ دقیقه مطالعه",
content: [
"عناصر معدنی به دو دسته کلی ماکرومعدنی‌ها (مانند کلسیم، فسفر، سدیم) و ریزمغذی‌های معدنی (مانند روی، مس و منگنز) تقسیم می‌شوند که هر یک نقش مشخصی در بدن دام ایفا می‌کنند.",
"کلسیم و فسفر در ساختار استخوان و تولید شیر نقش دارند، در حالی که عناصر کمیابی مانند روی و مس در عملکرد سیستم ایمنی و باروری اهمیت ویژه‌ای دارند.",
"کمبود مواد معدنی معمولا به آرامی و بدون علائم واضح بروز می‌کند و می‌تواند در بلندمدت باعث کاهش راندمان تولیدمثل و افت تولید شود.",
"استفاده از مکمل‌های معدنی استاندارد و متناسب با تحلیل خاک و علوفه منطقه، راهکاری موثر برای پیشگیری از این کمبودها است.",
"توصیه می‌شود برنامه مکمل‌دهی معدنی با مشورت کارشناس تغذیه و بر اساس وضعیت خاص هر گله تنظیم شود.",
],
},
{
id: 6,
slug: "winter-feeding-honeybee-colonies",
title: "تغذیه زنبور عسل در فصل زمستان",
excerpt:
"فصل زمستان به دلیل کمبود منابع طبیعی گرده و شهد، یکی از حساس‌ترین دوره‌ها برای بقای کلنی زنبور عسل است. در این مطلب به نکات تغذیه زمستانه می‌پردازیم.",
cover: "/images/category-8.jpg",
category: "زنبور عسل",
date: "۸ مرداد ۱۴۰۴",
readingTime: "۵ دقیقه مطالعه",
content: [
"با کاهش دما و کمبود گل در فصل زمستان، کلنی‌های زنبور عسل با محدودیت شدید منابع طبیعی تغذیه مواجه می‌شوند و نیاز به تغذیه کمکی پیدا می‌کنند.",
"ذخیره‌سازی عسل کافی در کندو پیش از شروع سرما، اولین و مهم‌ترین اقدام برای عبور موفق کلنی از زمستان است.",
"در صورت کمبود ذخیره طبیعی، استفاده از مکمل‌های تغذیه‌ای مخصوص زنبور عسل که ترکیبی از قند و پروتئین هستند، می‌تواند از گرسنگی کلنی جلوگیری کند.",
"کنترل رطوبت داخل کندو و جلوگیری از نفوذ سرمای شدید نیز به همان اندازه تغذیه، در بقای کلنی موثر است.",
"بازدید دوره‌ای و محدود از کندوها در روزهای نسبتا گرم زمستان، امکان ارزیابی وضعیت ذخیره غذایی و انجام اقدامات لازم را فراهم می‌کند.",
],
},
{
id: 7,
slug: "why-processed-rice-bran",
title: "سبوس برنج فرآوری شده؛ چرا و چگونه؟",
excerpt:
"سبوس برنج خام به دلیل فعالیت آنزیمی بالا مستعد تندی سریع است. فرآیند پایدارسازی این مشکل را برطرف کرده و آن را به منبعی ارزشمند در تغذیه دام تبدیل می‌کند.",
cover: "/images/product-6.jpg",
category: "خوراک دام",
date: "۲۰ مرداد ۱۴۰۴",
readingTime: "۴ دقیقه مطالعه",
content: [
"سبوس برنج یکی از فرآورده‌های جانبی صنعت شالی‌کوبی است که به دلیل ترکیب غنی از انرژی، فیبر و اسیدهای چرب، پتانسیل بالایی در تغذیه دام و طیور دارد.",
"با این حال، سبوس خام حاوی آنزیم لیپاز فعال است که به سرعت باعث تجزیه چربی و تندشدن آن می‌شود؛ این موضوع کیفیت و خوش‌خوراکی محصول را کاهش می‌دهد.",
"فرآیند پایدارسازی حرارتی، این آنزیم را غیرفعال کرده و ماندگاری، کیفیت تغذیه‌ای و خوش‌خوراکی سبوس را به طور قابل توجهی افزایش می‌دهد.",
"سبوس برنج فرآوری‌شده به دلیل قیمت مناسب و ارزش تغذیه‌ای بالا، گزینه‌ای اقتصادی برای گنجاندن در جیره دام و طیور محسوب می‌شود.",
"توجه به منبع تامین و فرآیند تولید، در انتخاب سبوس برنج با کیفیت باثبات اهمیت زیادی دارد.",
],
},
{
id: 8,
slug: "vitamin-d3-deficiency-poultry",
title: "علائم کمبود ویتامین D3 در طیور و راه‌حل آن",
excerpt:
"ویتامین D3 نقشی کلیدی در جذب کلسیم و سلامت استخوان طیور دارد. در این مقاله علائم کمبود آن و راهکارهای پیشگیری را بررسی می‌کنیم.",
cover: "/images/product-11.jpg",
category: "طیور",
date: "۵ شهریور ۱۴۰۴",
readingTime: "۵ دقیقه مطالعه",
content: [
"ویتامین D3 با تسهیل جذب کلسیم و فسفر از روده، نقش تعیین‌کننده‌ای در استحکام استخوان و کیفیت پوسته تخم‌مرغ ایفا می‌کند.",
"از جمله علائم قابل مشاهده کمبود این ویتامین می‌توان به ضعف پا، کاهش استحکام پوسته تخم‌مرغ، افت تولید و کندی رشد در جوجه‌ها اشاره کرد.",
"از آنجا که طیور پرورش صنعتی معمولا دسترسی محدودی به نور مستقیم خورشید دارند، تامین ویتامین D3 عمدتا باید از طریق جیره غذایی صورت گیرد.",
"استفاده از پرمیکس‌های استاندارد حاوی ویتامین D3 با غلظت مناسب، ساده‌ترین و موثرترین راه پیشگیری از این کمبود است.",
"در صورت مشاهده علائم مشکوک، مشورت با دامپزشک یا کارشناس تغذیه برای بررسی دقیق‌تر و اصلاح جیره توصیه می‌شود.",
],
},
{
id: 9,
slug: "feed-supplement-storage-best-practices",
title: "بهترین شیوه‌های نگهداری مکمل‌های خوراک دام",
excerpt:
"نگهداری نامناسب می‌تواند کیفیت و اثربخشی مکمل‌های غذایی را به شدت کاهش دهد. در این مطلب اصول صحیح نگهداری این محصولات را مرور می‌کنیم.",
cover: "/images/category-3.jpg",
category: "خوراک دام",
date: "۱۲ شهریور ۱۴۰۴",
readingTime: "۳ دقیقه مطالعه",
content: [
"بسیاری از ویتامین‌ها و ترکیبات فعال موجود در مکمل‌های غذایی نسبت به رطوبت، حرارت و نور حساس هستند و نگهداری نادرست می‌تواند اثربخشی آن‌ها را کاهش دهد.",
"مکمل‌ها باید در محیطی خشک، خنک و دور از تابش مستقیم نور خورشید نگهداری شوند. رطوبت بالا می‌تواند باعث کلوخه‌شدن و رشد کپک در محصول شود.",
"کیسه‌های باز‌شده باید به خوبی بسته و در اسرع وقت مصرف شوند تا از افت کیفیت جلوگیری شود.",
"رعایت اصل «اول وارد، اول مصرف» (FIFO) در انبارداری، به اطمینان از مصرف محصولات در تاریخ مناسب کمک می‌کند.",
"چیدمان کیسه‌ها بر روی پالت و دور از تماس مستقیم با کف و دیوار انبار، از رطوبت‌گیری و آسیب احتمالی جلوگیری می‌کند.",
],
},
{
id: 10,
slug: "nutrition-impact-on-meat-egg-quality",
title: "تاثیر تغذیه صحیح بر کیفیت گوشت و تخم‌مرغ",
excerpt:
"کیفیت نهایی گوشت و تخم‌مرغ تولیدی، ارتباط مستقیمی با نوع و کیفیت جیره مصرفی دارد. در این مقاله این رابطه را بررسی می‌کنیم.",
cover: "/images/hero-2.jpg",
category: "طیور",
date: "۲۸ شهریور ۱۴۰۴",
readingTime: "۴ دقیقه مطالعه",
content: [
"ترکیب جیره غذایی طیور، تاثیر مستقیمی بر رنگ، طعم و ارزش تغذیه‌ای محصول نهایی اعم از گوشت و تخم‌مرغ دارد.",
"منابع پروتئینی و اسیدهای چرب موجود در جیره، بر بافت و طعم گوشت اثرگذارند، در حالی که رنگدانه‌های طبیعی موجود در برخی مکمل‌ها، رنگ زرده تخم‌مرغ را بهبود می‌بخشند.",
"مکمل‌های معدنی و ویتامینه با کیفیت، علاوه بر افزایش راندمان تولید، به بهبود شاخص‌های کیفی محصول نهایی نیز کمک می‌کنند.",
"توجه به کیفیت جیره از ابتدای دوره پرورش، نه‌تنها بر عملکرد گله بلکه بر رضایت مصرف‌کننده نهایی محصولات دامی نیز تاثیرگذار است.",
"سرمایه‌گذاری در تغذیه با کیفیت، در نهایت هم به نفع تولیدکننده و هم مصرف‌کننده تمام می‌شود.",
],
},
];
export function getPostBySlug(slug: string) {
return posts.find((p) => p.slug === slug);
}
export function getRelatedPosts(post: Post, limit = 3) {
return posts
.filter((p) => p.id !== post.id && p.category === post.category)
.slice(0, limit)
.concat(
posts.filter((p) => p.id !== post.id && p.category !== post.category)
)
.slice(0, limit);
}
+325
View File
@@ -0,0 +1,325 @@
export type Product = {
id: number;
slug: string;
title: string;
category: string;
image: string;
shortDesc: string;
description: string[];
packaging: string;
usage: string;
benefits: string[];
};
export const products: Product[] = [
{
id: 1,
slug: "mineral-supplement-laying-hen",
title: "مکمل معدنی مرغ تخمگذار",
category: "مرغ تخمگذار",
image: "/images/product-1.jpg",
shortDesc: "تامین‌کننده عناصر معدنی ضروری برای افزایش کیفیت و دوام پوسته تخم‌مرغ",
description: [
"مکمل معدنی مرغ تخمگذار آراد آریسمان با فرمولاسیونی متعادل از عناصر ماکرو و میکرو معدنی، نیاز روزانه مرغ‌های تخمگذار را در دوره تولید تامین می‌کند.",
"استفاده منظم از این مکمل به بهبود استحکام پوسته، کاهش تخم‌های شکسته و افزایش یکنواختی وزن تخم‌مرغ کمک می‌کند.",
],
packaging: "کیسه ۲۵ کیلوگرمی",
usage: "طبق دستور کارشناس تغذیه، معمولا به میزان ۱ تا ۲ درصد در جیره روزانه مخلوط می‌شود.",
benefits: [
"افزایش استحکام و کیفیت پوسته تخم‌مرغ",
"کاهش درصد تخم‌های شکسته و بدشکل",
"تامین کلسیم و فسفر قابل جذب",
"بهبود یکنواختی تولید در گله",
],
},
{
id: 2,
slug: "vitamin-supplement-laying-hen",
title: "مکمل ویتامینه مرغ تخمگذار",
category: "مرغ تخمگذار",
image: "/images/product-2.jpg",
shortDesc: "پک کامل ویتامین‌های محلول در آب و چربی برای دوره تولید",
description: [
"این مکمل ترکیبی متعادل از ویتامین‌های A، D3، E، K و گروه B است که برای حفظ سلامت عمومی و راندمان تولید مرغ تخمگذار طراحی شده است.",
"کمبود ویتامین در دوره تولید می‌تواند منجر به افت تخم‌گذاری شود؛ مصرف منظم این مکمل از این افت پیشگیری می‌کند.",
],
packaging: "کیسه ۲۵ کیلوگرمی",
usage: "به صورت مخلوط در خوراک یا محلول در آب آشامیدنی طبق دستور دامپزشک قابل استفاده است.",
benefits: [
"تقویت سیستم ایمنی گله",
"بهبود باروری و کیفیت جوجه‌درآوری",
"افزایش پایداری تولید در فصول گرم و سرد",
"کاهش استرس ناشی از تراکم و جابجایی",
],
},
{
id: 3,
slug: "vitamin-supplement-broiler",
title: "مکمل ویتامینه مرغ گوشتی",
category: "مرغ گوشتی",
image: "/images/product-3.jpg",
shortDesc: "پشتیبان رشد سریع و یکنواخت در دوره پرورش گوشتی",
description: [
"مکمل ویتامینه مرغ گوشتی آراد آریسمان برای پوشش نیاز ویتامینی جوجه‌های گوشتی در تمامی مراحل رشد فرموله شده است.",
"این محصول با حمایت از سیستم ایمنی و بهبود متابولیسم، به افزایش ضریب تبدیل غذایی کمک می‌کند.",
],
packaging: "کیسه ۲۵ کیلوگرمی",
usage: "بر اساس سن و وزن گله و طبق برنامه تغذیه‌ای توصیه‌شده مصرف شود.",
benefits: [
"بهبود ضریب تبدیل غذایی",
"افزایش سرعت و یکنواختی رشد",
"کاهش تلفات دوره پرورش",
"تقویت مقاومت در برابر تنش‌های محیطی",
],
},
{
id: 4,
slug: "mineral-supplement-broiler",
title: "مکمل معدنی مرغ گوشتی",
category: "مرغ گوشتی",
image: "/images/product-4.jpg",
shortDesc: "تامین عناصر معدنی برای استخوان‌بندی و رشد سالم",
description: [
"این مکمل معدنی، ترکیبی غنی از کلسیم، فسفر، سدیم و ریزمغذی‌های ضروری برای رشد اسکلتی سالم جوجه‌های گوشتی است.",
"استخوان‌بندی قوی، پیش‌نیاز دستیابی به وزن هدف در پایان دوره پرورش است.",
],
packaging: "کیسه ۲۵ کیلوگرمی",
usage: "طبق فرمول جیره و با نظر کارشناس تغذیه دام و طیور در خوراک مخلوط شود.",
benefits: [
"تقویت استخوان‌بندی و کاهش لنگش",
"بهبود جذب و بازده خوراک مصرفی",
"کاهش ریسک اختلالات متابولیک",
"پشتیبانی از رشد یکنواخت گله",
],
},
{
id: 5,
slug: "sheep-concentrate",
title: "کنسانتره گوسفند",
category: "گوسفند",
image: "/images/product-5.jpg",
shortDesc: "خوراک متعادل برای افزایش وزن و بازده پرواربندی",
description: [
"کنسانتره گوسفند آراد آریسمان با ترکیبی متوازن از انرژی، پروتئین، ویتامین و مواد معدنی، برای دوره پرواربندی و نگهداری طراحی شده است.",
"این محصول مصرف خوراک را بهینه کرده و بازده اقتصادی پرورش را افزایش می‌دهد.",
],
packaging: "کیسه ۲۵ و ۴۰ کیلوگرمی",
usage: "متناسب با سن، وزن و هدف پرورش (پروار یا نگهداری) در جیره روزانه استفاده شود.",
benefits: [
"افزایش وزن‌گیری روزانه",
"بهبود بازده خوراک مصرفی",
"تامین انرژی و پروتئین متعادل",
"مناسب برای گله‌های پرواری و مولد",
],
},
{
id: 6,
slug: "processed-rice-bran",
title: "سبوس برنج فرآوری شده",
category: "خوراک دام",
image: "/images/product-6.jpg",
shortDesc: "منبع انرژی و فیبر با کیفیت برای جیره دام و طیور",
description: [
"سبوس برنج فرآوری‌شده با فرآیند پایدارسازی، از تندشدن چربی جلوگیری کرده و ماندگاری و کیفیت تغذیه‌ای بالاتری نسبت به سبوس خام دارد.",
"این محصول منبع خوبی از انرژی، فیبر و اسیدهای چرب ضروری برای جیره دام و طیور است.",
],
packaging: "کیسه ۲۵ کیلوگرمی",
usage: "به عنوان بخشی از جیره پایه، طبق فرمولاسیون کارشناس تغذیه در نظر گرفته شود.",
benefits: [
"پایداری بالا در برابر تندی چربی",
"منبع انرژی و فیبر با کیفیت",
"بهبود سلامت دستگاه گوارش",
"مقرون‌به‌صرفه در فرمولاسیون جیره",
],
},
{
id: 7,
slug: "wheat-bran",
title: "سبوس گندم",
category: "خوراک دام",
image: "/images/product-7.jpg",
shortDesc: "منبع فیبر طبیعی برای تنظیم عملکرد گوارشی دام",
description: [
"سبوس گندم به عنوان یک منبع فیبر طبیعی، نقش مهمی در تنظیم عملکرد شکمبه و دستگاه گوارش نشخوارکنندگان دارد.",
"این محصول با کیفیت یکنواخت و عاری از آلودگی، برای مصرف در جیره دام سبک و سنگین مناسب است.",
],
packaging: "کیسه ۲۵ کیلوگرمی",
usage: "به عنوان جزئی از جیره فیبردار، مطابق فرمول تغذیه دام مصرف شود.",
benefits: [
"تنظیم عملکرد شکمبه و گوارش",
"منبع فیبر و انرژی طبیعی",
"کیفیت و یکنواختی بالا",
"سازگار با انواع جیره دام",
],
},
{
id: 8,
slug: "dairy-cattle-supplement",
title: "مکمل دام شیری",
category: "دام سنگین",
image: "/images/product-8.jpg",
shortDesc: "پشتیبان تولید شیر و سلامت گاوهای شیری",
description: [
"مکمل دام شیری با تامین انرژی، پروتئین قابل‌متابولیسم، ویتامین و مواد معدنی، از تولید پایدار شیر و سلامت باروری گاو شیری حمایت می‌کند.",
"فرمولاسیون این محصول با در نظر گرفتن نیاز دوره‌های مختلف شیردهی طراحی شده است.",
],
packaging: "کیسه ۲۵ کیلوگرمی",
usage: "بر اساس مرحله شیردهی و میزان تولید، طبق برنامه تغذیه‌ای در جیره گنجانده شود.",
benefits: [
"افزایش پایدار تولید شیر",
"بهبود درصد چربی و پروتئین شیر",
"پشتیبانی از باروری و سلامت سم",
"کاهش ریسک اختلالات متابولیک دوره زایمان",
],
},
{
id: 9,
slug: "fattening-cattle-supplement",
title: "مکمل دام پرواری",
category: "دام سنگین",
image: "/images/product-9.jpg",
shortDesc: "افزایش وزن‌گیری روزانه در دوره پروار",
description: [
"مکمل دام پرواری آراد آریسمان با تمرکز بر افزایش بازده خوراک مصرفی، به دستیابی سریع‌تر به وزن هدف در پایان دوره پروار کمک می‌کند.",
"این محصول ترکیبی از مواد معدنی، ویتامین و افزودنی‌های بهبود‌دهنده گوارش را در خود دارد.",
],
packaging: "کیسه ۲۵ کیلوگرمی",
usage: "متناسب با وزن اولیه و طول دوره پروار، طبق فرمول جیره مصرف شود.",
benefits: [
"افزایش وزن‌گیری روزانه",
"بهبود بازده تبدیل خوراک",
"کاهش دوره پرواربندی",
"پشتیبانی از سلامت گوارشی دام",
],
},
{
id: 10,
slug: "premix-vitamin-k3",
title: "پرمیکس ویتامین K3",
category: "پرمیکس",
image: "/images/product-10.jpg",
shortDesc: "تامین‌کننده ویتامین K3 برای انعقاد خون و سلامت عمومی",
description: [
"ویتامین K3 نقش کلیدی در فرآیند انعقاد خون و سلامت عمومی دام و طیور دارد و کمبود آن می‌تواند منجر به خونریزی‌های داخلی و کاهش راندمان تولید شود.",
"این پرمیکس با غلظت استاندارد، برای استفاده در فرمولاسیون خوراک کارخانه‌ای و مزرعه‌ای مناسب است.",
],
packaging: "بسته‌بندی ۲۵ کیلوگرمی",
usage: "توسط کارخانجات خوراک دام و طیور، طبق فرمول استاندارد در پرمیکس نهایی گنجانده می‌شود.",
benefits: [
"پشتیبانی از فرآیند طبیعی انعقاد خون",
"غلظت استاندارد و قابل اطمینان",
"سازگار با سایر اجزای پرمیکس",
"کنترل کیفی در هر batch تولید",
],
},
{
id: 11,
slug: "premix-vitamin-d3",
title: "پرمیکس ویتامین D3",
category: "پرمیکس",
image: "/images/product-11.jpg",
shortDesc: "ضروری برای جذب کلسیم و استخوان‌بندی سالم",
description: [
"ویتامین D3 نقش تعیین‌کننده‌ای در جذب کلسیم و فسفر و در نتیجه استحکام استخوان و کیفیت پوسته تخم‌مرغ دارد.",
"این پرمیکس با پایداری بالا، برای نگهداری طولانی‌مدت و مصرف در شرایط مختلف اقلیمی مناسب است.",
],
packaging: "بسته‌بندی ۲۵ کیلوگرمی",
usage: "طبق فرمول استاندارد پرمیکس، توسط واحدهای تولید خوراک دام و طیور استفاده می‌شود.",
benefits: [
"بهبود جذب کلسیم و فسفر",
"افزایش استحکام استخوان و پوسته تخم‌مرغ",
"پایداری بالا در نگهداری",
"مناسب برای فرمولاسیون‌های صنعتی",
],
},
{
id: 12,
slug: "premix-vitamin-a",
title: "پرمیکس ویتامین A",
category: "پرمیکس",
image: "/images/product-12.jpg",
shortDesc: "پشتیبان سیستم ایمنی، بینایی و باروری",
description: [
"ویتامین A در حفظ سلامت پوشش‌های مخاطی، سیستم ایمنی، بینایی و عملکرد تولیدمثلی دام و طیور نقش اساسی دارد.",
"این پرمیکس با غلظت دقیق و کنترل‌شده، در فرمولاسیون خوراک صنعتی مورد استفاده قرار می‌گیرد.",
],
packaging: "بسته‌بندی ۲۵ کیلوگرمی",
usage: "طبق فرمول استاندارد پرمیکس و توسط کارشناسان تغذیه در ترکیب خوراک گنجانده می‌شود.",
benefits: [
"تقویت سیستم ایمنی بدن",
"پشتیبانی از سلامت پوشش‌های مخاطی",
"بهبود عملکرد تولیدمثلی",
"غلظت دقیق و قابل اطمینان",
],
},
{
id: 13,
slug: "poultry-concentrate",
title: "کنسانتره طیور",
category: "طیور",
image: "/images/category-4.jpg",
shortDesc: "خوراک کامل و متعادل برای دوره رشد و تولید طیور",
description: [
"کنسانتره طیور آراد آریسمان با ترکیبی کامل از پروتئین، انرژی، ویتامین و مواد معدنی، نیاز تغذیه‌ای طیور در مراحل مختلف پرورش را پوشش می‌دهد.",
"این محصول برای پرورش‌دهندگان صنعتی و نیمه‌صنعتی طراحی شده و کیفیت یکنواختی در هر بچ تولید دارد.",
],
packaging: "کیسه ۲۵ کیلوگرمی",
usage: "با نسبت توصیه‌شده در فرمول جیره، متناسب با سن و نوع طیور مصرف شود.",
benefits: [
"پوشش کامل نیاز تغذیه‌ای طیور",
"افزایش راندمان تولید",
"کیفیت یکنواخت در هر بچ",
"کاهش هزینه نهایی تولید",
],
},
{
id: 14,
slug: "sheep-supplement",
title: "مکمل گوسفند",
category: "گوسفند",
image: "/images/category-7.jpg",
shortDesc: "مکمل معدنی و ویتامینه برای سلامت و باروری گله گوسفند",
description: [
"این مکمل با تامین ویتامین‌ها و عناصر معدنی کمیاب، از سلامت عمومی، باروری و مقاومت گله گوسفند در برابر تنش‌های محیطی پشتیبانی می‌کند.",
"مصرف منظم آن به‌ویژه در دوره‌های حساس تولیدمثل و شیردهی توصیه می‌شود.",
],
packaging: "کیسه ۲۵ کیلوگرمی",
usage: "طبق دستور کارشناس دامپروری و متناسب با دوره فیزیولوژیک گله مصرف شود.",
benefits: [
"بهبود باروری و درصد زایش",
"تقویت سیستم ایمنی گله",
"پشتیبانی از دوره شیردهی",
"کاهش تلفات بره در دوره پرورش",
],
},
{
id: 15,
slug: "honeybee-supplement",
title: "مکمل زنبور عسل",
category: "زنبور عسل",
image: "/images/category-8.jpg",
shortDesc: "تغذیه کمکی برای تقویت کلنی در فصول کم‌گل",
description: [
"مکمل زنبور عسل آراد آریسمان به عنوان منبع تغذیه کمکی، در فصول کمبود گل و شهد، از قدرت و بقای کلنی پشتیبانی می‌کند.",
"این محصول با ترکیبی متعادل از قند، پروتئین و ریزمغذی‌ها، به حفظ فعالیت و تولیدمثل کلنی کمک می‌کند.",
],
packaging: "بسته‌بندی ۱ و ۵ کیلوگرمی",
usage: "طبق راهنمای زنبورداری، معمولا در فصول پاییز و اوایل بهار مورد استفاده قرار می‌گیرد.",
benefits: [
"تقویت کلنی در فصول کم‌گل",
"پشتیبانی از تولیدمثل ملکه",
"افزایش مقاومت کلنی در زمستان",
"ترکیب متعادل قند و پروتئین",
],
},
];
export function getProductBySlug(slug: string) {
return products.find((p) => p.slug === slug);
}
export function getRelatedProducts(product: Product, limit = 3) {
return products
.filter((p) => p.id !== product.id && p.category === product.category)
.slice(0, limit);
}
+5
View File
@@ -0,0 +1,5 @@
const FA_DIGITS = ["۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"];
export function toFa(value: number | string): string {
return String(value).replace(/[0-9]/g, (d) => FA_DIGITS[Number(d)]);
}
+34
View File
@@ -0,0 +1,34 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "react-jsx",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./src/*"]
}
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
".next/dev/types/**/*.ts",
"**/*.mts"
],
"exclude": ["node_modules"]
}