This commit is contained in:
Hamed
2026-08-02 13:05:28 +04:00
parent 574a18712d
commit 34f96d3830
24 changed files with 1169 additions and 1013 deletions
+32 -2
View File
@@ -4,8 +4,21 @@
<list default="true" id="bb7b50a5-be9c-4cd7-a05b-979f0e91b173" name="Changes" comment="update">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/app/globals.css" beforeDir="false" afterPath="$PROJECT_DIR$/app/globals.css" afterDir="false" />
<change beforePath="$PROJECT_DIR$/components/Header.jsx" beforeDir="false" afterPath="$PROJECT_DIR$/components/Header.jsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/components/HeroSection.jsx" beforeDir="false" afterPath="$PROJECT_DIR$/components/HeroSection.jsx" afterDir="false" />
<change beforePath="$PROJECT_DIR$/data/content.js" beforeDir="false" afterPath="$PROJECT_DIR$/data/content.js" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/video/showcase-placeholder.mp4" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/jsconfig.json" beforeDir="false" afterPath="$PROJECT_DIR$/jsconfig.json" afterDir="false" />
<change beforePath="$PROJECT_DIR$/public/images/logo.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/images/machine-35-base.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/images/machine-35-white.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/images/machine-48-base.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/images/machine-48-white.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/images/machine-60-base.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/images/machine-60-white.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/images/snacks/chips-1.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/images/snacks/chips-2.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/images/snacks/soda-1.svg" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/public/images/snacks/soda-2.svg" beforeDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -86,6 +99,7 @@
<workItem from="1785583486761" duration="9000" />
<workItem from="1785583517424" duration="145000" />
<workItem from="1785645096071" duration="26000" />
<workItem from="1785646314677" duration="10534000" />
</task>
<task id="LOCAL-00001" summary="update">
<option name="closed" value="true" />
@@ -111,7 +125,23 @@
<option name="project" value="LOCAL" />
<updated>1785582935941</updated>
</task>
<option name="localTasksCounter" value="4" />
<task id="LOCAL-00004" summary="update">
<option name="closed" value="true" />
<created>1785646368102</created>
<option name="number" value="00004" />
<option name="presentableId" value="LOCAL-00004" />
<option name="project" value="LOCAL" />
<updated>1785646368102</updated>
</task>
<task id="LOCAL-00005" summary="update">
<option name="closed" value="true" />
<created>1785646373594</created>
<option name="number" value="00005" />
<option name="presentableId" value="LOCAL-00005" />
<option name="project" value="LOCAL" />
<updated>1785646373594</updated>
</task>
<option name="localTasksCounter" value="6" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
+64 -19
View File
@@ -56,9 +56,11 @@ html[dir='rtl'] body {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: var(--color-scrollbar-track);
}
::-webkit-scrollbar-thumb {
background: var(--color-scrollbar-thumb);
border-radius: 999px;
@@ -66,21 +68,55 @@ html[dir='rtl'] body {
/* Semantic surface/text utilities — read the theme variables above so every
component that uses them automatically supports dark + light mode. */
.bg-page { background-color: var(--color-bg-page); }
.bg-elevated { background-color: var(--color-bg-elevated); }
.bg-surface { background-color: var(--color-bg-surface); }
.bg-surface-strong { background-color: var(--color-bg-surface-strong); }
.border-subtle { border-color: var(--color-border); }
.text-primary { color: var(--color-text-primary); }
.text-secondary { color: var(--color-text-secondary); }
.bg-page {
background-color: var(--color-bg-page);
}
.bg-elevated {
background-color: var(--color-bg-elevated);
}
.bg-surface {
background-color: var(--color-bg-surface);
}
.bg-surface-strong {
background-color: var(--color-bg-surface-strong);
}
.border-subtle {
border-color: var(--color-border);
}
.text-primary {
color: var(--color-text-primary);
}
.text-secondary {
color: var(--color-text-secondary);
}
/* Opacity variants of the tokens above (Tailwind's /NN modifier only works on
Tailwind-generated utilities, not these hand-written classes). */
.bg-page-60 { background-color: color-mix(in srgb, var(--color-bg-page) 60%, transparent); }
.bg-page-70 { background-color: color-mix(in srgb, var(--color-bg-page) 70%, transparent); }
.bg-page-85 { background-color: color-mix(in srgb, var(--color-bg-page) 85%, transparent); }
.bg-elevated-95 { background-color: color-mix(in srgb, var(--color-bg-elevated) 95%, transparent); }
.text-primary-90 { color: color-mix(in srgb, var(--color-text-primary) 90%, transparent); }
.bg-page-60 {
background-color: color-mix(in srgb, var(--color-bg-page) 60%, transparent);
}
.bg-page-70 {
background-color: color-mix(in srgb, var(--color-bg-page) 70%, transparent);
}
.bg-page-85 {
background-color: color-mix(in srgb, var(--color-bg-page) 85%, transparent);
}
.bg-elevated-95 {
background-color: color-mix(in srgb, var(--color-bg-elevated) 95%, transparent);
}
.text-primary-90 {
color: color-mix(in srgb, var(--color-text-primary) 90%, transparent);
}
/* ------------------------------------------------------------------ */
/* Horizontal scroll showcase (pinned via GSAP ScrollTrigger) */
@@ -88,7 +124,7 @@ html[dir='rtl'] body {
.horizontal-track {
display: flex;
height: 100vh;
width: max-content;
width: 100vw;
will-change: transform;
}
@@ -133,8 +169,7 @@ html[dir='rtl'] body {
height: 190px;
border-radius: 999px;
border: 2px solid rgba(0, 166, 147, 0.9);
box-shadow:
0 0 0 4px rgba(0, 166, 147, 0.15),
box-shadow: 0 0 0 4px rgba(0, 166, 147, 0.15),
0 0 40px 6px rgba(0, 166, 147, 0.45);
pointer-events: none;
transform: translate(-50%, -50%);
@@ -151,6 +186,7 @@ html[dir='rtl'] body {
.no-scrollbar::-webkit-scrollbar {
display: none;
}
.no-scrollbar {
-ms-overflow-style: none;
scrollbar-width: none;
@@ -176,16 +212,25 @@ html[dir='rtl'] body {
}
@keyframes caretBlink {
0%, 49% { opacity: 1; }
50%, 100% { opacity: 0; }
0%, 49% {
opacity: 1;
}
50%, 100% {
opacity: 0;
}
}
/* ------------------------------------------------------------------ */
/* نوار لوگوی بی‌پایان (trusted-by marquee) */
/* ------------------------------------------------------------------ */
@keyframes marqueeScroll {
from { transform: translateX(0); }
to { transform: translateX(-50%); } /* دقیقاً نصف عرض، چون لیست دو برابر شده */
from {
transform: translateX(0);
}
to {
transform: translateX(-50%);
}
/* دقیقاً نصف عرض، چون لیست دو برابر شده */
}
.animate-marquee {
+29 -28
View File
@@ -2,32 +2,32 @@
// هدر ثابت بالای صفحه: لوگو، منوی ناوبری، سوییچ زبان/تم، دکمه ورود به پنل کاربری و آیکون سبد خرید.
import { useState, useEffect } from 'react';
import {useState, useEffect} from 'react';
import Image from 'next/image';
import { Badge, Button } from 'antd';
import { ShoppingCartOutlined, MenuOutlined, CloseOutlined, UserOutlined } from '@ant-design/icons';
import { useSelector, useDispatch } from 'react-redux';
import { selectCartCount, openDrawer } from '@/store/cartSlice';
import { useLanguage } from '@/app/context/LanguageContext';
import {Badge, Button} from 'antd';
import {ShoppingCartOutlined, MenuOutlined, CloseOutlined, UserOutlined} from '@ant-design/icons';
import {useSelector, useDispatch} from 'react-redux';
import {selectCartCount, openDrawer} from '@/store/cartSlice';
import {useLanguage} from '@/app/context/LanguageContext';
import ThemeToggle from './ThemeToggle';
import LanguageToggle from './LanguageToggle';
export default function Header() {
const dispatch = useDispatch();
const cartCount = useSelector(selectCartCount);
const { t } = useLanguage();
const {t} = useLanguage();
const [scrolled, setScrolled] = useState(false);
const [mobileOpen, setMobileOpen] = useState(false);
const navLinks = [
{ href: '#hero', label: t.nav.home },
{ href: '#showcase', label: t.nav.showcase },
{ href: '#about', label: t.nav.about },
{ href: '#catalog', label: t.nav.catalog },
{ href: '#locations', label: t.nav.locations },
{ href: '#video', label: t.nav.video },
{ href: '#map', label: t.nav.map },
{ href: '#support', label: t.nav.support },
{href: '#hero', label: t.nav.home},
{href: '#showcase', label: t.nav.showcase},
{href: '#about', label: t.nav.about},
{href: '#catalog', label: t.nav.catalog},
{href: '#locations', label: t.nav.locations},
{href: '#video', label: t.nav.video},
{href: '#map', label: t.nav.map},
{href: '#support', label: t.nav.support},
];
useEffect(() => {
@@ -44,7 +44,7 @@ export default function Header() {
>
<div className="mx-auto max-w-7xl px-5 md:px-8 h-20 flex items-center justify-between gap-4">
<a href="#hero" className="flex items-center gap-2 shrink-0">
<Image src="/images/logo.svg" alt="روبات مارکت" width={150} height={42} priority />
<Image src="/images/logo.png" alt="روبات مارکت" width={150} height={42} priority/>
</a>
<nav className="hidden xl:flex items-center gap-5 2xl:gap-7">
@@ -61,16 +61,16 @@ export default function Header() {
<div className="flex items-center gap-2 md:gap-3">
<div className="hidden md:flex items-center gap-2">
<LanguageToggle />
<ThemeToggle />
<LanguageToggle/>
<ThemeToggle/>
</div>
<Button
className="hidden sm:inline-flex"
icon={<UserOutlined />}
onClick={() => {
/* TODO: point this at the real customer panel login route */
}}
icon={<UserOutlined/>}
href="https://panel.my-rm.com"
target="_blank"
rel="noopener noreferrer"
>
{t.nav.login}
</Button>
@@ -79,7 +79,7 @@ export default function Header() {
<Button
shape="circle"
size="large"
icon={<ShoppingCartOutlined />}
icon={<ShoppingCartOutlined/>}
onClick={() => dispatch(openDrawer())}
aria-label="cart"
/>
@@ -90,13 +90,14 @@ export default function Header() {
onClick={() => setMobileOpen((v) => !v)}
aria-label="menu"
>
{mobileOpen ? <CloseOutlined /> : <MenuOutlined />}
{mobileOpen ? <CloseOutlined/> : <MenuOutlined/>}
</button>
</div>
</div>
{mobileOpen && (
<nav className="xl:hidden bg-elevated-95 backdrop-blur-md border-t border-subtle px-5 py-4 flex flex-col gap-4 max-h-[calc(100vh-5rem)] overflow-y-auto">
<nav
className="xl:hidden bg-elevated-95 backdrop-blur-md border-t border-subtle px-5 py-4 flex flex-col gap-4 max-h-[calc(100vh-5rem)] overflow-y-auto">
{navLinks.map((link) => (
<a
key={link.href}
@@ -108,9 +109,9 @@ export default function Header() {
</a>
))}
<div className="flex items-center gap-3 pt-2 border-t border-subtle">
<LanguageToggle />
<ThemeToggle />
<Button icon={<UserOutlined />} className="flex-1">
<LanguageToggle/>
<ThemeToggle/>
<Button icon={<UserOutlined/>} className="flex-1">
{t.nav.login}
</Button>
</div>
+12 -12
View File
@@ -7,14 +7,14 @@
* عنوان بزرگ دو خطی، و دکمه‌های فلش قبلی/بعدی برای ناوبری دستی.
*/
import { useCallback, useEffect, useRef, useState } from 'react';
import { LeftOutlined, RightOutlined } from '@ant-design/icons';
import { useLanguage } from '@/app/context/LanguageContext';
import {useCallback, useEffect, useRef, useState} from 'react';
import {LeftOutlined, RightOutlined} from '@ant-design/icons';
import {useLanguage} from '@/app/context/LanguageContext';
const AUTOPLAY_DELAY = 5000; // هر ۵ ثانیه اسلاید عوض می‌شود
export default function HeroSection() {
const { t, dir } = useLanguage();
const {t, dir} = useLanguage();
const slides = t.hero.slides;
const [activeIndex, setActiveIndex] = useState(0);
const timerRef = useRef(null);
@@ -59,7 +59,6 @@ export default function HeroSection() {
<div
className="absolute inset-y-0 w-1/3 hidden md:block"
style={{
[dir === 'rtl' ? 'left' : 'right']: '-6%',
background: 'linear-gradient(135deg, #00a693 0%, #017065 60%, #0b3d38 100%)',
clipPath:
dir === 'rtl'
@@ -77,7 +76,7 @@ export default function HeroSection() {
<div
key={s.id}
className="absolute inset-0 flex items-center justify-center transition-opacity duration-1000 ease-in-out"
style={{ opacity: i === activeIndex ? 1 : 0, pointerEvents: i === activeIndex ? 'auto' : 'none' }}
style={{opacity: i === activeIndex ? 1 : 0, pointerEvents: i === activeIndex ? 'auto' : 'none'}}
aria-hidden={i !== activeIndex}
>
<img
@@ -101,19 +100,20 @@ export default function HeroSection() {
{/* ------------------------------------------------------------------ */}
{/* متن روی اسلاید: کیکر کوچک + عنوان بزرگ دو خطی + توضیح + دکمه CTA */}
{/* ------------------------------------------------------------------ */}
<div className="relative z-10 h-full flex flex-col justify-end md:justify-center px-6 md:px-16 pb-28 md:pb-0">
<div
className="relative z-10 h-full flex flex-col justify-end md:justify-center px-6 md:px-16 pb-28 md:pb-0">
<div className="max-w-2xl">
<span className="text-brand-400 font-semibold tracking-widest text-sm uppercase">
{slide.kicker}
</span>
<h1 className="mt-3 text-3xl sm:text-4xl md:text-6xl font-extrabold leading-tight text-primary">
<h1 className="mt-3 text-3xl sm:text-4xl md:text-6xl font-extrabold leading-tight text-white drop-shadow-[0_4px_12px_rgba(0,0,0,0.9)]">
{slide.titleLines.map((line, i) => (
<span key={i} className="block">
{line}
</span>
))}
</h1>
<p className="mt-5 text-secondary text-base md:text-lg max-w-xl">{slide.sub}</p>
<p className="mt-5 text-white/90 text-base md:text-lg max-w-xl drop-shadow-lg">{slide.sub}</p>
<a
href="#showcase"
className="mt-8 inline-flex items-center gap-2 bg-brand hover:bg-brand-400 text-ink-950 font-bold px-8 py-3.5 rounded-full transition-colors shadow-brandGlow"
@@ -124,21 +124,21 @@ export default function HeroSection() {
</div>
{/* ------------------------------------------------------------------ */}
{/* فلش‌های ناوبری دستی (قبلی / بعدی) — شبیه سایت Sielaff، وسط دو طرف */}
{/* فلش‌های ناوبری دستی (قبلی / بعدی) — وسط دو طرف */}
{/* ------------------------------------------------------------------ */}
<button
onClick={() => handleManualNav('prev')}
aria-label="previous slide"
className="hidden sm:flex absolute top-1/2 -translate-y-1/2 start-4 z-20 w-11 h-11 rounded-full bg-page-70 border border-subtle items-center justify-center text-primary hover:bg-brand hover:text-ink-950 transition-colors"
>
<LeftOutlined />
<LeftOutlined/>
</button>
<button
onClick={() => handleManualNav('next')}
aria-label="next slide"
className="hidden sm:flex absolute top-1/2 -translate-y-1/2 end-4 z-20 w-11 h-11 rounded-full bg-page-70 border border-subtle items-center justify-center text-primary hover:bg-brand hover:text-ink-950 transition-colors"
>
<RightOutlined />
<RightOutlined/>
</button>
{/* نقطه‌های شمارشگر اسلاید پایین صفحه — کلیک روی هرکدام مستقیم به همان اسلاید می‌رود */}
+56
View File
@@ -0,0 +1,56 @@
'use client';
/**
* سکشن «مشتریانی که به ما اعتماد کرده‌اند» — یک نوار لوگوی بی‌پایان (marquee)
* که به‌آرامی و پیوسته حرکت می‌کند. برای ساخت افکت حلقه‌ی بی‌پایان، لیست
* لوگوها را دو بار پشت‌سرهم رندر می‌کنیم و با انیمیشن CSS آن را جابه‌جا می‌کنیم.
*
* نکته فنی: مسیر (track) همیشه جهت LTR دارد، چون منطق «حرکت به چپ» انیمیشن
* فرض بر همین جهت است — دقیقاً همان مشکلی که در اسکرول افقی محصولات داشتیم و
* حلش کردیم. این‌جا هم برای جلوگیری از همان باگ، جهت را ثابت نگه داشتیم.
*/
import { useLanguage } from '@/app/context/LanguageContext';
export default function TrustedBySection() {
const { t } = useLanguage();
const clients = t.trustedBy.clients;
// لیست لوگوها را دو برابر می‌کنیم تا وقتی نیمه اول با انیمیشن رد شد،
// نیمه دوم دقیقاً از همان‌جا ادامه بدهد و چشم متوجه پرش/شکاف نشود.
const doubledClients = [...clients, ...clients];
return (
<section className="relative px-6 md:px-16 py-16 md:py-20 bg-page border-t border-subtle overflow-hidden">
<div className="max-w-6xl mx-auto">
<div className="text-center mb-10">
<span className="text-brand-400 text-sm font-semibold tracking-wide">{t.trustedBy.eyebrow}</span>
<h2 className="text-xl md:text-2xl font-extrabold text-primary mt-2">{t.trustedBy.title}</h2>
</div>
</div>
{/* یک محو تدریجی (fade mask) دو طرف نوار، تا لبه‌های لوگوها بریده به‌نظر نرسد */}
<div
className="relative"
style={{
maskImage: 'linear-gradient(90deg, transparent 0%, black 8%, black 92%, transparent 100%)',
WebkitMaskImage: 'linear-gradient(90deg, transparent 0%, black 8%, black 92%, transparent 100%)',
}}
>
<div className="flex w-max animate-marquee gap-10" dir="ltr">
{doubledClients.map((client, i) => (
<div
key={`${client.id}-${i}`}
className="w-40 md:w-48 shrink-0 flex items-center justify-center bg-surface border border-subtle rounded-xl p-4 opacity-80 hover:opacity-100 transition-opacity"
>
<img
src={`/images/clients/client-${((i % clients.length) + 1)}.svg`}
alt={client.name}
className="w-full h-auto"
/>
</div>
))}
</div>
</div>
</section>
);
}
+266 -85
View File
@@ -13,8 +13,8 @@ const machinesFa = [
priceNumeric: 3860000000,
description: 'یخچالدار، ۳۵ کانال اختصاصی، سیستم خنک‌کننده قدرتمند، تحویل نرم، مدیریت آنلاین ۲۴ ساعته.',
highlights: ['یخچالدار', '۳۵ کانال اختصاصی', 'تحویل نرم', 'مدیریت آنلاین ۲۴ ساعته'],
image: '/images/machine-35-base.svg',
imageAlt: '/images/machine-35-white.svg',
image: '/images/machine-35-base.png',
imageAlt: '/images/machine-35-white.png',
gif: '/gifs/machine-35.gif',
},
{
@@ -25,8 +25,8 @@ const machinesFa = [
priceNumeric: 4480000000,
description: 'یخچالدار، ۴۸ کانال اختصاصی، قابلیت‌های پیشرفته مدیریت آنلاین و تحویل کالا.',
highlights: ['یخچالدار', '۴۸ کانال اختصاصی', 'مدیریت آنلاین پیشرفته', 'تحویل هوشمند کالا'],
image: '/images/machine-48-base.svg',
imageAlt: '/images/machine-48-white.svg',
image: '/images/machine-48-base.png',
imageAlt: '/images/machine-48-white.png',
gif: '/gifs/machine-48.gif',
},
{
@@ -37,8 +37,8 @@ const machinesFa = [
priceNumeric: 4980000000,
description: 'یخچالدار، ۶۰ کانال اختصاصی برای کسب‌وکارهای پرتردد.',
highlights: ['یخچالدار', '۶۰ کانال اختصاصی', 'مناسب اماکن پرتردد', 'ظرفیت بالا'],
image: '/images/machine-60-base.svg',
imageAlt: '/images/machine-60-white.svg',
image: '/images/machine-60-base.png',
imageAlt: '/images/machine-60-white.png',
gif: '/gifs/machine-60.gif',
},
];
@@ -52,8 +52,8 @@ const machinesEn = [
priceNumeric: 3860000000,
description: 'Refrigerated, 35 dedicated channels, powerful cooling system, soft delivery, 24/7 online management.',
highlights: ['Refrigerated', '35 dedicated channels', 'Soft delivery', '24/7 online management'],
image: '/images/machine-35-base.svg',
imageAlt: '/images/machine-35-white.svg',
image: '/images/machine-35-base.png',
imageAlt: '/images/machine-35-white.png',
gif: '/gifs/machine-35.gif',
},
{
@@ -64,8 +64,8 @@ const machinesEn = [
priceNumeric: 4480000000,
description: 'Refrigerated, 48 dedicated channels, advanced online management and delivery capabilities.',
highlights: ['Refrigerated', '48 dedicated channels', 'Advanced online management', 'Smart delivery'],
image: '/images/machine-48-base.svg',
imageAlt: '/images/machine-48-white.svg',
image: '/images/machine-48-base.png',
imageAlt: '/images/machine-48-white.png',
gif: '/gifs/machine-48.gif',
},
{
@@ -76,8 +76,8 @@ const machinesEn = [
priceNumeric: 4980000000,
description: 'Refrigerated, 60 dedicated channels for high-traffic businesses.',
highlights: ['Refrigerated', '60 dedicated channels', 'Ideal for high-traffic venues', 'High capacity'],
image: '/images/machine-60-base.svg',
imageAlt: '/images/machine-60-white.svg',
image: '/images/machine-60-base.png',
imageAlt: '/images/machine-60-white.png',
gif: '/gifs/machine-60.gif',
},
];
@@ -106,29 +106,27 @@ export const content = {
hero: {
loading: 'در حال بارگذاری روبات مارکت…',
cta: 'مشاهده دستگاه‌ها',
// هر اسلاید یک تصویر دستگاه + یک عنوان دو خطی بزرگ (شبیه سایت Sielaff) دارد.
// برای افزودن اسلاید جدید، فقط یک آیتم دیگر به این آرایه اضافه کنید.
slides: [
{
id: 'slide-1',
kicker: 'روبات مارکت',
titleLines: ['فروش خودکار،', 'هوشمند و بی‌وقفه'],
sub: 'تجربه‌ای نوین از خرید آسان و سریع با دستگاه‌های وندینگ روبات مارکت.',
image: '/images/machine-35-base.svg',
image: '/images/machine-slide-0.png',
},
{
id: 'slide-2',
kicker: 'یخچالدار',
titleLines: ['خنک‌کننده قدرتمند،', 'کیفیت تضمینی'],
sub: 'نگهداری اصولی تنقلات و نوشیدنی سرد، ۲۴ ساعته و بدون نیاز به نیروی انسانی.',
image: '/images/machine-48-base.svg',
image: '/images/machine-slide-1.png',
},
{
id: 'slide-3',
kicker: 'مدیریت آنلاین',
titleLines: ['کنترل کامل کسب‌وکار', 'از راه دور'],
sub: 'مدیریت موجودی، فروش و گزارش‌گیری آنلاین، هر ساعت از شبانه‌روز.',
image: '/images/machine-60-base.svg',
image: '/images/machine-slide-2.png',
},
],
},
@@ -153,21 +151,40 @@ export const content = {
trustedBy: {
eyebrow: 'اعتماد شما، افتخار ماست',
title: 'کسب‌وکارهایی که به روبات مارکت اعتماد کرده‌اند',
// اسم‌های نمونه/فرضی هستند — با نام مشتریان واقعی جایگزین کنید.
clients: [
{ id: 'c1', name: 'هتل پارسیان' },
{ id: 'c2', name: 'دانشگاه فردوسی' },
{ id: 'c3', name: 'بیمارستان رضوی' },
{ id: 'c4', name: 'فروشگاه‌های زنجیره‌ای رفاه' },
{ id: 'c5', name: 'مجتمع اداری آسمان' },
{ id: 'c6', name: 'باشگاه ورزشی تلاش' },
{id: 'c1', name: 'هتل پارسیان'},
{id: 'c2', name: 'دانشگاه فردوسی'},
{id: 'c3', name: 'بیمارستان رضوی'},
{id: 'c4', name: 'فروشگاه‌های زنجیره‌ای رفاه'},
{id: 'c5', name: 'مجتمع اداری آسمان'},
{id: 'c6', name: 'باشگاه ورزشی تلاش'},
],
},
features: [
{ id: 'warranty', icon: 'safety', title: 'ضمانت کالا', description: 'کلیه محصولات شرکت دارای یک سال خدمات پس از فروش می‌باشند.' },
{ id: 'consulting', icon: 'consulting', title: 'مشاوره تخصصی و رایگان', description: 'خدمات مشاوره رایگان در مورد نوع دستگاه و چیدمان محصولات.' },
{ id: 'installment', icon: 'installment', title: 'امکان خرید اقساطی', description: 'امکان خرید اقساط با شرایط آسان و مناسب جهت کلیه مشاغل.' },
{ id: 'packaging', icon: 'packaging', title: 'بسته‌بندی ایمن', description: 'با درخواست شما، محصولات با بسته‌بندی باکس پالت با هزینه‌ای اندک ارسال می‌شود.' },
{
id: 'warranty',
icon: 'safety',
title: 'ضمانت کالا',
description: 'کلیه محصولات شرکت دارای یک سال خدمات پس از فروش می‌باشند.'
},
{
id: 'consulting',
icon: 'consulting',
title: 'مشاوره تخصصی و رایگان',
description: 'خدمات مشاوره رایگان در مورد نوع دستگاه و چیدمان محصولات.'
},
{
id: 'installment',
icon: 'installment',
title: 'امکان خرید اقساطی',
description: 'امکان خرید اقساط با شرایط آسان و مناسب جهت کلیه مشاغل.'
},
{
id: 'packaging',
icon: 'packaging',
title: 'بسته‌بندی ایمن',
description: 'با درخواست شما، محصولات با بسته‌بندی باکس پالت با هزینه‌ای اندک ارسال می‌شود.'
},
],
about: {
eyebrow: 'معرفی شرکت',
@@ -188,12 +205,42 @@ export const content = {
locations: {
title: 'مکان مناسب برای نصب روبات مارکت',
items: [
{ id: 'hotels', icon: 'hotel', title: 'هتل‌ها و مراکز اقامتی', description: 'هر جایی که جمعیت زیادی در صف انتظار قرار دارند، به‌جز درآمد، روبات مارکت جزو امکانات رفاهی آن مکان محسوب شده و میزان رضایت مراجعان را نیز افزایش می‌دهد.' },
{ id: 'schools', icon: 'school', title: 'مراکز آموزشی و مدارس', description: 'در صورتی که هر یک از دانش‌آموزان و دانشجویان برای خرید مایحتاج خود به خارج از مجموعه مراجعه کنند و خدای‌ناکرده اتفاقی بیفتد، مسئولیت آن مستقیماً به عهده مدیر آموزشگاه است. در نتیجه وجود یک روبات مارکت در هر آموزشگاه ضروری است.' },
{ id: 'pharmacies', icon: 'pharmacy', title: 'داروخانه‌ها و سوپرمارکت‌ها', description: 'برای فروش محصولات جنسی و پیشگیری، ویژه مشتریانی که برای خرید آن معذوریت دارند.' },
{ id: 'hospitals', icon: 'hospital', title: 'بیمارستان‌ها و مراکز درمانی', description: 'برای فروش محصولات جنسی و پیشگیری، ویژه مشتریانی که برای خرید آن معذوریت دارند.' },
{ id: 'night-shift', icon: 'night', title: 'کشیک شیفت شب', description: 'امکان تعبیه روبات مارکت پشت شیشه سکوریت مغازه‌ها نیز وجود دارد تا در زمان تعطیلی فروشگاه و حتی نیمه‌شب‌ها، روبات زحمتکش در حال خدمت‌دهی به مشتریان عزیز شما باشد.' },
{ id: 'specialty', icon: 'specialty', title: 'محصولات تخصصی', description: 'اگر تولیدکننده هستید یا نماینده تولیدکننده محصولی خاص هستید، یک روبات مارکت می‌تواند مسئولیت معرفی و عرضه محصولات تخصصی شما را نیز بر عهده بگیرد.' },
{
id: 'hotels',
icon: 'hotel',
title: 'هتل‌ها و مراکز اقامتی',
description: 'هر جایی که جمعیت زیادی در صف انتظار قرار دارند، به‌جز درآمد، روبات مارکت جزو امکانات رفاهی آن مکان محسوب شده و میزان رضایت مراجعان را نیز افزایش می‌دهد.'
},
{
id: 'schools',
icon: 'school',
title: 'مراکز آموزشی و مدارس',
description: 'در صورتی که هر یک از دانش‌آموزان و دانشجویان برای خرید مایحتاج خود به خارج از مجموعه مراجعه کنند و خدای‌ناکرده اتفاقی بیفتد، مسئولیت آن مستقیماً به عهده مدیر آموزشگاه است. در نتیجه وجود یک روبات مارکت در هر آموزشگاه ضروری است.'
},
{
id: 'pharmacies',
icon: 'pharmacy',
title: 'داروخانه‌ها و سوپرمارکت‌ها',
description: 'برای فروش محصولات جنسی و پیشگیری، ویژه مشتریانی که برای خرید آن معذوریت دارند.'
},
{
id: 'hospitals',
icon: 'hospital',
title: 'بیمارستان‌ها و مراکز درمانی',
description: 'برای فروش محصولات جنسی و پیشگیری، ویژه مشتریانی که برای خرید آن معذوریت دارند.'
},
{
id: 'night-shift',
icon: 'night',
title: 'کشیک شیفت شب',
description: 'امکان تعبیه روبات مارکت پشت شیشه سکوریت مغازه‌ها نیز وجود دارد تا در زمان تعطیلی فروشگاه و حتی نیمه‌شب‌ها، روبات زحمتکش در حال خدمت‌دهی به مشتریان عزیز شما باشد.'
},
{
id: 'specialty',
icon: 'specialty',
title: 'محصولات تخصصی',
description: 'اگر تولیدکننده هستید یا نماینده تولیدکننده محصولی خاص هستید، یک روبات مارکت می‌تواند مسئولیت معرفی و عرضه محصولات تخصصی شما را نیز بر عهده بگیرد.'
},
],
},
catalog: {
@@ -206,12 +253,54 @@ export const content = {
machinePriceLabel: 'قیمت ویژه مشتریان روبات مارکت',
addToast: (name) => `${name} به لیست سفارش اضافه شد`,
items: [
{ id: 'saffron', name: 'زعفران ممتاز درجه‌یک', category: 'زعفران', image: '/images/catalog/saffron.svg', originalPriceNumeric: 12000000, priceNumeric: 8900000 },
{ id: 'chips', name: 'چیپس و پفک (بسته عمده)', category: 'تنقلات', image: '/images/snacks/chips-1.svg', originalPriceNumeric: 450000, priceNumeric: 320000 },
{ id: 'soda', name: 'نوشابه و نوشیدنی گازدار', category: 'نوشیدنی', image: '/images/snacks/soda-1.svg', originalPriceNumeric: 250000, priceNumeric: 180000 },
{ id: 'water', name: 'آب معدنی', category: 'نوشیدنی', image: '/images/catalog/water.svg', originalPriceNumeric: 120000, priceNumeric: 80000 },
{ id: 'coffee', name: 'قهوه فوری', category: 'گرم', image: '/images/catalog/coffee.svg', originalPriceNumeric: 650000, priceNumeric: 470000 },
{ id: 'tea', name: 'چای کیسه‌ای', category: 'گرم', image: '/images/catalog/tea.svg', originalPriceNumeric: 380000, priceNumeric: 270000 },
{
id: 'saffron',
name: 'زعفران ممتاز درجه‌یک',
category: 'زعفران',
image: '/images/catalog/saffron.svg',
originalPriceNumeric: 12000000,
priceNumeric: 8900000
},
{
id: 'chips',
name: 'چیپس و پفک (بسته عمده)',
category: 'تنقلات',
image: '/images/snacks/chips-1.svg',
originalPriceNumeric: 450000,
priceNumeric: 320000
},
{
id: 'soda',
name: 'نوشابه و نوشیدنی گازدار',
category: 'نوشیدنی',
image: '/images/snacks/soda-1.svg',
originalPriceNumeric: 250000,
priceNumeric: 180000
},
{
id: 'water',
name: 'آب معدنی',
category: 'نوشیدنی',
image: '/images/catalog/water.svg',
originalPriceNumeric: 120000,
priceNumeric: 80000
},
{
id: 'coffee',
name: 'قهوه فوری',
category: 'گرم',
image: '/images/catalog/coffee.svg',
originalPriceNumeric: 650000,
priceNumeric: 470000
},
{
id: 'tea',
name: 'چای کیسه‌ای',
category: 'گرم',
image: '/images/catalog/tea.svg',
originalPriceNumeric: 380000,
priceNumeric: 270000
},
],
},
introVideo: {
@@ -242,9 +331,9 @@ export const content = {
subjectPlaceholder: 'موضوع درخواست خود را بنویسید',
priority: 'اولویت',
priorities: [
{ value: 'low', label: 'کم' },
{ value: 'medium', label: 'متوسط' },
{ value: 'high', label: 'فوری' },
{value: 'low', label: 'کم'},
{value: 'medium', label: 'متوسط'},
{value: 'high', label: 'فوری'},
],
message: 'پیام شما',
messagePlaceholder: 'توضیحات کامل درخواست یا مشکل خود را بنویسید…',
@@ -277,9 +366,9 @@ export const content = {
factoryAddress: 'مشهد، کیلومتر ۸ جاده مشهد - چناران، دور برگردان اصلی شهرک صنعتی توس به سمت مشهد، بعد از نیروگاه، اولین فرعی سمت راست (خیابان کاله)، اولین کوچه سمت راست، پلاک ۱۱۰، شرکت نگین سازان پیشگام رادمهر آتوسا',
salesOfficeAddress: 'مشهد، نبش پیامبر اعظم ۷، جنب بیمارستان رضوی، برج نخل، واحد ۴۰۱',
socialLinks: [
{ id: 'instagram', label: 'صفحه اینستاگرام', href: 'http://instagram.com/vending_machin_life' },
{ id: 'bale-join', label: 'کانال پیام‌رسان بله', href: 'https://ble.ir/join/AiTbV6UpBA' },
{ id: 'bale-site', label: 'وب‌سایت', href: 'https://my-rm.com/' },
{id: 'instagram', label: 'صفحه اینستاگرام', href: 'http://instagram.com/vending_machin_life'},
{id: 'bale-join', label: 'کانال پیام‌رسان بله', href: 'https://ble.ir/join/AiTbV6UpBA'},
{id: 'bale-site', label: 'وب‌سایت', href: 'https://my-rm.com/'},
],
},
},
@@ -313,21 +402,21 @@ export const content = {
kicker: 'Robot Market',
titleLines: ['Automated selling,', 'smart & non-stop'],
sub: 'A new experience of fast, easy shopping with Robot Market vending machines.',
image: '/images/machine-35-base.svg',
image: '/images/machine-slide-0.png',
},
{
id: 'slide-2',
kicker: 'Refrigerated',
titleLines: ['Powerful cooling,', 'guaranteed quality'],
sub: 'Proper storage for snacks and cold drinks, 24/7, with no staff required.',
image: '/images/machine-48-base.svg',
image: '/images/machine-slide-1.png',
},
{
id: 'slide-3',
kicker: 'Online Management',
titleLines: ['Full control of your', 'business, remotely'],
sub: 'Manage inventory, sales, and reports online, any hour of the day.',
image: '/images/machine-60-base.svg',
image: '/images/machine-slide-2.png',
},
],
},
@@ -354,19 +443,39 @@ export const content = {
title: 'Businesses That Trust Robot Market',
// Sample/placeholder names — replace with real client names.
clients: [
{ id: 'c1', name: 'Parsian Hotel' },
{ id: 'c2', name: 'Ferdowsi University' },
{ id: 'c3', name: 'Razavi Hospital' },
{ id: 'c4', name: 'Refah Retail Chain' },
{ id: 'c5', name: 'Asemaan Office Complex' },
{ id: 'c6', name: 'Talash Sports Club' },
{id: 'c1', name: 'Parsian Hotel'},
{id: 'c2', name: 'Ferdowsi University'},
{id: 'c3', name: 'Razavi Hospital'},
{id: 'c4', name: 'Refah Retail Chain'},
{id: 'c5', name: 'Asemaan Office Complex'},
{id: 'c6', name: 'Talash Sports Club'},
],
},
features: [
{ id: 'warranty', icon: 'safety', title: 'Product Warranty', description: 'All our products come with one year of after-sales service.' },
{ id: 'consulting', icon: 'consulting', title: 'Free Expert Consulting', description: 'Free consulting on the right machine type and product layout.' },
{ id: 'installment', icon: 'installment', title: 'Installment Purchase', description: 'Flexible, easy installment plans suitable for any business.' },
{ id: 'packaging', icon: 'packaging', title: 'Secure Packaging', description: 'On request, products ship in pallet-box packaging for a small fee.' },
{
id: 'warranty',
icon: 'safety',
title: 'Product Warranty',
description: 'All our products come with one year of after-sales service.'
},
{
id: 'consulting',
icon: 'consulting',
title: 'Free Expert Consulting',
description: 'Free consulting on the right machine type and product layout.'
},
{
id: 'installment',
icon: 'installment',
title: 'Installment Purchase',
description: 'Flexible, easy installment plans suitable for any business.'
},
{
id: 'packaging',
icon: 'packaging',
title: 'Secure Packaging',
description: 'On request, products ship in pallet-box packaging for a small fee.'
},
],
about: {
eyebrow: 'Company Profile',
@@ -387,12 +496,42 @@ export const content = {
locations: {
title: 'Ideal Locations for a Robot Market Machine',
items: [
{ id: 'hotels', icon: 'hotel', title: 'Hotels & Accommodations', description: 'Anywhere large crowds wait in line — beyond the revenue, Robot Market becomes an amenity that increases guest satisfaction.' },
{ id: 'schools', icon: 'school', title: 'Schools & Educational Centers', description: 'If a student has to leave campus to buy something and, God forbid, an incident occurs, responsibility falls directly on the school administrator. A Robot Market on-site is essential.' },
{ id: 'pharmacies', icon: 'pharmacy', title: 'Pharmacies & Supermarkets', description: 'For selling personal/health products discreetly, for customers who prefer not to purchase them in person.' },
{ id: 'hospitals', icon: 'hospital', title: 'Hospitals & Medical Centers', description: 'For selling personal/health products discreetly, for customers who prefer not to purchase them in person.' },
{ id: 'night-shift', icon: 'night', title: 'Night-Shift Coverage', description: 'Robot Market can be installed behind a shop\'s security glass, serving customers even after closing time and in the middle of the night.' },
{ id: 'specialty', icon: 'specialty', title: 'Specialty Products', description: 'If you manufacture or represent a specific product line, a Robot Market machine can take on introducing and offering your specialty products too.' },
{
id: 'hotels',
icon: 'hotel',
title: 'Hotels & Accommodations',
description: 'Anywhere large crowds wait in line — beyond the revenue, Robot Market becomes an amenity that increases guest satisfaction.'
},
{
id: 'schools',
icon: 'school',
title: 'Schools & Educational Centers',
description: 'If a student has to leave campus to buy something and, God forbid, an incident occurs, responsibility falls directly on the school administrator. A Robot Market on-site is essential.'
},
{
id: 'pharmacies',
icon: 'pharmacy',
title: 'Pharmacies & Supermarkets',
description: 'For selling personal/health products discreetly, for customers who prefer not to purchase them in person.'
},
{
id: 'hospitals',
icon: 'hospital',
title: 'Hospitals & Medical Centers',
description: 'For selling personal/health products discreetly, for customers who prefer not to purchase them in person.'
},
{
id: 'night-shift',
icon: 'night',
title: 'Night-Shift Coverage',
description: 'Robot Market can be installed behind a shop\'s security glass, serving customers even after closing time and in the middle of the night.'
},
{
id: 'specialty',
icon: 'specialty',
title: 'Specialty Products',
description: 'If you manufacture or represent a specific product line, a Robot Market machine can take on introducing and offering your specialty products too.'
},
],
},
catalog: {
@@ -405,12 +544,54 @@ export const content = {
machinePriceLabel: 'Robot Market customer price',
addToast: (name) => `${name} added to your order`,
items: [
{ id: 'saffron', name: 'Premium Grade-1 Saffron', category: 'Saffron', image: '/images/catalog/saffron.svg', originalPriceNumeric: 12000000, priceNumeric: 8900000 },
{ id: 'chips', name: 'Chips & Crisps (bulk pack)', category: 'Snacks', image: '/images/snacks/chips-1.svg', originalPriceNumeric: 450000, priceNumeric: 320000 },
{ id: 'soda', name: 'Soda & Carbonated Drinks', category: 'Drinks', image: '/images/snacks/soda-1.svg', originalPriceNumeric: 250000, priceNumeric: 180000 },
{ id: 'water', name: 'Mineral Water', category: 'Drinks', image: '/images/catalog/water.svg', originalPriceNumeric: 120000, priceNumeric: 80000 },
{ id: 'coffee', name: 'Instant Coffee', category: 'Hot Drinks', image: '/images/catalog/coffee.svg', originalPriceNumeric: 650000, priceNumeric: 470000 },
{ id: 'tea', name: 'Tea Bags', category: 'Hot Drinks', image: '/images/catalog/tea.svg', originalPriceNumeric: 380000, priceNumeric: 270000 },
{
id: 'saffron',
name: 'Premium Grade-1 Saffron',
category: 'Saffron',
image: '/images/catalog/saffron.svg',
originalPriceNumeric: 12000000,
priceNumeric: 8900000
},
{
id: 'chips',
name: 'Chips & Crisps (bulk pack)',
category: 'Snacks',
image: '/images/snacks/chips-1.svg',
originalPriceNumeric: 450000,
priceNumeric: 320000
},
{
id: 'soda',
name: 'Soda & Carbonated Drinks',
category: 'Drinks',
image: '/images/snacks/soda-1.svg',
originalPriceNumeric: 250000,
priceNumeric: 180000
},
{
id: 'water',
name: 'Mineral Water',
category: 'Drinks',
image: '/images/catalog/water.svg',
originalPriceNumeric: 120000,
priceNumeric: 80000
},
{
id: 'coffee',
name: 'Instant Coffee',
category: 'Hot Drinks',
image: '/images/catalog/coffee.svg',
originalPriceNumeric: 650000,
priceNumeric: 470000
},
{
id: 'tea',
name: 'Tea Bags',
category: 'Hot Drinks',
image: '/images/catalog/tea.svg',
originalPriceNumeric: 380000,
priceNumeric: 270000
},
],
},
introVideo: {
@@ -441,9 +622,9 @@ export const content = {
subjectPlaceholder: 'Write the subject of your request',
priority: 'Priority',
priorities: [
{ value: 'low', label: 'Low' },
{ value: 'medium', label: 'Medium' },
{ value: 'high', label: 'Urgent' },
{value: 'low', label: 'Low'},
{value: 'medium', label: 'Medium'},
{value: 'high', label: 'Urgent'},
],
message: 'Your Message',
messagePlaceholder: 'Describe your request or issue in full…',
@@ -476,9 +657,9 @@ export const content = {
factoryAddress: 'Mashhad, Mashhad–Chenaran Rd. km 8, main roundabout of Toos Industrial Town toward Mashhad, after the power plant, 1st street on the right (Kaleh St.), 1st alley on the right, No. 110 — Negin Sazan Pishgam Radmehr Atousa Co.',
salesOfficeAddress: 'Mashhad, corner of Payambar-e Azam 7, next to Razavi Hospital, Nakhl Tower, Unit 401',
socialLinks: [
{ id: 'instagram', label: 'Instagram', href: 'http://instagram.com/vending_machin_life' },
{ id: 'bale-join', label: 'Bale Channel', href: 'https://ble.ir/join/AiTbV6UpBA' },
{ id: 'bale-site', label: 'Website', href: 'https://my-rm.com/' },
{id: 'instagram', label: 'Instagram', href: 'http://instagram.com/vending_machin_life'},
{id: 'bale-join', label: 'Bale Channel', href: 'https://ble.ir/join/AiTbV6UpBA'},
{id: 'bale-site', label: 'Website', href: 'https://my-rm.com/'},
],
},
},
@@ -486,12 +667,12 @@ export const content = {
// Locale-independent asset config (positions/paths only — same in both languages).
export const floatingSnacks = [
{ id: 'chips-1', image: '/images/snacks/chips-1.svg', size: 76, top: '18%', left: '8%', duration: 5.5, delay: 0 },
{ id: 'soda-1', image: '/images/snacks/soda-1.svg', size: 64, top: '68%', left: '12%', duration: 6.2, delay: 0.6 },
{ id: 'chips-2', image: '/images/snacks/chips-2.svg', size: 58, top: '22%', left: '85%', duration: 4.8, delay: 0.3 },
{ id: 'soda-2', image: '/images/snacks/soda-2.svg', size: 70, top: '72%', left: '88%', duration: 5.9, delay: 0.9 },
{ id: 'chips-3', image: '/images/snacks/chips-1.svg', size: 48, top: '42%', left: '90%', duration: 6.6, delay: 1.2 },
{ id: 'soda-3', image: '/images/snacks/soda-1.svg', size: 52, top: '46%', left: '4%', duration: 5.1, delay: 1.5 },
{id: 'chips-1', image: '/images/snacks/item-1.png', size: 76, top: '18%', left: '8%', duration: 5.5, delay: 0},
{id: 'soda-1', image: '/images/snacks/item-2.png', size: 64, top: '68%', left: '12%', duration: 6.2, delay: 0.6},
{id: 'chips-2', image: '/images/snacks/item-3.png', size: 58, top: '22%', left: '85%', duration: 4.8, delay: 0.3},
{id: 'soda-2', image: '/images/snacks/item-4.png', size: 70, top: '72%', left: '88%', duration: 5.9, delay: 0.9},
{id: 'chips-3', image: '/images/snacks/item-5.png', size: 48, top: '42%', left: '90%', duration: 6.6, delay: 1.2},
{id: 'soda-3', image: '/images/snacks/item-6.png', size: 52, top: '46%', left: '4%', duration: 5.1, delay: 1.5},
];
export const showcaseVideoSrc = '/video/showcase-placeholder.mp4';
@@ -504,6 +685,6 @@ export const introVideoPoster = '/images/video-poster.svg';
// Placeholder coordinates for Toos Industrial Town, Mashhad (approximate).
// Replace with the exact factory pin — see README.
export const mapLocations = {
factory: { lat: 36.42, lng: 59.445 },
salesOffice: { lat: 36.3110, lng: 59.5683 }, // approximate central Mashhad placeholder
factory: {lat: 36.42, lng: 59.445},
salesOffice: {lat: 36.3110, lng: 59.5683}, // approximate central Mashhad placeholder
};
+2 -1
View File
@@ -3,6 +3,7 @@
"baseUrl": ".",
"paths": {
"@/*": ["./*"]
}
},
"jsx": "react"
}
}
+7
View File
@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 80" width="200" height="80">
<rect x="2" y="2" width="196" height="76" rx="12" fill="none" stroke="#00a693" stroke-opacity="0.3" stroke-width="2"/>
<circle cx="40" cy="40" r="20" fill="#00a693"/>
<text x="40" y="47" font-family="Tahoma, sans-serif" font-size="20" font-weight="bold" fill="#ffffff" text-anchor="middle">پ</text>
<rect x="72" y="32" width="100" height="8" rx="4" fill="#00a693" fill-opacity="0.35"/>
<rect x="72" y="46" width="70" height="6" rx="3" fill="#00a693" fill-opacity="0.2"/>
</svg>

After

Width:  |  Height:  |  Size: 575 B

+7
View File
@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 80" width="200" height="80">
<rect x="2" y="2" width="196" height="76" rx="12" fill="none" stroke="#00a693" stroke-opacity="0.3" stroke-width="2"/>
<circle cx="40" cy="40" r="20" fill="#017065"/>
<text x="40" y="47" font-family="Tahoma, sans-serif" font-size="20" font-weight="bold" fill="#ffffff" text-anchor="middle">ف</text>
<rect x="72" y="32" width="100" height="8" rx="4" fill="#00a693" fill-opacity="0.35"/>
<rect x="72" y="46" width="70" height="6" rx="3" fill="#00a693" fill-opacity="0.2"/>
</svg>

After

Width:  |  Height:  |  Size: 575 B

+7
View File
@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 80" width="200" height="80">
<rect x="2" y="2" width="196" height="76" rx="12" fill="none" stroke="#00a693" stroke-opacity="0.3" stroke-width="2"/>
<circle cx="40" cy="40" r="20" fill="#00a693"/>
<text x="40" y="47" font-family="Tahoma, sans-serif" font-size="20" font-weight="bold" fill="#ffffff" text-anchor="middle">ر</text>
<rect x="72" y="32" width="100" height="8" rx="4" fill="#00a693" fill-opacity="0.35"/>
<rect x="72" y="46" width="70" height="6" rx="3" fill="#00a693" fill-opacity="0.2"/>
</svg>

After

Width:  |  Height:  |  Size: 575 B

+7
View File
@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 80" width="200" height="80">
<rect x="2" y="2" width="196" height="76" rx="12" fill="none" stroke="#00a693" stroke-opacity="0.3" stroke-width="2"/>
<circle cx="40" cy="40" r="20" fill="#0b3d38"/>
<text x="40" y="47" font-family="Tahoma, sans-serif" font-size="20" font-weight="bold" fill="#ffffff" text-anchor="middle">ر</text>
<rect x="72" y="32" width="100" height="8" rx="4" fill="#00a693" fill-opacity="0.35"/>
<rect x="72" y="46" width="70" height="6" rx="3" fill="#00a693" fill-opacity="0.2"/>
</svg>

After

Width:  |  Height:  |  Size: 575 B

+7
View File
@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 80" width="200" height="80">
<rect x="2" y="2" width="196" height="76" rx="12" fill="none" stroke="#00a693" stroke-opacity="0.3" stroke-width="2"/>
<circle cx="40" cy="40" r="20" fill="#00a693"/>
<text x="40" y="47" font-family="Tahoma, sans-serif" font-size="20" font-weight="bold" fill="#ffffff" text-anchor="middle">آ</text>
<rect x="72" y="32" width="100" height="8" rx="4" fill="#00a693" fill-opacity="0.35"/>
<rect x="72" y="46" width="70" height="6" rx="3" fill="#00a693" fill-opacity="0.2"/>
</svg>

After

Width:  |  Height:  |  Size: 575 B

+7
View File
@@ -0,0 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 80" width="200" height="80">
<rect x="2" y="2" width="196" height="76" rx="12" fill="none" stroke="#00a693" stroke-opacity="0.3" stroke-width="2"/>
<circle cx="40" cy="40" r="20" fill="#017065"/>
<text x="40" y="47" font-family="Tahoma, sans-serif" font-size="20" font-weight="bold" fill="#ffffff" text-anchor="middle">ت</text>
<rect x="72" y="32" width="100" height="8" rx="4" fill="#00a693" fill-opacity="0.35"/>
<rect x="72" y="46" width="70" height="6" rx="3" fill="#00a693" fill-opacity="0.2"/>
</svg>

After

Width:  |  Height:  |  Size: 575 B

-8
View File
@@ -1,8 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 220 60" width="220" height="60">
<rect x="2" y="2" width="56" height="56" rx="14" fill="#00a693"/>
<rect x="16" y="14" width="28" height="32" rx="4" fill="#04120f"/>
<rect x="20" y="18" width="8" height="10" rx="1" fill="#00a693"/>
<rect x="32" y="18" width="8" height="10" rx="1" fill="#00a693"/>
<text x="70" y="27" font-family="Tahoma, sans-serif" font-size="20" font-weight="bold" fill="#e6f7f4">روبات مارکت</text>
<text x="70" y="46" font-family="Tahoma, sans-serif" font-size="12" fill="#8fdccc">Robot Market</text>
</svg>

Before

Width:  |  Height:  |  Size: 604 B

-28
View File
@@ -1,28 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 700" width="400" height="700">
<defs>
<linearGradient id="body" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#00a693" stop-opacity="0.95"/>
<stop offset="1" stop-color="#08554e"/>
</linearGradient>
</defs>
<rect x="40" y="30" width="320" height="620" rx="26" fill="url(#body)" stroke="#012e28" stroke-width="6"/>
<rect x="70" y="70" width="260" height="360" rx="10" fill="#04120f" opacity="0.55"/>
<g fill="#0b3d38" opacity="0.9">
<rect x="85" y="85" width="55" height="80" rx="4"/>
<rect x="150" y="85" width="55" height="80" rx="4"/>
<rect x="215" y="85" width="55" height="80" rx="4"/>
<rect x="280" y="85" width="35" height="80" rx="4"/>
<rect x="85" y="175" width="55" height="80" rx="4"/>
<rect x="150" y="175" width="55" height="80" rx="4"/>
<rect x="215" y="175" width="55" height="80" rx="4"/>
<rect x="280" y="175" width="35" height="80" rx="4"/>
<rect x="85" y="265" width="55" height="80" rx="4"/>
<rect x="150" y="265" width="55" height="80" rx="4"/>
<rect x="215" y="265" width="55" height="80" rx="4"/>
<rect x="280" y="265" width="35" height="80" rx="4"/>
</g>
<rect x="70" y="450" width="260" height="150" rx="10" fill="#04120f" opacity="0.4"/>
<circle cx="200" cy="525" r="34" fill="none" stroke="#e6f7f4" stroke-width="4"/>
<rect x="185" y="595" width="30" height="40" rx="4" fill="#04120f"/>
<text x="200" y="670" font-family="Tahoma, sans-serif" font-size="26" fill="#e6f7f4" text-anchor="middle">RM-35</text>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

-28
View File
@@ -1,28 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 700" width="400" height="700">
<defs>
<linearGradient id="body" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#ffffff"/>
<stop offset="1" stop-color="#dff3ef"/>
</linearGradient>
</defs>
<rect x="40" y="30" width="320" height="620" rx="26" fill="url(#body)" stroke="#00a693" stroke-width="6"/>
<rect x="70" y="70" width="260" height="360" rx="10" fill="#ffffff" opacity="0.9" stroke="#8fdccc" stroke-width="2"/>
<g fill="#c0ebe3" stroke="#00a693" stroke-width="1.5">
<rect x="85" y="85" width="55" height="80" rx="4"/>
<rect x="150" y="85" width="55" height="80" rx="4"/>
<rect x="215" y="85" width="55" height="80" rx="4"/>
<rect x="280" y="85" width="35" height="80" rx="4"/>
<rect x="85" y="175" width="55" height="80" rx="4"/>
<rect x="150" y="175" width="55" height="80" rx="4"/>
<rect x="215" y="175" width="55" height="80" rx="4"/>
<rect x="280" y="175" width="35" height="80" rx="4"/>
<rect x="85" y="265" width="55" height="80" rx="4"/>
<rect x="150" y="265" width="55" height="80" rx="4"/>
<rect x="215" y="265" width="55" height="80" rx="4"/>
<rect x="280" y="265" width="35" height="80" rx="4"/>
</g>
<rect x="70" y="450" width="260" height="150" rx="10" fill="#ffffff" opacity="0.9" stroke="#8fdccc" stroke-width="2"/>
<circle cx="200" cy="525" r="34" fill="none" stroke="#00a693" stroke-width="4"/>
<rect x="185" y="595" width="30" height="40" rx="4" fill="#00a693"/>
<text x="200" y="670" font-family="Tahoma, sans-serif" font-size="26" fill="#00a693" text-anchor="middle">RM-35 · White</text>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

-28
View File
@@ -1,28 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 700" width="400" height="700">
<defs>
<linearGradient id="body" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#00a693" stop-opacity="0.95"/>
<stop offset="1" stop-color="#08554e"/>
</linearGradient>
</defs>
<rect x="40" y="30" width="320" height="620" rx="26" fill="url(#body)" stroke="#012e28" stroke-width="6"/>
<rect x="70" y="70" width="260" height="360" rx="10" fill="#04120f" opacity="0.55"/>
<g fill="#0b3d38" opacity="0.9">
<rect x="85" y="85" width="55" height="80" rx="4"/>
<rect x="150" y="85" width="55" height="80" rx="4"/>
<rect x="215" y="85" width="55" height="80" rx="4"/>
<rect x="280" y="85" width="35" height="80" rx="4"/>
<rect x="85" y="175" width="55" height="80" rx="4"/>
<rect x="150" y="175" width="55" height="80" rx="4"/>
<rect x="215" y="175" width="55" height="80" rx="4"/>
<rect x="280" y="175" width="35" height="80" rx="4"/>
<rect x="85" y="265" width="55" height="80" rx="4"/>
<rect x="150" y="265" width="55" height="80" rx="4"/>
<rect x="215" y="265" width="55" height="80" rx="4"/>
<rect x="280" y="265" width="35" height="80" rx="4"/>
</g>
<rect x="70" y="450" width="260" height="150" rx="10" fill="#04120f" opacity="0.4"/>
<circle cx="200" cy="525" r="34" fill="none" stroke="#e6f7f4" stroke-width="4"/>
<rect x="185" y="595" width="30" height="40" rx="4" fill="#04120f"/>
<text x="200" y="670" font-family="Tahoma, sans-serif" font-size="26" fill="#e6f7f4" text-anchor="middle">RM-48</text>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

-28
View File
@@ -1,28 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 700" width="400" height="700">
<defs>
<linearGradient id="body" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#ffffff"/>
<stop offset="1" stop-color="#dff3ef"/>
</linearGradient>
</defs>
<rect x="40" y="30" width="320" height="620" rx="26" fill="url(#body)" stroke="#00a693" stroke-width="6"/>
<rect x="70" y="70" width="260" height="360" rx="10" fill="#ffffff" opacity="0.9" stroke="#8fdccc" stroke-width="2"/>
<g fill="#c0ebe3" stroke="#00a693" stroke-width="1.5">
<rect x="85" y="85" width="55" height="80" rx="4"/>
<rect x="150" y="85" width="55" height="80" rx="4"/>
<rect x="215" y="85" width="55" height="80" rx="4"/>
<rect x="280" y="85" width="35" height="80" rx="4"/>
<rect x="85" y="175" width="55" height="80" rx="4"/>
<rect x="150" y="175" width="55" height="80" rx="4"/>
<rect x="215" y="175" width="55" height="80" rx="4"/>
<rect x="280" y="175" width="35" height="80" rx="4"/>
<rect x="85" y="265" width="55" height="80" rx="4"/>
<rect x="150" y="265" width="55" height="80" rx="4"/>
<rect x="215" y="265" width="55" height="80" rx="4"/>
<rect x="280" y="265" width="35" height="80" rx="4"/>
</g>
<rect x="70" y="450" width="260" height="150" rx="10" fill="#ffffff" opacity="0.9" stroke="#8fdccc" stroke-width="2"/>
<circle cx="200" cy="525" r="34" fill="none" stroke="#00a693" stroke-width="4"/>
<rect x="185" y="595" width="30" height="40" rx="4" fill="#00a693"/>
<text x="200" y="670" font-family="Tahoma, sans-serif" font-size="26" fill="#00a693" text-anchor="middle">RM-48 · White</text>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

-28
View File
@@ -1,28 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 700" width="400" height="700">
<defs>
<linearGradient id="body" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#00a693" stop-opacity="0.95"/>
<stop offset="1" stop-color="#08554e"/>
</linearGradient>
</defs>
<rect x="40" y="30" width="320" height="620" rx="26" fill="url(#body)" stroke="#012e28" stroke-width="6"/>
<rect x="70" y="70" width="260" height="360" rx="10" fill="#04120f" opacity="0.55"/>
<g fill="#0b3d38" opacity="0.9">
<rect x="85" y="85" width="55" height="80" rx="4"/>
<rect x="150" y="85" width="55" height="80" rx="4"/>
<rect x="215" y="85" width="55" height="80" rx="4"/>
<rect x="280" y="85" width="35" height="80" rx="4"/>
<rect x="85" y="175" width="55" height="80" rx="4"/>
<rect x="150" y="175" width="55" height="80" rx="4"/>
<rect x="215" y="175" width="55" height="80" rx="4"/>
<rect x="280" y="175" width="35" height="80" rx="4"/>
<rect x="85" y="265" width="55" height="80" rx="4"/>
<rect x="150" y="265" width="55" height="80" rx="4"/>
<rect x="215" y="265" width="55" height="80" rx="4"/>
<rect x="280" y="265" width="35" height="80" rx="4"/>
</g>
<rect x="70" y="450" width="260" height="150" rx="10" fill="#04120f" opacity="0.4"/>
<circle cx="200" cy="525" r="34" fill="none" stroke="#e6f7f4" stroke-width="4"/>
<rect x="185" y="595" width="30" height="40" rx="4" fill="#04120f"/>
<text x="200" y="670" font-family="Tahoma, sans-serif" font-size="26" fill="#e6f7f4" text-anchor="middle">RM-60</text>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

-28
View File
@@ -1,28 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 700" width="400" height="700">
<defs>
<linearGradient id="body" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#ffffff"/>
<stop offset="1" stop-color="#dff3ef"/>
</linearGradient>
</defs>
<rect x="40" y="30" width="320" height="620" rx="26" fill="url(#body)" stroke="#00a693" stroke-width="6"/>
<rect x="70" y="70" width="260" height="360" rx="10" fill="#ffffff" opacity="0.9" stroke="#8fdccc" stroke-width="2"/>
<g fill="#c0ebe3" stroke="#00a693" stroke-width="1.5">
<rect x="85" y="85" width="55" height="80" rx="4"/>
<rect x="150" y="85" width="55" height="80" rx="4"/>
<rect x="215" y="85" width="55" height="80" rx="4"/>
<rect x="280" y="85" width="35" height="80" rx="4"/>
<rect x="85" y="175" width="55" height="80" rx="4"/>
<rect x="150" y="175" width="55" height="80" rx="4"/>
<rect x="215" y="175" width="55" height="80" rx="4"/>
<rect x="280" y="175" width="35" height="80" rx="4"/>
<rect x="85" y="265" width="55" height="80" rx="4"/>
<rect x="150" y="265" width="55" height="80" rx="4"/>
<rect x="215" y="265" width="55" height="80" rx="4"/>
<rect x="280" y="265" width="35" height="80" rx="4"/>
</g>
<rect x="70" y="450" width="260" height="150" rx="10" fill="#ffffff" opacity="0.9" stroke="#8fdccc" stroke-width="2"/>
<circle cx="200" cy="525" r="34" fill="none" stroke="#00a693" stroke-width="4"/>
<rect x="185" y="595" width="30" height="40" rx="4" fill="#00a693"/>
<text x="200" y="670" font-family="Tahoma, sans-serif" font-size="26" fill="#00a693" text-anchor="middle">RM-60 · White</text>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

-6
View File
@@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 160" width="120" height="160">
<path d="M20 10 L100 10 L92 150 L28 150 Z" fill="#ffb020" stroke="#7a4a00" stroke-width="3"/>
<path d="M20 10 L100 10 L96 45 L24 45 Z" fill="#00a693"/>
<circle cx="60" cy="90" r="26" fill="#fff4d6" opacity="0.85"/>
<text x="60" y="30" font-family="Tahoma, sans-serif" font-size="14" fill="#ffffff" text-anchor="middle">چیپس</text>
</svg>

Before

Width:  |  Height:  |  Size: 438 B

-6
View File
@@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 160" width="120" height="160">
<path d="M20 10 L100 10 L92 150 L28 150 Z" fill="#e6533c" stroke="#6b1f10" stroke-width="3"/>
<path d="M20 10 L100 10 L96 45 L24 45 Z" fill="#00a693"/>
<circle cx="60" cy="90" r="26" fill="#ffe3d6" opacity="0.85"/>
<text x="60" y="30" font-family="Tahoma, sans-serif" font-size="14" fill="#ffffff" text-anchor="middle">چیپس</text>
</svg>

Before

Width:  |  Height:  |  Size: 438 B

-6
View File
@@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 180" width="100" height="180">
<rect x="20" y="10" width="60" height="160" rx="14" fill="#00a693" stroke="#012e28" stroke-width="3"/>
<rect x="20" y="60" width="60" height="45" fill="#e6f7f4" opacity="0.9"/>
<text x="50" y="88" font-family="Tahoma, sans-serif" font-size="13" fill="#00594f" text-anchor="middle">نوشابه</text>
<rect x="38" y="0" width="24" height="14" rx="3" fill="#8fdccc"/>
</svg>

Before

Width:  |  Height:  |  Size: 470 B

-6
View File
@@ -1,6 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 180" width="100" height="180">
<rect x="20" y="10" width="60" height="160" rx="14" fill="#ffb020" stroke="#012e28" stroke-width="3"/>
<rect x="20" y="60" width="60" height="45" fill="#fff4d6" opacity="0.9"/>
<text x="50" y="88" font-family="Tahoma, sans-serif" font-size="13" fill="#7a4a00" text-anchor="middle">نوشابه</text>
<rect x="38" y="0" width="24" height="14" rx="3" fill="#ffe0a3"/>
</svg>

Before

Width:  |  Height:  |  Size: 470 B