+import { ImageOff } from "lucide-vue-next";
+
+withDefaults(
+ defineProps<{
+ label?: string;
+ aspectClass?: string;
+ }>(),
+ {
+ label: "تصویر محصول",
+ aspectClass: "aspect-[4/3]",
+ },
+);
+
+
+
+
+
+ {{ label }}
+
+
diff --git a/app/components/ui/Logo.vue b/app/components/ui/Logo.vue
index a4b2e1e..b222104 100644
--- a/app/components/ui/Logo.vue
+++ b/app/components/ui/Logo.vue
@@ -1,19 +1,24 @@
-
+
-
+
- آریا ایمن
+ ایمن پیشگامان
- ARIA IMEN CO.
+ IMEN PISHGAMAN CO.
-
+
diff --git a/app/pages/categories/[slug].vue b/app/pages/categories/[slug].vue
new file mode 100644
index 0000000..528753d
--- /dev/null
+++ b/app/pages/categories/[slug].vue
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ category.name }}
+
+
+
+
+
+
+ {{ faNum(category.products.length) }} محصول
+
+
+ {{ category.en }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+ {{ product.code }}
+
+
+ {{ faNum(String(i + 1).padStart(2, "0")) }}
+
+
+
+
+
+
{{ product.name }}
+
+ {{ product.en }}
+
+
+
{{ product.desc }}
+
+
+
+ {{ s }}
+
+
+
+
+
مدلها / رنگها:
+
+
+ {{ v }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nuxt.config.ts b/nuxt.config.ts
index 134c7d2..bbb3fd4 100644
--- a/nuxt.config.ts
+++ b/nuxt.config.ts
@@ -1,6 +1,7 @@
import { fileURLToPath } from "node:url";
import tailwindcss from "@tailwindcss/vite";
import { siteConfig } from "./shared/config/site";
+import { categorySlugs } from "./shared/data/categories";
/** Unmatched path rendered through error.vue at build time and saved as out/404.html */
const NOT_FOUND_ROUTE = "/__not-found";
@@ -23,7 +24,14 @@ export default defineNuxtConfig({
link: [
{
rel: "preload",
- href: "/fonts/Vazirmatn-Variable.woff2",
+ href: "/fonts/IRANSansWeb.woff2",
+ as: "font",
+ type: "font/woff2",
+ crossorigin: "",
+ },
+ {
+ rel: "preload",
+ href: "/fonts/IRANSansWeb_Bold.woff2",
as: "font",
type: "font/woff2",
crossorigin: "",
@@ -51,7 +59,14 @@ export default defineNuxtConfig({
output: { publicDir: fileURLToPath(new URL("./out", import.meta.url)) },
prerender: {
crawlLinks: false,
- routes: ["/", "/robots.txt", "/sitemap.xml", "/manifest.webmanifest", NOT_FOUND_ROUTE],
+ routes: [
+ "/",
+ "/robots.txt",
+ "/sitemap.xml",
+ "/manifest.webmanifest",
+ NOT_FOUND_ROUTE,
+ ...categorySlugs.map((s) => `/categories/${s}`),
+ ],
},
hooks: {
// Nuxt's own /404.html is an empty SPA shell. Replace it with a server-rendered error.vue
diff --git a/public/fonts/IRANSansWeb.woff2 b/public/fonts/IRANSansWeb.woff2
new file mode 100644
index 0000000..45ce329
Binary files /dev/null and b/public/fonts/IRANSansWeb.woff2 differ
diff --git a/public/fonts/IRANSansWeb_Bold.woff2 b/public/fonts/IRANSansWeb_Bold.woff2
new file mode 100644
index 0000000..a5ad437
Binary files /dev/null and b/public/fonts/IRANSansWeb_Bold.woff2 differ
diff --git a/public/fonts/IRANSansWeb_Light.woff2 b/public/fonts/IRANSansWeb_Light.woff2
new file mode 100644
index 0000000..057c555
Binary files /dev/null and b/public/fonts/IRANSansWeb_Light.woff2 differ
diff --git a/public/fonts/IRANSansWeb_Medium.woff2 b/public/fonts/IRANSansWeb_Medium.woff2
new file mode 100644
index 0000000..16af92a
Binary files /dev/null and b/public/fonts/IRANSansWeb_Medium.woff2 differ
diff --git a/public/fonts/IRANSansWeb_UltraLight.woff2 b/public/fonts/IRANSansWeb_UltraLight.woff2
new file mode 100644
index 0000000..e675572
Binary files /dev/null and b/public/fonts/IRANSansWeb_UltraLight.woff2 differ
diff --git a/public/images/logo.png b/public/images/logo.png
new file mode 100644
index 0000000..b689239
Binary files /dev/null and b/public/images/logo.png differ
diff --git a/public/images/products/hearing.jpg b/public/images/products/hearing.jpg
new file mode 100644
index 0000000..13da88a
Binary files /dev/null and b/public/images/products/hearing.jpg differ
diff --git a/public/images/products/respiratory.jpg b/public/images/products/respiratory.jpg
new file mode 100644
index 0000000..8dec887
Binary files /dev/null and b/public/images/products/respiratory.jpg differ
diff --git a/public/images/products/traffic.jpg b/public/images/products/traffic.jpg
new file mode 100644
index 0000000..ce88215
Binary files /dev/null and b/public/images/products/traffic.jpg differ
diff --git a/server/routes/sitemap.xml.ts b/server/routes/sitemap.xml.ts
index 164fe6e..b7c1280 100644
--- a/server/routes/sitemap.xml.ts
+++ b/server/routes/sitemap.xml.ts
@@ -1,6 +1,15 @@
import { absUrl } from "../../shared/config/site";
+import { categorySlugs } from "../../shared/data/categories";
-const pages = ["/"];
+interface SitemapEntry {
+ loc: string;
+ priority: string;
+}
+
+const pages: SitemapEntry[] = [
+ { loc: "/", priority: "1" },
+ ...categorySlugs.map((s) => ({ loc: `/categories/${s}`, priority: "0.8" })),
+];
export default defineEventHandler((event) => {
setHeader(event, "Content-Type", "application/xml; charset=utf-8");
@@ -8,7 +17,7 @@ export default defineEventHandler((event) => {
const urls = pages
.map(
(p) =>
- `
\n${absUrl(p)}\n${lastmod}\nmonthly\n1\n`,
+ `
\n${absUrl(p.loc)}\n${lastmod}\nmonthly\n${p.priority}\n`,
)
.join("\n");
return `\n
\n${urls}\n\n`;
diff --git a/shared/config/site.ts b/shared/config/site.ts
index 8a8eccf..2eb4e2d 100644
--- a/shared/config/site.ts
+++ b/shared/config/site.ts
@@ -1,13 +1,13 @@
export const siteConfig = {
- name: "آریا ایمن",
- nameEn: "Aria Imen Safety",
- url: "https://ariaiman.ir", // TODO: replace with the real production domain before deploy
+ name: "ایمن پیشگامان",
+ nameEn: "Imen Pishgaman Safety",
+ url: "https://imenpishgaman.ir", // TODO: replace with the real production domain before deploy
locale: "fa_IR",
lang: "fa",
dir: "rtl" as const,
- title: "آریا ایمن | تجهیزات ایمنی و حفاظت فردی صنعتی",
+ title: "ایمن پیشگامان | تجهیزات ایمنی و حفاظت فردی صنعتی",
description:
- "آریا ایمن — تأمینکننده تخصصی تجهیزات حفاظت فردی (PPE)، بازرسی، آموزش و راهکارهای ایمنی صنعتی برای سازمانهایی که جان انسانها را جدی میگیرند.",
+ "ایمن پیشگامان — تأمینکننده تخصصی تجهیزات حفاظت فردی (PPE)، بازرسی، آموزش و راهکارهای ایمنی صنعتی برای سازمانهایی که جان انسانها را جدی میگیرند.",
// TODO: replace with a dedicated 1200×630 social image when available
ogImage: {
src: "/images/hero.jpg",
@@ -28,7 +28,7 @@ export const siteConfig = {
contact: {
phone: "+98-21-91008800",
phoneDisplay: "۰۲۱ - ۹۱ ۰۰ ۸۸ ۰۰",
- email: "info@ariaiman.ir",
+ email: "info@imenpishgaman.ir",
address: {
streetAddress: "خیابان کارگر شمالی، خیابان فر، کوچه دوم، پلاک ۱۲",
addressLocality: "تهران",
diff --git a/shared/data/categories.ts b/shared/data/categories.ts
new file mode 100644
index 0000000..c76279c
--- /dev/null
+++ b/shared/data/categories.ts
@@ -0,0 +1,458 @@
+export interface Product {
+ code: string;
+ name: string;
+ en: string;
+ desc: string;
+ specs: string[];
+ variants?: string[];
+ image?: string;
+}
+
+export interface Category {
+ slug: string;
+ code: string;
+ name: string;
+ en: string;
+ shortDesc: string;
+ fullDesc: string;
+ icon: string;
+ products: Product[];
+}
+
+export const CATEGORIES: readonly Category[] = [
+ {
+ slug: "workwear",
+ code: "IP-C01",
+ name: "پوشاک کار و البسه صنعتی",
+ en: "INDUSTRIAL WORKWEAR",
+ shortDesc:
+ "لباسکار صنعتی با پارچه فلامنت کجراه اعلا، دوخت سه سوزنه و آستر عرقگیر؛ مناسب محیطهای کارگاهی و صنعتی.",
+ fullDesc:
+ "مجموعه کامل پوشاک کار صنعتی شامل کاپشن و شلوار مهندسی، لباس جوشکاری، پیشبند دوبنده و تیشرت کار. تمامی مدلها با پارچه فلامنت کجراه اعلا و کتان مقاوم، دوخت صنعتی سه سوزنه پیوسته برای جلوگیری از شکافتگی درزها و آستر عرقگیر اختصاصی تولید میشوند. موجود در سایزهای M تا 4XL.",
+ icon: "Shirt",
+ products: [
+ {
+ code: "IP-W01",
+ name: "لباسکار مدل آلفا",
+ en: "ALPHA WORKWEAR",
+ desc: "کاپشن و شلوار مهندسی با جیبهای پاکتی و زیپدار، نوار مغزی تزئینی و طراحی ارگونومیک برای تیمهای فنی و مهندسی.",
+ specs: ["فلامنت کجراه اعلا", "دوخت سه سوزنه", "آستر عرقگیر", "سایز M تا 4XL"],
+ variants: [
+ "طوسی/آبی",
+ "مشکی/قرمز",
+ "مشکی/زرد",
+ "کرم/سرمهای",
+ ],
+ },
+ {
+ code: "IP-W02",
+ name: "لباسکار مدل اورجینال",
+ en: "ORIGINAL WORKWEAR",
+ desc: "کاپشن و شلوار استاندارد با دوام بالا، مناسب کادر فنی کارخانجات و خطوط تولید با ترکیبهای صنعتی دورنگ.",
+ specs: ["کتان مقاوم", "دوخت سه سوزنه", "آستر عرقگیر", "سایز M تا 4XL"],
+ variants: ["ترکیبهای صنعتی دورنگ"],
+ },
+ {
+ code: "IP-W03",
+ name: "لباسکار مدل بوفالو",
+ en: "BUFFALO WORKWEAR",
+ desc: "طراحی اسپرت با برشهای تقویتی روی شانه و بازو، زیپ مخفی محافظدار؛ مناسب محیطهای صنعتی فعال.",
+ specs: ["فلامنت کجراه اعلا", "زیپ مخفی محافظدار", "برش تقویتی شانه", "سایز M تا 4XL"],
+ variants: [
+ "سرمهای/زرد",
+ "طوسی/قرمز",
+ "طوسی/خردلی",
+ "آبی/مشکی",
+ ],
+ },
+ {
+ code: "IP-W04",
+ name: "لباسکار ست ورک",
+ en: "SET WORK",
+ desc: "ست اداری/کارگاهی با انعطاف بالا جهت فعالیتهای فنی و تعمیراتی؛ قابل استفاده در محیطهای ستادی و عملیاتی.",
+ specs: ["کتان مقاوم", "دوخت سه سوزنه", "طراحی منعطف", "سایز M تا 4XL"],
+ variants: ["ترکیبهای چندگانه کارگاهی"],
+ },
+ {
+ code: "IP-W05",
+ name: "لباسکار جوشکاری",
+ en: "WELDING WORKWEAR",
+ desc: "متریال سنگین کتان یا چرم جهت مقاومت در برابر پاشش جرقههای مذاب؛ طراحیشده برای جوشکاران صنعتی.",
+ specs: ["مقاوم به جرقه مذاب", "کتان سنگین / چرم", "دوخت صنعتی", "سایز M تا 4XL"],
+ },
+ {
+ code: "IP-W06",
+ name: "پیشبند دوبنده",
+ en: "BIB OVERALLS",
+ desc: "آزادی عمل کامل کتف و شانه با جیبهای چندمنظوره ابزار بر روی پیشسینه؛ ایدهآل برای کارهای تعمیراتی و مونتاژ.",
+ specs: ["آزادی حرکت شانه", "جیب ابزار پیشسینه", "دوخت سه سوزنه", "سایز M تا 4XL"],
+ variants: ["سرمهای", "خاکستری"],
+ },
+ {
+ code: "IP-W07",
+ name: "تیشرت صنعتی",
+ en: "INDUSTRIAL T-SHIRT",
+ desc: "تیشرت یقهدار جودون / پنبهای مناسب فصول گرم و زیرپوش کاپشن کارگاهی در سولههای سرپوشیده.",
+ specs: ["پنبه / جودون", "یقهدار", "مناسب فصول گرم", "سایز M تا 4XL"],
+ },
+ ],
+ },
+ {
+ slug: "safety-footwear",
+ code: "IP-C02",
+ name: "پایپوش و کفش ایمنی",
+ en: "SAFETY FOOTWEAR",
+ shortDesc:
+ "کفشهای ایمنی مهندسی، کارگری، اداری و زنانه به همراه چکمه صنعتی؛ مجهز به سرپنجه ایمنی و زیره ضد لغزش.",
+ fullDesc:
+ "مجموعه کامل پایپوش ایمنی شامل کفشهای اداری، مهندسی، کارگری و زنانه به همراه چکمههای صنعتی. هر مدل متناسب با شرایط محیط کار طراحی شده و مجهز به سرپنجه ایمنی مقاوم، زیره تخصصی ضد لغزش و مواد مقاوم در برابر سایش و مواد شیمیایی.",
+ icon: "Footprints",
+ products: [
+ {
+ code: "IP-F01",
+ name: "کفش اداری ایمنی",
+ en: "OFFICE SAFETY SHOE",
+ desc: "طراحی شکیل و رسمی برای محیطهای اداری و ستادی؛ وزن سبک، زیره مقاوم و راحتی در استفاده طولانیمدت.",
+ specs: ["طراحی رسمی", "وزن سبک", "زیره مقاوم", "راحتی طولانیمدت"],
+ },
+ {
+ code: "IP-F02",
+ name: "کفش ایمنی مهندسی",
+ en: "ENGINEERING SAFETY BOOT",
+ desc: "مجهز به سرپنجه ایمنی مقاوم و زیره تخصصی ضد لغزش؛ مناسب محیطهای صنعتی و کارگاهی ناظران و مهندسان.",
+ specs: ["سرپنجه ایمنی", "Anti-Slip", "مقاوم به سایش", "زیره تخصصی"],
+ },
+ {
+ code: "IP-F03",
+ name: "کفش ایمنی کارگری",
+ en: "WORKER SAFETY BOOT",
+ desc: "مقاومت بالا در برابر سایش فیزیکی و تماس با مواد شیمیایی سبک؛ مناسب کارگاههای تولیدی، انبارها و پروژههای ساختمانی.",
+ specs: ["مقاوم به سایش", "مقاوم شیمیایی", "سرپنجه فولادی", "زیره ضد لغزش"],
+ },
+ {
+ code: "IP-F04",
+ name: "کفش ایمنی زنانه",
+ en: "WOMEN'S SAFETY SHOE",
+ desc: "قالب اختصاصی ارگونومیک برای بانوان شاغل در خطوط تولید و کارگاهها؛ وزن سبک و مقاوم در برابر لغزش و سایش.",
+ specs: ["قالب ارگونومیک زنانه", "وزن سبک", "ضد لغزش", "مقاوم به سایش"],
+ },
+ {
+ code: "IP-F05",
+ name: "چکمه صنعتی",
+ en: "INDUSTRIAL BOOT",
+ desc: "کاملاً نفوذناپذیر در برابر آب و مواد شیمیایی؛ زیره آجدار عمیق برای محیطهای مرطوب، آبروها و تماس با گل.",
+ specs: ["نفوذناپذیر", "مقاوم شیمیایی", "زیره آجدار عمیق", "ساق بلند"],
+ },
+ ],
+ },
+ {
+ slug: "protective-gloves",
+ code: "IP-C03",
+ name: "دستکشهای حفاظتی",
+ en: "PROTECTIVE GLOVES",
+ shortDesc:
+ "دستکشهای ضد برش، چرم، ضد اسید، ضد حلال و آرگون از برندهای استادکار، گیلان، فاکس و کالکان.",
+ fullDesc:
+ "دستکشهای حفاظت فردی شامل مدلهای ضد برش، چرم گاوی، ضد اسید، ضد حلال و آرگون. تأمین از برندهای معتبر استادکار، گیلان، فاکس و کالکان. هر مدل متناسب با نوع خطر محیط کار طراحی شده و مشخصات فنی دقیقی دارد.",
+ icon: "Hand",
+ products: [
+ {
+ code: "IP-G01",
+ name: "دستکش ضد برش",
+ en: "CUT-RESISTANT GLOVE",
+ desc: "کف مواد نیتریل، لاتکس یا PU بر روی الیاف مقاوم؛ مقاومت برشی بالا، مناسب فلزکاری، برشکاری و صنایع سنگین. قابل شستشو و چندبار مصرف.",
+ specs: ["پوشش نیتریل / لاتکس / PU", "مقاومت برشی بالا", "قابل شستشو", "چندبار مصرف"],
+ variants: ["استادکار", "گیلان", "فاکس", "کالکان"],
+ },
+ {
+ code: "IP-G02",
+ name: "دستکش چرم",
+ en: "LEATHER GLOVE",
+ desc: "چرم گاوی یا اشپالت ضخیم با مقاومت مکانیکی بالا در برابر سایش، جرقه و اجسام تیز و زبر.",
+ specs: ["چرم گاوی / اشپالت", "مقاومت مکانیکی بالا", "مقاوم به جرقه", "مقاوم به سایش"],
+ },
+ {
+ code: "IP-G03",
+ name: "دستکش ضد اسید",
+ en: "ACID-RESISTANT GLOVE",
+ desc: "لایههای ضخیم PVC یا نئوپرن برای محافظت کامل دست و ساعد در برابر انواع اسیدها، بازها و قلیاها.",
+ specs: ["PVC / نئوپرن", "محافظت دست و ساعد", "مقاوم به اسید و باز", "ساق بلند"],
+ },
+ {
+ code: "IP-G04",
+ name: "دستکش ضد حلال",
+ en: "SOLVENT-RESISTANT GLOVE",
+ desc: "نیتریل خالص و لاستیکهای مقاوم با مقاومت شیمیایی بالا در تماس با حلالها، تینر و مشتقات نفتی.",
+ specs: ["نیتریل خالص", "مقاوم شیمیایی", "مقاوم به تینر", "مقاوم به مشتقات نفتی"],
+ },
+ {
+ code: "IP-G05",
+ name: "دستکش آرگون",
+ en: "ARGON WELDING GLOVE",
+ desc: "چرم سبک و لطیف بزی با ساق بلند؛ نرمی و حس لامسه بالا برای جوشکاری ظریف آرگون (TIG) و مقاومت حرارتی.",
+ specs: ["چرم بزی سبک", "ساق بلند", "حس لامسه بالا", "مقاوم حرارتی"],
+ },
+ ],
+ },
+ {
+ slug: "safety-helmets",
+ code: "IP-C04",
+ name: "کلاه ایمنی",
+ en: "SAFETY HELMETS",
+ shortDesc:
+ "کلاههای مهندسی، کارگری، کار در ارتفاع، ضد حرارت، کپ و عایق برق با تنوع رنگی استاندارد HSE.",
+ fullDesc:
+ "انواع کلاه ایمنی صنعتی شامل مدلهای مهندسی، کارگری، کار در ارتفاع، ضد حرارت، کپ ضربهگیر نقابدار و عایق برق. با پوشش تنوع رنگی استاندارد HSE (سفید، زرد، آبی، قرمز، سبز)، یراق و رگلاژ داخلی قابل تنظیم و پوسته ضربهگیر مقاوم.",
+ icon: "HardHat",
+ products: [
+ {
+ code: "IP-H01",
+ name: "کلاه ایمنی مهندسی",
+ en: "ENGINEERING HELMET",
+ desc: "کلاه ایمنی مهندسی با پوسته HDPE مقاوم به ضربه، رگلاژ داخلی قابل تنظیم و قابلیت نصب هدفون و شیلد صورت.",
+ specs: ["پوسته HDPE", "رگلاژ قابل تنظیم", "قابلیت نصب لوازم جانبی", "رنگبندی HSE"],
+ variants: ["سفید", "زرد", "آبی", "قرمز", "سبز"],
+ },
+ {
+ code: "IP-H02",
+ name: "کلاه ایمنی کارگری",
+ en: "WORKER HELMET",
+ desc: "کلاه ایمنی استاندارد برای خطوط تولید و محیطهای کارگاهی؛ سبک و مقاوم با تهویه مناسب.",
+ specs: ["سبک و مقاوم", "تهویه مناسب", "تسمه چانه", "پوسته ضربهگیر"],
+ variants: ["سفید", "زرد", "آبی", "قرمز"],
+ },
+ {
+ code: "IP-H03",
+ name: "کلاه ایمنی ارتفاع",
+ en: "HEIGHT SAFETY HELMET",
+ desc: "کلاه ایمنی ویژه کار در ارتفاع با تسمه چانهبند مستحکم و سیستم نگهداری چندنقطهای برای داربستبندی و پروژههای عمرانی.",
+ specs: ["چانهبند مستحکم", "نگهداری چندنقطهای", "مقاوم به سقوط اجسام", "سبکوزن"],
+ },
+ {
+ code: "IP-H04",
+ name: "کلاه ضد حرارت",
+ en: "HEAT-RESISTANT HELMET",
+ desc: "مقاوم در برابر دماهای بالا و پاشش مواد مذاب؛ مناسب محیطهای ذوب، ریختهگری و کورههای صنعتی.",
+ specs: ["مقاوم حرارتی", "مقاوم به مواد مذاب", "پوسته تقویتشده", "عایق حرارتی"],
+ },
+ {
+ code: "IP-H05",
+ name: "کلاه کپ ایمنی",
+ en: "SAFETY CAP",
+ desc: "کلاه ایمنی نقابدار ضربهگیر با ظاهر شبیه کلاه معمولی؛ مناسب محیطهایی با ریسک برخورد سر ولی نیاز به ظاهر رسمی.",
+ specs: ["نقابدار", "ضربهگیر داخلی", "ظاهر رسمی", "سبکوزن"],
+ },
+ {
+ code: "IP-H06",
+ name: "کلاه عایق برق",
+ en: "ELECTRICALLY INSULATED HELMET",
+ desc: "عایق در برابر جریان الکتریکی، مناسب تأسیسات برق فشار قوی و کار با تجهیزات الکتریکی صنعتی.",
+ specs: ["عایق الکتریکی", "فشار قوی", "پوسته ABS / HDPE", "رگلاژ قابل تنظیم"],
+ },
+ ],
+ },
+ {
+ slug: "eye-protection",
+ code: "IP-C05",
+ name: "عینک ایمنی و صنعتی",
+ en: "EYE PROTECTION",
+ shortDesc:
+ "عینکهای مهندسی فریمدار، گاگلهای محافظتی و شیلدهای صورت با ویژگیهای ضد ضربه، ضد خش و UV.",
+ fullDesc:
+ "عینکهای ایمنی صنعتی شامل مدلهای مهندسی فریمدار، گاگلهای محافظتی کشدار کارگاهی و آزمایشگاهی و شیلدهای دودی و شفاف. مجهز به ویژگیهای ضد ضربه، ضد خش (Anti-Scratch)، ضد بخار (Anti-Fog) و فیلتر اشعه UV با قابلیت تنظیم فریم و دستهها.",
+ icon: "Glasses",
+ products: [
+ {
+ code: "IP-E01",
+ name: "عینک مهندسی فریمدار",
+ en: "FRAMED SAFETY GLASSES",
+ desc: "عینک ایمنی فریمدار با لنز ضد ضربه و پوشش UV400؛ سازگار با عینک طبی و قابلیت تنظیم فریم و دستهها.",
+ specs: ["ضد ضربه", "Anti-Scratch", "UV400", "قابل تنظیم"],
+ },
+ {
+ code: "IP-E02",
+ name: "گاگل محافظتی",
+ en: "PROTECTIVE GOGGLES",
+ desc: "گاگل محافظتی کشدار با تهویه ضد بخار؛ مناسب سنگزنی، تراشکاری و محیطهای شیمیایی و آزمایشگاهی.",
+ specs: ["Anti-Fog", "ضد ضربه", "تهویه مناسب", "کشدار ارگونومیک"],
+ },
+ {
+ code: "IP-E03",
+ name: "شیلد محافظ صورت",
+ en: "FACE SHIELD",
+ desc: "شیلد محافظ تمام صورت با لنز شفاف یا دودی؛ محافظت کامل صورت در برابر پاشش مواد، براده و ذرات.",
+ specs: ["محافظت تمام صورت", "لنز شفاف / دودی", "ضد ضربه", "سبکوزن"],
+ },
+ ],
+ },
+ {
+ slug: "hearing-protection",
+ code: "IP-C06",
+ name: "حفاظت شنوایی",
+ en: "HEARING PROTECTION",
+ shortDesc:
+ "ایرماف روگوشی با کاهش ۲۸ دسیبل و ایرپلاگهای اسفنجی و سیلیکونی برای محیطهای پرسروصدا.",
+ fullDesc:
+ "تجهیزات حفاظت شنوایی شامل ایرماف (محافظ روگوشی) با کاهش تراز صدا تا ۲۸ دسیبل و ایرپلاگ (داخلگوشی) در مدلهای اسفنجی فرمگیر و پلهای سیلیکونی. مناسب محیطهای با آلودگی صوتی بالای ۸۵ دسیبل، کمپرسورخانهها و خطوط تولید سنگین.",
+ icon: "Ear",
+ products: [
+ {
+ code: "IP-HP01",
+ name: "ایرماف محافظ",
+ en: "PROTECTIVE EARMUFF",
+ desc: "محافظ روگوشی با کاهش تراز صدا تا ۲۸ دسیبل؛ هدبند قابل تنظیم، سبک و بالشتکهای نرم جهت شیفتهای کاری طولانی.",
+ specs: ["کاهش ۲۸ دسیبل", "هدبند قابل تنظیم", "بالشتک نرم", "سبکوزن"],
+ },
+ {
+ code: "IP-HP02",
+ name: "ایرپلاگ",
+ en: "EARPLUG",
+ desc: "محافظت در برابر نویزهای تیز محیطی؛ مدلهای اسفنجی فرمگیر و پلهای سیلیکونی بنددار، یکبار مصرف و چندبار مصرف.",
+ specs: ["اسفنجی فرمگیر", "سیلیکونی پلهای", "بنددار", "یکبار / چندبار مصرف"],
+ },
+ ],
+ },
+ {
+ slug: "respiratory-protection",
+ code: "IP-C07",
+ name: "حفاظت تنفسی",
+ en: "RESPIRATORY PROTECTION",
+ shortDesc:
+ "ماسکهای نیمصورت، تمامصورت، شیمیایی، P2/P3 و فیلتردار برای محافظت در برابر گازها و ذرات.",
+ fullDesc:
+ "تجهیزات حفاظت تنفسی شامل ماسکهای نیمصورت، تمامصورت، شیمیایی با کارتریج تخصصی، ماسکهای فیلتردار P2/P3 برای ذرات میکرونی، ماسکهای با فیلتر تعویضی اقتصادی و ماسکهای سهلایه بهداشتی. مناسب کار با حلالهای فرار، غبارهای معدنی، رنگپاشی و خطوط شیمیایی.",
+ icon: "ShieldPlus",
+ products: [
+ {
+ code: "IP-R01",
+ name: "ماسک نیمصورت",
+ en: "HALF-FACE RESPIRATOR",
+ desc: "مناسب فضاهای صنعتی با آلودگی و گازهای با غلظت متوسط؛ سبک و راحت برای استفاده طولانیمدت.",
+ specs: ["پوشش بینی و دهان", "فیلتر قابل تعویض", "بند قابل تنظیم", "سبکوزن"],
+ },
+ {
+ code: "IP-R02",
+ name: "ماسک تمامصورت",
+ en: "FULL-FACE RESPIRATOR",
+ desc: "پوشش همزمان چشم و تنفس جهت کار با مواد سمی و بخارات خورنده پرخطر؛ شیشه ضد ضربه و ضد بخار.",
+ specs: ["محافظت چشم و تنفس", "شیشه ضد ضربه", "Anti-Fog", "فیلتر چندمنظوره"],
+ },
+ {
+ code: "IP-R03",
+ name: "ماسک شیمیایی",
+ en: "CHEMICAL RESPIRATOR",
+ desc: "مجهز به کارتریجهای تخصصی فیلتراسیون بخارات آلی و گازهای اسیدی؛ مناسب صنایع شیمیایی و پتروشیمی.",
+ specs: ["کارتریج تخصصی", "فیلتر بخارات آلی", "فیلتر گازهای اسیدی", "آببندی کامل"],
+ },
+ {
+ code: "IP-R04",
+ name: "ماسک فیلتردار P2/P3",
+ en: "P2/P3 PARTICULATE MASK",
+ desc: "محافظت اختصاصی در برابر ذرات میکرونی، گردوغبار و میستهای مایع؛ مناسب معادن و محیطهای پرگردوغبار.",
+ specs: ["فیلتر P2 / P3", "ذرات میکرونی", "گردوغبار و میست", "سوپاپ بازدمی"],
+ },
+ {
+ code: "IP-R05",
+ name: "ماسک با فیلتر تعویضی",
+ en: "REPLACEABLE FILTER MASK",
+ desc: "قابلیت تعویض مدیا و استفاده اقتصادی طولانیمدت؛ مناسب مصارف روزمره صنعتی.",
+ specs: ["فیلتر تعویضی", "اقتصادی", "استفاده طولانیمدت", "آببندی مطمئن"],
+ },
+ {
+ code: "IP-R06",
+ name: "ماسک سهلایه بهداشتی",
+ en: "THREE-LAYER MASK",
+ desc: "مناسب مراجعات روزمره و فضاهای عمومی با غلظت پایین آلودگی؛ سبک و یکبار مصرف.",
+ specs: ["سهلایه", "یکبار مصرف", "سبکوزن", "بهداشتی"],
+ },
+ ],
+ },
+ {
+ slug: "traffic-equipment",
+ code: "IP-C08",
+ name: "تجهیزات ترافیکی و ایمنی محیطی",
+ en: "TRAFFIC & SITE SAFETY",
+ shortDesc:
+ "مخروط، نیوجرسی، استوانه، سرعتگیر، آینه محدب و سایر تجهیزات ایمنسازی محوطه صنعتی.",
+ fullDesc:
+ "تجهیزات ترافیکی و ایمنی محیطی شامل مخروط ترافیکی، نیوجرسی پلاستیکی، استوانه و بولارد، چراغ و تابلوهای هشداردهنده، باتوم ترافیکی، نوارهای خطر، سرعتگیر لاستیکی، آینههای محدب، محافظ گوشه ستون و گلمیخ خورشیدی. مناسب ایمنسازی محوطه کارخانه، انبارها، رمپها و پارکینگها.",
+ icon: "TriangleAlert",
+ products: [
+ {
+ code: "IP-T01",
+ name: "مخروط ترافیکی",
+ en: "TRAFFIC CONE",
+ desc: "PVC انعطافپذیر با شبرنگهای استاندارد روز و شب؛ مقاوم در برابر واژگونی و ضربه خودرو.",
+ specs: ["PVC انعطافپذیر", "شبرنگ استاندارد", "مقاوم به واژگونی", "قابل رؤیت شبانه"],
+ },
+ {
+ code: "IP-T02",
+ name: "نیوجرسی پلاستیکی",
+ en: "NEW JERSEY BARRIER",
+ desc: "بدنه پلیاتیلنی مدولار قابل اتصال با قابلیت پرشوندگی با آب یا ماسه جهت تثبیت و ایجاد حائل.",
+ specs: ["پلیاتیلن مدولار", "قابل اتصال", "پرشدنی با آب/ماسه", "مقاوم UV"],
+ },
+ {
+ code: "IP-T03",
+ name: "استوانه ترافیکی",
+ en: "TRAFFIC BOLLARD",
+ desc: "پلیاورتان ارتجاعی انعطافپذیر پس از ضربه؛ مجهز به حلقههای شبرنگ هشدار برای تفکیک مسیر.",
+ specs: ["پلیاورتان ارتجاعی", "بازگشت پس از ضربه", "شبرنگ هشدار", "نصب آسان"],
+ },
+ {
+ code: "IP-T04",
+ name: "چراغ و تابلوی هشدار",
+ en: "WARNING LIGHT & SIGN",
+ desc: "چراغهای چشمکزن سولار، تابلوی دستی ایست/حرکت و تابلوهای علائم هشداردهنده ترافیکی.",
+ specs: ["سولار / باتری", "LED چشمکزن", "تابلوی Stop/Go", "علائم استاندارد"],
+ },
+ {
+ code: "IP-T05",
+ name: "باتوم ترافیکی",
+ en: "TRAFFIC BATON",
+ desc: "باتوم LED دار دستی جهت هدایت ترافیک در شب و محیطهای کمنور؛ سبک و ارگونومیک.",
+ specs: ["LED داخلی", "قابل رؤیت شبانه", "سبکوزن", "ارگونومیک"],
+ },
+ {
+ code: "IP-T06",
+ name: "نوار خطر",
+ en: "CAUTION TAPE",
+ desc: "نوار شطرنجی و خطکشی زرد/قرمز هشدار محوطه گودبرداری و مناطق خطرناک با رولهای بازتابنده نور.",
+ specs: ["زرد / قرمز هشدار", "بازتابنده نور", "رول بلند", "مقاوم به پارگی"],
+ },
+ {
+ code: "IP-T07",
+ name: "سرعتگیر لاستیکی",
+ en: "RUBBER SPEED BUMP",
+ desc: "قطعات لاستیکی سنگین مدولار با مقاومت وزنی بالا و المانهای بازتابش شبانه؛ نصب آسان.",
+ specs: ["لاستیکی مدولار", "مقاومت وزنی بالا", "بازتاب شبانه", "نصب پیچی"],
+ },
+ {
+ code: "IP-T08",
+ name: "آینه محدب ترافیکی",
+ en: "CONVEX TRAFFIC MIRROR",
+ desc: "آینه نشکن فریمدار و کلاهدار جهت پوشش نقاط کور پیچها، تقاطعها و درب انبار.",
+ specs: ["نشکن", "فریمدار و کلاهدار", "پوشش نقاط کور", "مقاوم به آب و باد"],
+ },
+ {
+ code: "IP-T09",
+ name: "محافظ گوشه ستون",
+ en: "CORNER GUARD",
+ desc: "ضربهگیر لاستیکی شبرنگدار جهت نصب روی ستونها برای ممانعت از آسیب لیفتراک و خودروهای سنگین.",
+ specs: ["لاستیکی ضربهگیر", "شبرنگدار", "نصب دیواری", "محافظ ستون"],
+ },
+ {
+ code: "IP-T10",
+ name: "گلمیخ ترافیکی خورشیدی",
+ en: "SOLAR ROAD STUD",
+ desc: "بدنه آلومینیومی مستحکم مجهز به پنل خورشیدی و LED جهت تعیین مسیر و خطکشی شبانه.",
+ specs: ["آلومینیوم مستحکم", "پنل خورشیدی", "LED", "مقاوم به عبور خودرو"],
+ },
+ ],
+ },
+] as const;
+
+export const findCategory = (slug: string): Category | undefined =>
+ CATEGORIES.find((c) => c.slug === slug);
+
+export const categorySlugs: readonly string[] = CATEGORIES.map((c) => c.slug);
diff --git a/shared/seo/schema.ts b/shared/seo/schema.ts
index 4e1a951..283ecc2 100644
--- a/shared/seo/schema.ts
+++ b/shared/seo/schema.ts
@@ -63,6 +63,37 @@ export const serviceSchema = (opts: {
provider: { "@id": `${s.url}/#organization` },
});
+export const categoryPageSchema = (category: {
+ name: string;
+ en: string;
+ fullDesc: string;
+ slug: string;
+ products: { name: string; desc: string }[];
+}) =>
+ clean({
+ "@context": "https://schema.org",
+ "@type": "CollectionPage",
+ "@id": `${s.url}/categories/${category.slug}`,
+ name: category.name,
+ description: category.fullDesc,
+ url: abs(`/categories/${category.slug}`),
+ isPartOf: { "@id": `${s.url}/#website` },
+ provider: { "@id": `${s.url}/#organization` },
+ mainEntity: {
+ "@type": "ItemList",
+ numberOfItems: category.products.length,
+ itemListElement: category.products.map((p, i) => ({
+ "@type": "ListItem",
+ position: i + 1,
+ item: {
+ "@type": "Product",
+ name: p.name,
+ description: p.desc,
+ },
+ })),
+ },
+ });
+
/** Serialize JSON-LD safely for an inline