{blog.categoryNameFa}
: null} +{title}
+ {blog.summary ?{blog.summary}
: null} +متن این نوشته هنوز تکمیل نشده است.
+ )} + + بازگشت به مجله + +{site.shortFa}
+{paragraphs[0]}
+{paragraph}
+ ))} + {info.vision?.trim() ?{info.vision.trim()}
: null} +{address}
+ساعت حضور
+برای بازدید هماهنگ کنید تا قطعه را آرام ببینید.
+{blog.categoryNameFa}
: null} +{blog.summary}
: null} +متن این نوشته هنوز تکمیل نشده است.
+ )} + + بازگشت به مجله + +گالری ایوبی فخیم
+نوشتهها و خبرهای گالری.
+هنوز نوشتهای منتشر نشده است.
+ )} + + {totalPages > 1 && result.items.length ? ( + + ) : null} +قم، سالاریه
+برای بازدید، سفارش یا پرسش درباره یک قطعه پیام بگذارید یا تماس بگیرید.
+{site.nameFa}
+۴۰۴
+این نشانی در گالری نیست.
+ + بازگشت به خانه + +{site.nameFa}
+{site.tagline}
+{site.address}
-قطعهها را در گالری از نزدیک ببینید.
+آدرس
+{address}
+تماس
+نمونه کار
+{portfolio.summary}
: null} + {html ? : null} + {portfolio.projectUrl ? ( + + مشاهده پروژه + + ) : null} +گالری ایوبی فخیم
+پروژهها و قطعههای منتخب گالری.
+هنوز نمونه کاری منتشر نشده است.
+ )} + + {totalPages > 1 && result.items.length ? ( + + ) : null} +{product.categoryNameFa}
: null} +{product.summary}
: null} +این قطعه در گالری است. برای دیدن آن از نزدیک، زمان بازدید را هماهنگ کنید.
+دستهبندی
+{toFaDigits(result.total)} قطعه در این دسته.
+در این دسته قطعهای نیست.
+ )} + + {totalPages > 1 ? ( + + ) : null} +گالری ایوبی فخیم
++ {toFaDigits(result.total)} محصول از مجموعه گالری. برای دیدن هر کدام از نزدیک، بازدید را هماهنگ کنید. +
+در این فهرست قطعهای نیست.
+ )} + + {totalPages > 1 ? ( + + ) : null} +انتخاب گزینه
++ {formatPrice(price)} تومان +
+ ) : null} + +سبد خرید
+ {items.length === 0 ? ( +سبد خرید شما خالی است.
+ ) : ( + <> +{item.name}
++ جمع کل + + {formatPrice(total)} تومان + +
+ +
+ )}
+
+ {category ? {category} : null}
+ {title}
+ {summary ? {summary} : null}
+
+ );
+}
diff --git a/src/components/CategoryIcon.tsx b/src/components/CategoryIcon.tsx
new file mode 100644
index 0000000..765c90b
--- /dev/null
+++ b/src/components/CategoryIcon.tsx
@@ -0,0 +1,79 @@
+export function CategoryIcon({ name }: { name: string }) {
+ return (
+
+ );
+}
+
+function paths(name: string) {
+ switch (name) {
+ case "گوشواره":
+ return (
+ <>
+ + {site.nameEn} +
+نمونهای از این دسته در ویترین آنلاین نیست.
+ )} ++ + فهرست کامل محصولات + +
+برای ثبت دیدگاه وارد حساب کاربری شوید.
+ + ورود | ثبتنام + +{comment.authorName || "کاربر"}
+ {comment.text ?{comment.text}
: null} +هنوز دیدگاهی ثبت نشده است.
+ )} +حس طلایی، افسون جواهر
++ Golden feeling, jewel enchantment +
++ {kicker} +
+{subtext}
: null} +توضیحی برای «{title}» ثبت نشده است.
+ ) + ) : null} + + {tab === "technical" ? ( + specRows.length ? ( +مشخصات فنی ثبت نشده است.
+ ) + ) : null} + + {tab === "comments" ? ( ++ {step.en} +
+{step.text}
+${line.replace(/&/g, "&").replace(//g, ">")}
`) + .join(""); +} + +export function productImages(product: ApiProduct): string[] { + const urls = [ + product.thumbnailUrl, + product.image, + product.thumbnail, + ...(product.images ?? []).map((image) => image.url), + ].filter((url): url is string => Boolean(url)); + return [...new Set(urls)]; +} + +export function portfolioImages(portfolio: ApiPortfolio): string[] { + const urls = [ + portfolio.thumbnailUrl, + portfolio.image, + ...(portfolio.images ?? []).map((image) => image.url), + ].filter((url): url is string => Boolean(url)); + return [...new Set(urls)]; +} + +export function jewelryCategories(categories: ApiCategory[]) { + const jewelryParent = categories.find((item) => item.slug === "gold-jewels-and-rhinestones"); + if (!jewelryParent) { + return categories.filter((item) => item.parentId && item.isActive !== false); + } + return categories + .filter((item) => item.parentId === jewelryParent.id && item.isActive !== false) + .sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0)); +} diff --git a/src/lib/categories.ts b/src/lib/categories.ts new file mode 100644 index 0000000..43aaae2 --- /dev/null +++ b/src/lib/categories.ts @@ -0,0 +1,10 @@ +export type CategoryFrame = { fa: string; en: string }; + +export const featuredCategories: CategoryFrame[] = [ + { fa: "انگشتر", en: "Ring" }, + { fa: "گوشواره", en: "Earring" }, + { fa: "گردنبند", en: "Necklace" }, + { fa: "دستبند", en: "Bracelet" }, + { fa: "ساعت", en: "Watch" }, + { fa: "زنجیر", en: "Chain" }, +]; diff --git a/src/lib/categoryTree.ts b/src/lib/categoryTree.ts new file mode 100644 index 0000000..3632d99 --- /dev/null +++ b/src/lib/categoryTree.ts @@ -0,0 +1,70 @@ +import type { ApiCategory } from "@/lib/types"; +import { categoryHref } from "@/lib/slug"; + +export type MenuCategory = { + id: string; + name: string; + nameFa: string; + href: string; + children: MenuCategory[]; +}; + +function sortCats(items: ApiCategory[]) { + return [...items].sort((a, b) => (a.sortOrder ?? 0) - (b.sortOrder ?? 0)); +} + +function toMenu(category: ApiCategory, children: MenuCategory[]): MenuCategory { + return { + id: category.id, + name: category.name, + nameFa: category.nameFa || category.name, + href: categoryHref(category.id, category.nameFa, category.name), + children, + }; +} + +/** Build a parent→children tree from the flat categories list. */ +export function buildCategoryTree(categories: ApiCategory[]): MenuCategory[] { + const active = categories.filter((item) => item.isActive !== false); + const byParent = new Map