From 3af4e04bdd485eee2d01b80447a3dc6bffd10ef0 Mon Sep 17 00:00:00 2001 From: "amirhosein.ashourloo" Date: Wed, 23 Sep 2026 13:43:18 +0330 Subject: [PATCH] feat: refine storefront product and sale sections --- CONTEXT.md | 12 +- public/images/logo.png | Bin 4967 -> 22393 bytes src/app/layout.tsx | 2 +- src/app/page.tsx | 8 +- src/components/home/AboutSanihome.tsx | 24 ++-- src/components/home/AboutSlotImage.tsx | 42 ++++++ src/components/home/Footer.tsx | 6 +- src/components/home/Header.tsx | 6 +- src/components/home/SpecialSaleCountdown.tsx | 50 ++++++++ src/components/home/StoreSpecialCarousels.tsx | 121 ++++++++++++++---- src/components/ui/Carousel.tsx | 24 +++- src/components/ui/ProductCard.tsx | 80 ++---------- src/lib/meshkee.ts | 10 ++ 13 files changed, 263 insertions(+), 122 deletions(-) create mode 100644 src/components/home/AboutSlotImage.tsx create mode 100644 src/components/home/SpecialSaleCountdown.tsx diff --git a/CONTEXT.md b/CONTEXT.md index 4de95c3..b6dfcac 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -210,13 +210,23 @@ catalog data. `STATIC_IMAGE_SLOT_CATALOG` in `meshkee.ts` is the source of truth for which slots exist; publishing it via `src/app/meshkee/static-image-slots/route.ts` (`/meshkee/static-image-slots`) is how the admin dashboard's "refresh" imports new keys. Current keys: -`home-hero`, `two-banner`, `three-banner-row`, `featured-categories`. Adding +`home-hero`, `two-banner`, `three-banner-row`, `featured-categories`, +`about-us-image`. `about-us-image` is a homepage `single` slot with a `14:9` +ratio (the original 560×360 frame). `AboutSanihome` uses its first image, +prefers `titleFa`, then `titleEn`, then `subtext` for alt text, wraps the image +with `linkUrl` when present, and preserves `/images/about.svg` as the empty/error +fallback. Adding a slot here does **not** make images appear — someone still has to upload them in the dashboard; the code path just needs to fall back to whatever the "current" behavior was before the slot existed when it's empty (see `FeaturedCategories.tsx` for the pattern: real slot images when present, else the pre-existing UI unchanged). +**Static-image sizing rule:** whenever a slot's rendered image dimensions or +aspect ratio change during development, update the matching +`STATIC_IMAGE_SLOT_CATALOG` entry (`aspectRatio` and `recommendedWidth`) in the +same change so `/meshkee/static-image-slots` stays accurate for the dashboard. + ## Homepage product carousels — fully dynamic, don't hardcode a name/key `GET /tenants/{domain}/store-specials` returns **every** admin-managed named diff --git a/public/images/logo.png b/public/images/logo.png index 028bd260e053455a9efb63ba1fe8e4f98d3affea..7e4ecdc5080cf961859546bc767ed7207d88df68 100644 GIT binary patch literal 22393 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 literal 4967 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 diff --git a/src/app/layout.tsx b/src/app/layout.tsx index d56df75..9fba2c4 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -30,7 +30,7 @@ const syne = Syne({ export async function generateMetadata(): Promise { const businessInfo = await getBusinessInfo(); return { - title: "سانی‌هوم | فروشگاه لوازم خانگی", + title: "صنیع هوم | فروشگاه لوازم خانگی", description: "فروشگاه آنلاین لوازم خانگی — یخچال، لباسشویی، تلویزیون و بیشتر", icons: businessInfo?.faviconUrl ? [{ url: businessInfo.faviconUrl }] : undefined, }; diff --git a/src/app/page.tsx b/src/app/page.tsx index fd31add..041a3b3 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -10,6 +10,7 @@ import { getCategories, getStoreSpecials, getStaticImageSlots, + firstImageForSlot, imagesForSlot, STATIC_IMAGE_KEYS, } from "@/lib/meshkee"; @@ -44,7 +45,12 @@ export default async function Home() { threeBannerAspectRatio={threeBannerSlot?.aspectRatio} /> - + slot.key === STATIC_IMAGE_KEYS.aboutUsImage, + )?.aspectRatio} + /> ); diff --git a/src/components/home/AboutSanihome.tsx b/src/components/home/AboutSanihome.tsx index c252ff5..0150421 100644 --- a/src/components/home/AboutSanihome.tsx +++ b/src/components/home/AboutSanihome.tsx @@ -1,6 +1,13 @@ -import { Placeholder } from "@/components/ui/Placeholder"; +import { AboutSlotImage } from "@/components/home/AboutSlotImage"; +import type { StaticImageWithUrl } from "@/lib/meshkee"; -export function AboutSanihome() { +export function AboutSanihome({ + image, + aspectRatio, +}: { + image?: StaticImageWithUrl; + aspectRatio?: string; +}) { return (
@@ -8,7 +15,7 @@ export function AboutSanihome() {

- درباره سانی‌هوم + درباره صنیع هوم

- سانی‌هوم از سال ۱۳۹۰ به عنوان یکی از معتبرترین فروشگاه‌های آنلاین لوازم + صنیع هوم از سال ۱۳۹۰ به عنوان یکی از معتبرترین فروشگاه‌های آنلاین لوازم خانگی در ایران فعالیت می‌کند. ما با ارائه محصولات اصل از برندهای معتبر جهانی، گارانتی رسمی و خدمات پس از فروش، تجربه‌ای مطمئن برای خرید لوازم خانگی فراهم کرده‌ایم. @@ -43,14 +50,7 @@ export function AboutSanihome() { ))}

- +
diff --git a/src/components/home/AboutSlotImage.tsx b/src/components/home/AboutSlotImage.tsx new file mode 100644 index 0000000..0d16e0b --- /dev/null +++ b/src/components/home/AboutSlotImage.tsx @@ -0,0 +1,42 @@ +"use client"; + +import { useState } from "react"; +import { Placeholder } from "@/components/ui/Placeholder"; +import type { StaticImageWithUrl } from "@/lib/meshkee"; + +export function AboutSlotImage({ + image, + aspectRatio, +}: { + image?: StaticImageWithUrl; + aspectRatio?: string; +}) { + const [failed, setFailed] = useState(false); + + if (!image || failed) { + return ( + + ); + } + + const frame = ( + // Meshkee slot URLs are rendered as-is; a failed remote image falls back locally. + // eslint-disable-next-line @next/next/no-img-element + {image.titleFa setFailed(true)} + style={{ aspectRatio: (aspectRatio ?? "14:9").replace(":", " / ") }} + className="h-auto w-full rounded-2xl object-cover" + /> + ); + + return image.linkUrl ? {frame} : frame; +} diff --git a/src/components/home/Footer.tsx b/src/components/home/Footer.tsx index d4ed3fe..f3af195 100644 --- a/src/components/home/Footer.tsx +++ b/src/components/home/Footer.tsx @@ -28,7 +28,7 @@ export function Footer({ return (