Update carousels, card hover, and IranBay branding.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-10-04 13:21:51 +03:30
co-authored by Cursor
commit 42aff5aee9
162 changed files with 16828 additions and 0 deletions
+229
View File
@@ -0,0 +1,229 @@
import { featuredProducers } from "@/data/home";
import { defaultBlogPosts, defaultPortfolios } from "@/data/details";
export type BusinessTabId =
| "products"
| "contact"
| "blog"
| "gallery"
| "portfolios";
export type BusinessDetail = {
slug: string;
name: string;
tagline: string;
breadcrumbs: string[];
hero: string;
logo: string;
since: string;
province: string;
activeProducts: string;
telephone: string;
description: string;
productCategories: string[];
products: {
id: string;
title: string;
image: string;
rating: string;
minOrder: string;
shipsIn: string;
category: string;
}[];
contact: {
address: string;
landlines: string[];
socials: { network: string; handle: string; icon: string }[];
map: string;
};
blogCategories: string[];
posts: {
id: string;
slug: string;
title: string;
excerpt: string;
image: string;
date: string;
author: string;
}[];
gallery: { id: string; image: string; tall?: boolean; medium?: boolean }[];
portfolioCategories: string[];
portfolios: {
id: string;
slug: string;
title: string;
description: string;
image: string;
}[];
};
export const businessTabs: { id: BusinessTabId; label: string }[] = [
{ id: "products", label: "Products" },
{ id: "contact", label: "Contact info" },
{ id: "blog", label: "blog" },
{ id: "gallery", label: "gallery" },
{ id: "portfolios", label: "Portfolios" },
];
const productImage = "/images/business/product-necklace.png";
const productAlt = "/images/business/product-alt.png";
const productRing = "/images/business/product-ring.png";
const galleryImage = "/images/business/gallery.jpg";
const blogImage = "/images/business/blog.jpg";
export const businesses: BusinessDetail[] = [
{
slug: "ayoubi-gallery",
name: "ayoubi gallery",
tagline: "we produce bread materials",
breadcrumbs: ["producers", "industry", "Food", "processed"],
hero: "/images/business/hero.jpg",
logo: "/images/business/logo.png",
since: "2018",
province: "Tehran",
activeProducts: "121",
telephone: "+9821-31634",
description:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
productCategories: ["All", "Neckleses", "Earrings", "Bracelet"],
products: Array.from({ length: 6 }, (_, i) => ({
id: `p-${i + 1}`,
title: "Gold scarlet necklace",
image: [productImage, productAlt, productRing][i % 3],
rating: "4.3",
minOrder: "3",
shipsIn: "7",
category: ["Neckleses", "Earrings", "Bracelet"][i % 3],
})),
contact: {
address: "Tehran, Jordan St., beside Sina Bank, number 27",
landlines: ["+98 212243248", "+98 212243249"],
socials: [
{
network: "instagram",
handle: "ayoubi.jewelery",
icon: "/images/icons/instagram.png",
},
{
network: "Telegram",
handle: "ayoubi.jewelery",
icon: "/images/icons/telegram.png",
},
{
network: "Facebook",
handle: "ayoubi.jewelery",
icon: "/images/icons/facebook.png",
},
{
network: "Whatsapp",
handle: "ayoubi.jewelery",
icon: "/images/icons/telegram.png",
},
],
map: "/images/business/map.png",
},
blogCategories: ["All", "Neckleses", "Earrings", "Bracelet"],
posts: Array.from({ length: 6 }, (_, i) => ({
id: `b-${i + 1}`,
slug: i === 0 ? "gold-scarlet-necklace" : `gold-scarlet-necklace-${i + 1}`,
title: "Gold scarlet necklace",
excerpt:
"we will show your business to verity of visitor around the world.we will show your business to verity of visitor around the world.we will show your business to verity of visitor around the world.",
image: "/images/blog/thumb.jpg",
date: "September 11",
author: "Mohammadi",
})),
gallery: [
{ id: "g1", image: galleryImage, tall: true },
{ id: "g2", image: productAlt },
{ id: "g3", image: blogImage, medium: true },
{ id: "g4", image: productImage },
{ id: "g5", image: "/images/producers/cover-jewelry.png", tall: true },
{ id: "g6", image: productRing, tall: true },
{ id: "g7", image: galleryImage },
],
portfolioCategories: ["All", "Ring", "Earrings", "Bracelet"],
portfolios: [
{
id: "pf1",
slug: "gold-scarlet-necklace",
title: "Gold scarlet necklace",
description: "we will show your business to verity of visitor ",
image: "/images/portfolio/main.jpg",
},
{
id: "pf2",
slug: "gold-scarlet-necklace-2",
title: "Gold scarlet necklace",
description: "we will show your business to verity of visitor ",
image: "/images/business/portfolio-1.jpg",
},
{
id: "pf3",
slug: "gold-scarlet-necklace-3",
title: "Gold scarlet necklace",
description: "we will show your business to verity of visitor ",
image: "/images/business/portfolio-3.jpg",
},
],
},
];
function fromProducer(slug: string): BusinessDetail | undefined {
const producer = featuredProducers.find((p) => p.slug === slug);
if (!producer) return undefined;
const base = businesses[0];
return {
...base,
slug: producer.slug,
name: producer.name,
tagline: producer.tagline,
logo: producer.logo,
activeProducts: producer.products,
since: producer.since,
};
}
export function getBusinessBySlug(slug: string) {
return businesses.find((b) => b.slug === slug) ?? fromProducer(slug);
}
export function getAllBusinessSlugs() {
const detailSlugs = businesses.map((b) => b.slug);
const producerSlugs = featuredProducers.map((p) => p.slug);
return [...new Set([...detailSlugs, ...producerSlugs])];
}
export function getBusinessBlogPost(businessSlug: string, postSlug: string) {
const business = getBusinessBySlug(businessSlug);
if (!business) return null;
const list = defaultBlogPosts.map((post, i) => ({
...post,
image: business.posts[i]?.image ?? post.image,
slug: business.posts[i]?.slug ?? post.slug,
}));
const post = list.find((p) => p.slug === postSlug);
if (!post) return null;
const related = list.filter((p) => p.slug !== post.slug).slice(0, 4);
return { business, post: { ...post, hero: "/images/blog/hero.jpg" }, related };
}
export function getBusinessPortfolio(businessSlug: string, portfolioSlug: string) {
const business = getBusinessBySlug(businessSlug);
if (!business) return null;
const list = defaultPortfolios.map((item, i) => ({
...item,
slug: business.portfolios[i]?.slug ?? item.slug,
image: business.portfolios[i]?.image ?? item.image,
images:
i === 0
? item.images
: [
business.portfolios[i]?.image ?? item.image,
...item.images.slice(1),
],
}));
const portfolio = list.find((p) => p.slug === portfolioSlug);
if (!portfolio) return null;
return { business, portfolio };
}
+116
View File
@@ -0,0 +1,116 @@
export type BlogPost = {
slug: string;
title: string;
excerpt: string;
image: string;
date: string;
author: string;
category: string;
intro: string;
body: { type: "p" | "quote" | "rich"; text: string; linkText?: string; linkHref?: string; afterLink?: string }[];
};
export type PortfolioItem = {
slug: string;
title: string;
description: string;
image: string;
images: string[];
date: string;
author: string;
category: string;
body: { type: "p" | "quote" | "rich"; text: string; linkText?: string; linkHref?: string; afterLink?: string }[];
};
export const blogDetailBody: BlogPost["body"] = [
{
type: "p",
text: "Lorem ipsum, or lipsum as it is sometimes known, is dummy text used in laying out print, graphic or web designs. The passage is attributed to an unknown typesetter in the 15th century who is thought to have scrambled parts of Cicero's De Finibus Bonorum et Malorum for use in a type specimen book. It usually begins with:",
},
{
type: "quote",
text: "“Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.”",
},
{
type: "rich",
text: "The purpose of lorem ipsum is to create a natural looking block of text (sentence, paragraph, page, etc.) that doesn't distract from the layout. A practice not without ",
linkText: "controversy",
linkHref: "https://loremipsum.io/#controversy",
afterLink:
", laying out pages with meaningless filler text can be very useful when the focus is meant to be on design, not content.",
},
{
type: "rich",
text: "The passage experienced a surge in popularity during the 1960s when Letraset used it on their dry-transfer sheets, and again during the 90s as desktop publishers bundled the text with their software. Today it's seen all around the web; on templates, websites, and stock designs. Use our ",
linkText: "generator",
linkHref: "https://loremipsum.io/#generator",
afterLink: " to get your own, or read on for the authoritative history of lorem ipsum.",
},
];
export const portfolioDetailBody: PortfolioItem["body"] = blogDetailBody;
export const defaultBlogPosts: BlogPost[] = Array.from({ length: 6 }, (_, i) => ({
slug: i === 0 ? "gold-scarlet-necklace" : `gold-scarlet-necklace-${i + 1}`,
title: "Gold scarlet necklace",
excerpt:
"we will show your business to verity of visitor around the world.we will show your business to verity of visitor around the world.we will show your business to verity of visitor around the world.",
image: "/images/blog/thumb.jpg",
date: "September 11",
author: "Mohammadi",
category: "Bracelet",
intro:
"we will show your business to verity of visitor around the world.we will show your business to verity of visitor around the world.we will show your business to verity of visitor around the world.",
body: blogDetailBody,
}));
export const defaultPortfolios: PortfolioItem[] = [
{
slug: "gold-scarlet-necklace",
title: "Gold scarlet necklace",
description: "we will show your business to verity of visitor around the world.we",
image: "/images/portfolio/main.jpg",
images: [
"/images/portfolio/main.jpg",
"/images/portfolio/thumb-1.jpg",
"/images/portfolio/thumb-2.jpg",
"/images/portfolio/thumb-3.jpg",
],
date: "September 11",
author: "Mohammadi",
category: "Bracelet",
body: portfolioDetailBody,
},
{
slug: "gold-scarlet-necklace-2",
title: "Gold scarlet necklace",
description: "we will show your business to verity of visitor ",
image: "/images/business/portfolio-1.jpg",
images: [
"/images/business/portfolio-1.jpg",
"/images/portfolio/thumb-1.jpg",
"/images/portfolio/thumb-2.jpg",
"/images/portfolio/thumb-3.jpg",
],
date: "September 11",
author: "Mohammadi",
category: "Bracelet",
body: portfolioDetailBody,
},
{
slug: "gold-scarlet-necklace-3",
title: "Gold scarlet necklace",
description: "we will show your business to verity of visitor ",
image: "/images/business/portfolio-3.jpg",
images: [
"/images/business/portfolio-3.jpg",
"/images/portfolio/thumb-1.jpg",
"/images/portfolio/thumb-2.jpg",
"/images/portfolio/thumb-3.jpg",
],
date: "September 11",
author: "Mohammadi",
category: "Bracelet",
body: portfolioDetailBody,
},
];
+292
View File
@@ -0,0 +1,292 @@
export const navLinks = [
{ href: "/businesses", label: "Categories", hasMenu: true },
{ href: "/#vision", label: "vision" },
{ href: "/about", label: "about us" },
{ href: "/contact", label: "contact us" },
] as const;
export type MegaLink = { label: string; href: string };
export type MegaGroup = {
title: string;
links: MegaLink[];
};
export type MegaTab = {
id: string;
label: string;
icon: string;
groups: MegaGroup[];
featured: {
title: string;
image: string;
imageClass?: string;
};
};
const placeholders = (count: number): MegaLink[] =>
Array.from({ length: count }, () => ({
label: "Subcategory 1",
href: "/businesses",
}));
export const megaMenuTabs: MegaTab[] = [
{
id: "industry",
label: "Industry",
icon: "/images/icons/gear.svg",
groups: [
{
title: "Materials",
links: [
{ label: "Metals", href: "/businesses" },
{ label: "Plastics", href: "/businesses" },
{ label: "Chemicals", href: "/businesses" },
],
},
{
title: "Category",
links: placeholders(5),
},
{
title: "Category",
links: placeholders(6),
},
{
title: "Category",
links: placeholders(5),
},
],
featured: {
title: "Iranian industry",
image: "/images/categories/industry.png",
imageClass: "drum",
},
},
{
id: "stores",
label: "Stores",
icon: "/images/icons/cart.svg",
groups: [
{
title: "Wearables",
links: [
{ label: "Clothes", href: "/businesses" },
{ label: "Shoes", href: "/businesses" },
{ label: "Accessories", href: "/businesses" },
],
},
{
title: "Category",
links: placeholders(5),
},
{
title: "Category",
links: placeholders(6),
},
{
title: "Category",
links: placeholders(5),
},
],
featured: {
title: "Persian unique style",
image: "/images/categories/clothes.png",
imageClass: "dress",
},
},
{
id: "wholesellers",
label: "Whole sellers",
icon: "/images/icons/gear.svg",
groups: [
{
title: "Apparel",
links: [
{ label: "Clothes", href: "/businesses" },
{ label: "Shoes", href: "/businesses" },
{ label: "Textiles", href: "/businesses" },
],
},
{
title: "Category",
links: placeholders(5),
},
{
title: "Category",
links: placeholders(6),
},
{
title: "Category",
links: placeholders(5),
},
],
featured: {
title: "Wholesale market",
image: "/images/categories/shoes.png",
imageClass: "shoes",
},
},
{
id: "services",
label: "Services",
icon: "/images/icons/home-outline.svg",
groups: [
{
title: "Business",
links: [
{ label: "Logistics", href: "#services" },
{ label: "Consulting", href: "#services" },
{ label: "Support", href: "#services" },
],
},
{
title: "Category",
links: placeholders(5),
},
{
title: "Category",
links: placeholders(6),
},
{
title: "Category",
links: placeholders(5),
},
],
featured: {
title: "Professional services",
image: "/images/categories/services.png",
imageClass: "notebook",
},
},
];
export const featuredCategories = [
{
title: "industry",
description: "Some description about the title",
image: "/images/categories/industry.png",
imageClass: "industry",
},
{
title: "Food",
description: "Some description about the title",
image: "/images/categories/food.png",
imageClass: "food",
},
{
title: "Fruits",
description: "Some description about the title",
image: "/images/categories/fruits.png",
imageClass: "fruits",
},
{
title: "Clothes",
description: "Some description about the title",
image: "/images/categories/clothes.png",
imageClass: "clothes",
},
{
title: "Home Furniture",
description: "Some description about the title",
image: "/images/categories/chair.png",
imageClass: "chair",
},
{
title: "Shoes",
description: "Some description about the title",
image: "/images/categories/shoes.png",
imageClass: "shoes",
},
{
title: "Home appliances",
description: "Some description about the title",
image: "/images/categories/washer.png",
imageClass: "washer",
},
{
title: "Services",
description: "Some description about the title",
image: "/images/categories/services.png",
imageClass: "services",
},
];
export type Producer = {
slug: string;
name: string;
tagline: string;
products: string;
since: string;
description: string;
typeIcon: "cart" | "gear";
typeLabel: string;
category: string;
cover: string;
logo: string;
logoClass?: string;
};
export const featuredProducers: Producer[] = [
{
slug: "sani-khani",
name: "sani khani",
tagline: "Lorem Ipsum",
products: "921",
since: "2021",
description: "we will show your business to verity of visitor around the world.",
typeIcon: "cart",
typeLabel: "Store",
category: "Home Appliances",
cover: "/images/producers/cover-laundry.png",
logo: "/images/producers/logo-sani.png",
logoClass: "wide",
},
{
slug: "arad-charta",
name: "Arad charta",
tagline: "we produce bread materials",
products: "3",
since: "2021",
description: "we will show your business to verity of visitor around the world.",
typeIcon: "gear",
typeLabel: "Industry",
category: "Food",
cover: "/images/producers/cover-bakery.png",
logo: "/images/producers/logo-arad.png",
},
{
slug: "simode",
name: "Simode",
tagline: "Clothes whole seller",
products: "121",
since: "2021",
description: "we will show your business to verity of visitor around the world.",
typeIcon: "gear",
typeLabel: "Whole Seller",
category: "Clothes",
cover: "/images/producers/cover-clothes.png",
logo: "/images/producers/logo-simode.png",
logoClass: "round",
},
{
slug: "ayoubi-gallery",
name: "ayoubi gallery",
tagline: "An elegant jewellery store",
products: "121",
since: "2021",
description: "we will show your business to verity of visitor around the world.",
typeIcon: "gear",
typeLabel: "Store",
category: "Jewellery",
cover: "/images/producers/cover-jewelry.png",
logo: "/images/producers/logo-ayoubi.png",
logoClass: "square",
},
];
export const aboutBullets = [
"Excepteur sint occaecat cupidatat non proident",
"veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo con",
"Excepteur sint occaecat cupidatat non proident",
];
+97
View File
@@ -0,0 +1,97 @@
export const aboutCopy = {
kicker: "About Us",
title: ["IranBay", "A Get To Iran", "Market."],
paragraphs: [
"n publishing and graphic design, Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on meaningful content. Lorem ipsum may be used as a placeholder before final copy is available",
"n publishing and graphic design, Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on meaningful content. Lorem ipsum may be used as a placeholder before final copy is available",
],
};
export const clients = [
{ name: "Apple", image: "/images/about/clients/apple.png" },
{ name: "Audi", image: "/images/about/clients/audi.png" },
{ name: "Tesla", image: "/images/about/clients/tesla.png" },
{ name: "Mercedes", image: "/images/about/clients/mercedes.png" },
{ name: "BMW", image: "/images/about/clients/bmw.png" },
];
export const testimonials = [
{
body: "n publishing and graphic design, Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on meaningful content. Lorem ipsum may be used as a placeholder before final copy is available",
meta: "Alimohammadi | 21:31 | Sepember | 2023.20.16",
},
{
body: "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
meta: "Sara Ahmadi | 14:05 | October | 2024.02.11",
},
{
body: "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt.",
meta: "Reza Karimi | 09:42 | January | 2025.01.08",
},
];
/** @deprecated use testimonials */
export const testimonial = testimonials[0];
export const services = [
{
title: "Support",
subtitle: "24 hour support",
image: "/images/about/support.png",
tone: "support",
},
{
title: "Register",
subtitle: "Quick store registration",
image: "/images/about/register.png",
tone: "register",
},
{
title: "Responsive",
subtitle: "Responsive in all sizes",
image: "/images/about/responsive.png",
tone: "responsive",
},
] as const;
export const contactInfo = {
email: "Alimohammadi@gmail.com",
phones: ["+98 937 622 0110", "+98 912 123 4567"],
addressLines: [
"Sheikh Mohammed bin Rashid Blvd",
"Downtown Dubai - Dubai - United Arab Emirates",
],
};
export const faqs = [
{
question: "In publishing and graphic design?",
answer:
"Lorem ipsum is a placeholder text commonly used to demonstrate the visual form of a document or a typeface without relying on meaningful content.",
},
{
question: "In publishing and graphic?",
answer:
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
},
{
question: "In publishing ?",
answer:
"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
},
{
question: "In publishing and graphic design ?",
answer:
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.",
},
];
export const businessFilters = [
{ label: "Looking for...", value: "Arad Charta" },
{ label: "Province", value: "Tehran" },
{ label: "City", value: "Factory" },
];
export const activeFilterTags = ["Arad Charta", "Tehran"];
export const breadcrumbs = ["producers", "industry", "Food", "processed"];