725 lines
45 KiB
JavaScript
725 lines
45 KiB
JavaScript
/* Ordenax landing — EN/AR i18n, scroll animations, mobile nav and forms. */
|
||
|
||
const STRINGS = {
|
||
en: {
|
||
// Nav
|
||
"nav.shoppers": "Shoppers",
|
||
"nav.stores": "Stores",
|
||
"nav.wholesale": "Wholesale",
|
||
"nav.contact": "Contact",
|
||
"nav.cta": "Get started",
|
||
|
||
"common.learnMore": "Learn more",
|
||
"common.seeHow": "See how it works",
|
||
"common.seePricing": "See pricing",
|
||
|
||
// Footer
|
||
"footer.tag": "Marketplace · POS · Wholesale — bilingual by construction.",
|
||
"footer.product": "Product",
|
||
"footer.company": "Company",
|
||
"footer.privacy": "Privacy",
|
||
"footer.terms": "Terms",
|
||
"footer.legal": "© 2026 Ordenax. Made in Saudi Arabia.",
|
||
|
||
// Home
|
||
"home.hero.eyebrow": "Saudi grocery platform",
|
||
"home.hero.title": "Groceries from your local stores, delivered.",
|
||
"home.hero.lede": "Shop, sell, and restock on one platform — in Arabic and English, online or offline.",
|
||
"home.hero.cta1": "Start shopping",
|
||
"home.hero.cta2": "Run your store",
|
||
"home.hero.badge1": "Bilingual EN / AR",
|
||
"home.hero.badge2": "Works without internet",
|
||
"home.hero.badge3": "SAR · VAT included",
|
||
"home.pillars.eyebrow": "One platform, three wins",
|
||
"home.pillars.title": "Built for every side of grocery",
|
||
"home.pillars.m.title": "Shop local",
|
||
"home.pillars.m.body": "Fresh groceries from nearby stores, same-day delivery, and stock you can actually trust.",
|
||
"home.pillars.p.title": "Sell smarter",
|
||
"home.pillars.p.body": "One simple POS for counter sales, app orders, and uninterrupted selling — even when the internet drops.",
|
||
"home.pillars.w.title": "Restock wholesale",
|
||
"home.pillars.w.body": "Refill shelves straight from suppliers with clear invoices, real-time catalogs, and no inventory traps.",
|
||
"home.how.eyebrow": "How it works",
|
||
"home.how.title": "From shelf to doorstep in three steps",
|
||
"home.how.s1.title": "Order",
|
||
"home.how.s1.body": "A shopper picks products from a nearby store — in English or Arabic.",
|
||
"home.how.s2.title": "Prepare",
|
||
"home.how.s2.body": "The store receives, packs and confirms the order on the Ordenax system.",
|
||
"home.how.s3.title": "Deliver",
|
||
"home.how.s3.body": "A delivery partner drops it at the door. The store keeps the payment directly.",
|
||
"home.stats.s1": "partner stores",
|
||
"home.stats.s2": "monthly orders",
|
||
"home.stats.s3": "average delivery",
|
||
"home.stats.s3suffix": " min",
|
||
"home.stats.s4": "languages",
|
||
"home.testimonials.eyebrow": "What partners say",
|
||
"home.testimonials.title": "Loved by stores. Trusted by shoppers.",
|
||
"home.testimonials.t1.body": "\"We doubled our weekly orders within two months. The system is simple and our customers love ordering in Arabic.\"",
|
||
"home.testimonials.t1.name": "Abdullah, Al-Salam Market",
|
||
"home.testimonials.t2.body": "\"I can shop from the same grocer I visit every week, but now it comes to my door. Same quality, less hassle.\"",
|
||
"home.testimonials.t2.name": "Noura, Riyadh",
|
||
"home.testimonials.t3.body": "\"Restocking used to take three phone calls. Now we order once and the invoice is ready before delivery.\"",
|
||
"home.testimonials.t3.name": "Fahad, Green Cart",
|
||
"home.cta.title": "Ready to shop, sell, or supply?",
|
||
"home.cta.lede": "Join the grocery platform built for the Kingdom.",
|
||
"home.cta.button": "Request a demo",
|
||
|
||
// Home — deeper content
|
||
"home.why.eyebrow": "Why Ordenax",
|
||
"home.why.title": "Grocery made simple for everyone.",
|
||
"home.why.lede": "We built Ordenax around one idea: your neighborhood store should be as easy to reach as a global app — and just as reliable.",
|
||
|
||
"home.shoppers.eyebrow": "For shoppers",
|
||
"home.shoppers.title": "Your weekly shop, done in minutes.",
|
||
"home.shoppers.lede": "No more crowded aisles, sold-out shelves, or wondering when your order will arrive.",
|
||
"home.shoppers.b1.title": "Shop stores you already trust",
|
||
"home.shoppers.b1.body": "Your favorite neighborhood grocer, bakery, and produce stand — all in one place.",
|
||
"home.shoppers.b2.title": "Get it fast",
|
||
"home.shoppers.b2.body": "Same-day delivery in as little as 25 minutes, because fresh shouldn't mean waiting.",
|
||
"home.shoppers.b3.title": "Never guess stock again",
|
||
"home.shoppers.b3.body": "If it's on the app, it's on the shelf. No substitutions you didn't ask for.",
|
||
"home.shoppers.b4.title": "Reorder in one tap",
|
||
"home.shoppers.b4.body": "Save your weekly basket and repeat it whenever life gets busy.",
|
||
|
||
"home.owners.eyebrow": "For store owners",
|
||
"home.owners.title": "Run your store, not your paperwork.",
|
||
"home.owners.lede": "Everything you need to sell more, stress less, and keep every riyal in your account.",
|
||
"home.owners.b1.title": "Keep every sale",
|
||
"home.owners.b1.body": "No commission. No withheld funds. Customer payments go straight to you.",
|
||
"home.owners.b2.title": "One screen, every channel",
|
||
"home.owners.b2.body": "Counter sales, app orders, and wholesale restocking — all flowing into one simple system.",
|
||
"home.owners.b3.title": "Sell even when offline",
|
||
"home.owners.b3.body": "The internet drops. Your sales don't. Everything syncs automatically once you're back online.",
|
||
"home.owners.b4.title": "Grow without the guesswork",
|
||
"home.owners.b4.body": "Real-time inventory, clear reports, and a direct line to nearby shoppers who want what you sell.",
|
||
|
||
// Shoppers
|
||
"shoppers.hero.eyebrow": "For shoppers",
|
||
"shoppers.hero.title": "Your neighborhood store, now in your pocket.",
|
||
"shoppers.hero.lede": "Order fresh groceries from trusted local stores and get same-day delivery — in Arabic or English.",
|
||
"shoppers.hero.cta": "Download the app",
|
||
"shoppers.benefits.eyebrow": "Why shop on Ordenax",
|
||
"shoppers.benefits.title": "Fresh, fast and familiar",
|
||
"shoppers.benefits.b1.title": "Same-day delivery",
|
||
"shoppers.benefits.b1.body": "Get your groceries in as little as 25 minutes from stores you already know.",
|
||
"shoppers.benefits.b2.title": "Real stock",
|
||
"shoppers.benefits.b2.body": "If it's on the app, it's on the shelf — no more canceled items after checkout.",
|
||
"shoppers.benefits.b3.title": "Bilingual by design",
|
||
"shoppers.benefits.b3.body": "Switch between Arabic and English anytime. Product names, search and checkout follow you.",
|
||
"shoppers.benefits.b4.title": "Support local",
|
||
"shoppers.benefits.b4.body": "Every order goes directly to a store in your community — your money stays in the neighborhood.",
|
||
"shoppers.benefits.b5.title": "Easy reorder",
|
||
"shoppers.benefits.b5.body": "Repeat your weekly list in one tap. Save favorites and scheduled baskets for busy days.",
|
||
"shoppers.benefits.b6.title": "Pay with confidence",
|
||
"shoppers.benefits.b6.body": "Choose cash on delivery or trusted local payment options. The store handles your payment directly.",
|
||
"shoppers.categories.eyebrow": "Everything you need",
|
||
"shoppers.categories.title": "From pantry to produce",
|
||
"shoppers.categories.lede": "Browse thousands of products across the categories your family uses every day.",
|
||
"shoppers.categories.l1": "Fresh fruit and vegetables",
|
||
"shoppers.categories.l2": "Dairy, eggs and chilled goods",
|
||
"shoppers.categories.l3": "Rice, oil, spices and staples",
|
||
"shoppers.categories.l4": "Household and personal care",
|
||
"shoppers.categories.l5": "Beverages, snacks and bakery",
|
||
"shoppers.faq.title": "Common questions",
|
||
"shoppers.faq.q1": "Who delivers my order?",
|
||
"shoppers.faq.a1": "Your chosen store prepares the order and a local delivery partner brings it to you. You can track the status in the app.",
|
||
"shoppers.faq.q2": "Can I pay with cash?",
|
||
"shoppers.faq.a2": "Yes. The store collects your payment directly — cash on delivery or local digital payments, whichever you prefer.",
|
||
"shoppers.faq.q3": "What if an item is out of stock?",
|
||
"shoppers.faq.a3": "Stores update availability in real time. If something changes, they will contact you to suggest a replacement or refund.",
|
||
"shoppers.cta.title": "Your first order is waiting",
|
||
"shoppers.cta.lede": "Download the app and shop the stores you already trust.",
|
||
"shoppers.cta.button": "Get the app",
|
||
|
||
// Stores
|
||
"stores.hero.eyebrow": "For store owners",
|
||
"stores.hero.title": "Turn your counter into a modern grocery business.",
|
||
"stores.hero.lede": "Get more orders, simplify daily work, and keep every payment in your own hands.",
|
||
"stores.hero.cta": "Request a demo",
|
||
"stores.benefits.eyebrow": "Why stores choose Ordenax",
|
||
"stores.benefits.title": "Everything you need to grow",
|
||
"stores.benefits.b1.title": "More orders",
|
||
"stores.benefits.b1.body": "Reach nearby shoppers through the app and turn your store into a local online brand.",
|
||
"stores.benefits.b2.title": "Your money, your account",
|
||
"stores.benefits.b2.body": "You collect customer payments directly. We never hold your funds or take a slice of every sale.",
|
||
"stores.benefits.b3.title": "One simple screen",
|
||
"stores.benefits.b3.body": "Counter sales and app orders flow into one place — no switching between apps and notebooks.",
|
||
"stores.benefits.b4.title": "Works without internet",
|
||
"stores.benefits.b4.body": "Keep ringing sales even when the connection drops. Everything syncs automatically once you're back online.",
|
||
"stores.benefits.b5.title": "Bilingual for your team",
|
||
"stores.benefits.b5.body": "Your staff can use Arabic or English — labels, receipts, and reports switch instantly.",
|
||
"stores.benefits.b6.title": "Restock in minutes",
|
||
"stores.benefits.b6.body": "Order wholesale supplies straight from the app, with clear invoices and predictable delivery.",
|
||
"stores.pricing.eyebrow": "Pricing",
|
||
"stores.pricing.title": "Simple subscriptions, no hidden cuts",
|
||
"stores.pricing.lede": "No marketplace commission. Just pick the POS plan that fits your store.",
|
||
"stores.pricing.period": "/month",
|
||
"stores.pricing.badge": "Most popular",
|
||
"stores.pricing.p1.title": "Starter",
|
||
"stores.pricing.p1.f1": "1 store location",
|
||
"stores.pricing.p1.f2": "Counter POS",
|
||
"stores.pricing.p1.f3": "Basic reports",
|
||
"stores.pricing.p1.f4": "Email support",
|
||
"stores.pricing.p2.title": "Growth",
|
||
"stores.pricing.p2.f1": "Up to 3 staff devices",
|
||
"stores.pricing.p2.f2": "Counter + app orders",
|
||
"stores.pricing.p2.f3": "Live inventory",
|
||
"stores.pricing.p2.f4": "Priority support",
|
||
"stores.pricing.p3.title": "Enterprise",
|
||
"stores.pricing.p3.f1": "Multiple branches",
|
||
"stores.pricing.p3.f2": "Advanced analytics",
|
||
"stores.pricing.p3.f3": "Wholesale integrations",
|
||
"stores.pricing.p3.f4": "Dedicated account manager",
|
||
"stores.pricing.cta": "Choose plan",
|
||
"stores.testimonials.eyebrow": "Store stories",
|
||
"stores.testimonials.title": "Built for Saudi stores",
|
||
"stores.testimonials.t1.body": "\"We used to write every order by hand. Now we manage counter, app and wholesale orders in one place.\"",
|
||
"stores.testimonials.t1.name": "Khalid, Al-Andalus Market",
|
||
"stores.testimonials.t2.body": "\"The bilingual interface made training our staff effortless. Sales kept flowing even during network issues.\"",
|
||
"stores.testimonials.t2.name": "Sara, Fresh Corner",
|
||
"stores.testimonials.t3.body": "\"Our customers pay us directly, and the subscription is predictable. No surprises at the end of the month.\"",
|
||
"stores.testimonials.t3.name": "Omar, Daily Mart",
|
||
"stores.cta.title": "Ready to upgrade your store?",
|
||
"stores.cta.lede": "Book a 15-minute demo and see how Ordenax fits your counter.",
|
||
"stores.cta.button": "Book a demo",
|
||
|
||
// Wholesale
|
||
"wholesale.hero.eyebrow": "For suppliers and distributors",
|
||
"wholesale.hero.title": "Supply the stores that feed the Kingdom.",
|
||
"wholesale.hero.lede": "A digital wholesale channel that connects your products to neighborhood stores across Saudi Arabia.",
|
||
"wholesale.hero.cta": "Become a supplier",
|
||
"wholesale.hero.cta2": "For stores",
|
||
"wholesale.suppliers.eyebrow": "Why suppliers partner with us",
|
||
"wholesale.suppliers.title": "Reach more stores with less overhead",
|
||
"wholesale.suppliers.b1.title": "Ready store network",
|
||
"wholesale.suppliers.b1.body": "Access hundreds of active grocery stores already ordering through Ordenax.",
|
||
"wholesale.suppliers.b2.title": "Demand insights",
|
||
"wholesale.suppliers.b2.body": "See what stores are buying, when they restock, and which products move fastest.",
|
||
"wholesale.suppliers.b3.title": "Reliable logistics",
|
||
"wholesale.suppliers.b3.body": "Coordinate deliveries through your own fleet or our trusted logistics partners.",
|
||
"wholesale.suppliers.b4.title": "Clear invoices",
|
||
"wholesale.suppliers.b4.body": "Every order generates an invoice with correct VAT breakdown and payment status.",
|
||
"wholesale.suppliers.b5.title": "Digital catalog",
|
||
"wholesale.suppliers.b5.body": "Publish SKUs, photos and prices once. Stores see updates in real time.",
|
||
"wholesale.suppliers.b6.title": "Local support",
|
||
"wholesale.suppliers.b6.body": "Work with a Saudi-based team that understands retail, seasons and supply cycles.",
|
||
"wholesale.stores.eyebrow": "For stores",
|
||
"wholesale.stores.title": "Restock without the runaround",
|
||
"wholesale.stores.lede": "Find what you need, compare suppliers, and keep your shelves full — all from one screen.",
|
||
"wholesale.stores.f1": "Wide catalog of groceries, household and chilled goods",
|
||
"wholesale.stores.f2": "Competitive wholesale prices updated daily",
|
||
"wholesale.stores.f3": "Predictable delivery windows you can plan around",
|
||
"wholesale.stores.f4": "One invoice per order with clear VAT",
|
||
"wholesale.stores.cta": "See store plans",
|
||
"wholesale.stores.panel.eyebrow": "How wholesale works",
|
||
"wholesale.stores.panel.l1": "Browse catalog",
|
||
"wholesale.stores.panel.v1": "1",
|
||
"wholesale.stores.panel.l2": "Place order",
|
||
"wholesale.stores.panel.v2": "2",
|
||
"wholesale.stores.panel.l3": "Receive delivery",
|
||
"wholesale.stores.panel.v3": "3",
|
||
"wholesale.stores.panel.l4": "Pay invoice",
|
||
"wholesale.stores.panel.v4": "4",
|
||
"wholesale.faq.title": "Wholesale questions",
|
||
"wholesale.faq.q1": "Who can become a supplier?",
|
||
"wholesale.faq.a1": "Licensed distributors, manufacturers and importers of food, beverages, household or personal-care products in Saudi Arabia.",
|
||
"wholesale.faq.q2": "How do stores pay?",
|
||
"wholesale.faq.a2": "Stores pay against the supplier's invoice through agreed payment terms — bank transfer, credit or cash on delivery.",
|
||
"wholesale.faq.q3": "Do I need to list my whole catalog?",
|
||
"wholesale.faq.a3": "No. Start with your best-moving items and expand as you see demand from the network.",
|
||
"wholesale.cta.title": "Grow your wholesale reach",
|
||
"wholesale.cta.lede": "Talk to our partnerships team and see how Ordenax fits your distribution business.",
|
||
"wholesale.cta.button": "Talk to sales",
|
||
|
||
// Contact
|
||
"contact.hero.eyebrow": "Contact",
|
||
"contact.hero.title": "Let's talk grocery.",
|
||
"contact.hero.lede": "Request a demo, become a partner store, or join our supplier network.",
|
||
"contact.form.eyebrow": "Get in touch",
|
||
"contact.form.title": "Send us a message",
|
||
"contact.form.lede": "Fill in the form and our team will reply within one business day.",
|
||
"contact.form.nameLabel": "Name",
|
||
"contact.form.namePlaceholder": "Your name",
|
||
"contact.form.emailLabel": "Email",
|
||
"contact.form.emailPlaceholder": "you@example.com",
|
||
"contact.form.phoneLabel": "Phone",
|
||
"contact.form.phonePlaceholder": "+966 50 000 0000",
|
||
"contact.form.interestLabel": "I'm interested in",
|
||
"contact.form.interest.default": "Select an option",
|
||
"contact.form.interest.store": "Running my store on Ordenax",
|
||
"contact.form.interest.shopper": "Shopping as a consumer",
|
||
"contact.form.interest.supplier": "Supplying products wholesale",
|
||
"contact.form.interest.other": "Something else",
|
||
"contact.form.messageLabel": "Message",
|
||
"contact.form.messagePlaceholder": "Tell us about your business",
|
||
"contact.form.submit": "Send message",
|
||
"contact.form.success": "Thank you — we'll be in touch soon.",
|
||
"contact.form.invalidEmail": "Please enter a valid email address.",
|
||
"contact.form.required": "Please fill in all required fields.",
|
||
"contact.info.office.title": "Headquarters",
|
||
"contact.info.office.body": "Riyadh, Kingdom of Saudi Arabia",
|
||
"contact.info.email.title": "Email",
|
||
"contact.info.phone.title": "Phone",
|
||
"contact.info.hours.title": "Business hours",
|
||
"contact.info.hours.body": "Sunday to Thursday, 9:00 AM – 6:00 PM KSA",
|
||
"contact.cta.title": "Prefer to talk now?",
|
||
"contact.cta.lede": "Call us during business hours or request a callback.",
|
||
"contact.cta.button": "Call +966 9200 123 45",
|
||
},
|
||
|
||
ar: {
|
||
"nav.shoppers": "المتسوّقون",
|
||
"nav.stores": "المتاجر",
|
||
"nav.wholesale": "الجملة",
|
||
"nav.contact": "تواصل",
|
||
"nav.cta": "ابدأ الآن",
|
||
|
||
"common.learnMore": "اعرف المزيد",
|
||
"common.seeHow": "كيف تعمل",
|
||
"common.seePricing": "الأسعار",
|
||
|
||
"footer.tag": "السوق · نقاط البيع · الجملة — ثنائية اللغة من الأساس.",
|
||
"footer.product": "المنتج",
|
||
"footer.company": "الشركة",
|
||
"footer.privacy": "الخصوصية",
|
||
"footer.terms": "الشروط",
|
||
"footer.legal": "© 2026 أورديناكس. صُنع في المملكة العربية السعودية.",
|
||
|
||
"home.hero.eyebrow": "منصة بقالة سعودية",
|
||
"home.hero.title": "بقالتك من متاجر حيّك، حتى باب البيت.",
|
||
"home.hero.lede": "تسوّق، بيع، ووردّد المخزون على منصة واحدة — بالعربية والإنجليزية، متصل أو غير متصل.",
|
||
"home.hero.cta1": "ابدأ التسوّق",
|
||
"home.hero.cta2": "أدِر متجرك",
|
||
"home.hero.badge1": "ثنائية اللغة EN / AR",
|
||
"home.hero.badge2": "تعمل دون اتصال",
|
||
"home.hero.badge3": "ريال سعودي · الضريبة مشمولة",
|
||
"home.trust.label": "ثقة متاجر الأحياء في",
|
||
"home.pillars.eyebrow": "منصة واحدة، ثلاثة مكاسب",
|
||
"home.pillars.title": "مبنية لكل جانب من البقالة",
|
||
"home.pillars.m.title": "تسوّق محليًا",
|
||
"home.pillars.m.body": "بقالة طازجة من متاجر قريبة، توصيل في نفس اليوم، ومخزون يمكنك الوثوق به فعلًا.",
|
||
"home.pillars.p.title": "بيع بذكاء",
|
||
"home.pillars.p.body": "نقطة بيع واحدة تجمع مبيعات الكاشير والطلبات الإلكترونية — تستمر حتى عند انقطاع الإنترنت.",
|
||
"home.pillars.w.title": "أعِد التخزين بالجملة",
|
||
"home.pillars.w.body": "أعِد ملء الرفوف مباشرة من المورّدين، بفواتير واضحة، كتالوجات لحظية، وبدون تعقيدات المخزون.",
|
||
"home.how.eyebrow": "كيف تعمل",
|
||
"home.how.title": "من الرف إلى باب البيت في ثلاث خطوات",
|
||
"home.how.s1.title": "اطلب",
|
||
"home.how.s1.body": "يختار المتسوّق منتجات من متجر قريب — بالعربية أو الإنجليزية.",
|
||
"home.how.s2.title": "جهّز",
|
||
"home.how.s2.body": "يتلقّى المتجر الطلب ويغلّفه ويؤكّده عبر نظام أورديناكس.",
|
||
"home.how.s3.title": "وصّل",
|
||
"home.how.s3.body": "يوصل شريك التوصيل الطلب إلى الباب، ويحتفظ المتجر بالمدفوعات مباشرة.",
|
||
"home.stats.s1": "متجر شريك",
|
||
"home.stats.s2": "طلب شهريًا",
|
||
"home.stats.s3": "متوسط التوصيل",
|
||
"home.stats.s3suffix": " دقيقة",
|
||
"home.stats.s4": "لغات",
|
||
"home.testimonials.eyebrow": "ماذا يقول الشركاء",
|
||
"home.testimonials.title": "يحبّه المتاجر. ويثق به المتسوّقون.",
|
||
"home.testimonials.t1.body": "\"ضاعفنا طلباتنا الأسبوعية في شهرين. النظام بسيط وعملاؤنا يحبّون الطلب بالعربية.\"",
|
||
"home.testimonials.t1.name": "عبدالله، سوق السلام",
|
||
"home.testimonials.t2.body": "\"أستطيع التسوّق من نفس البقال الذي أزوره كل أسبوع، لكن الآن يصل إلى باب بيتي. نفس الجودة، أقل جهد.\"",
|
||
"home.testimonials.t2.name": "نورة، الرياض",
|
||
"home.testimonials.t3.body": "\"كان إعادة التخزين يتطلّب ثلاث مكالمات هاتفية. الآن نطلب مرة واحدة والفاتورة جاهزة قبل التوصيل.\"",
|
||
"home.testimonials.t3.name": "فهد، العربة الخضراء",
|
||
"home.cta.title": "جاهز للتسوّق، البيع، أو التوريد؟",
|
||
"home.cta.lede": "انضم إلى منصة البقالة المصممة للمملكة.",
|
||
"home.cta.button": "اطلب عرضًا",
|
||
|
||
// Home — deeper content
|
||
"home.why.eyebrow": "لمَ أورديناكس",
|
||
"home.why.title": "البقالة أصبحت سهلة للجميع.",
|
||
"home.why.lede": "بنينا أورديناكس على فكرة واحدة: متجر حيك يجب أن يكون سهل الوصول كأي تطبيق عالمي — وموثوق مثله.",
|
||
|
||
"home.shoppers.eyebrow": "للمتسوّقين",
|
||
"home.shoppers.title": "تسوّقك الأسبوعي، ينتهي في دقائق.",
|
||
"home.shoppers.lede": "لا ممرات مزدحمة، لا رفوف فارغة، ولا تساؤل عن موعد وصول طلبك.",
|
||
"home.shoppers.b1.title": "تسوّق من متاجر تثق بها",
|
||
"home.shoppers.b1.body": "بقالتك المفضلة، المخبوزات، ومحل الخضروات — كلها في مكان واحد.",
|
||
"home.shoppers.b2.title": "احصل عليها بسرعة",
|
||
"home.shoppers.b2.body": "توصيل في نفس اليوم خلال 25 دقيقة، لأن الطازج لا يجب أن يعني الانتظار.",
|
||
"home.shoppers.b3.title": "لا تخمّن المخزون بعد الآن",
|
||
"home.shoppers.b3.body": "إذا كان المنتج في التطبيق فهو على الرف. لا بدائل لم تطلبها.",
|
||
"home.shoppers.b4.title": "أعِد الطلب بنقرة واحدة",
|
||
"home.shoppers.b4.body": "احفظ سلتك الأسبوعية وكرّرها كلما ازدحم الوقت.",
|
||
|
||
"home.owners.eyebrow": "لأصحاب المتاجر",
|
||
"home.owners.title": "أدِر متجرك، لا أوراقك.",
|
||
"home.owners.lede": "كل ما تحتاجه لبيع المزيد، والتوتر الأقل، والحفاظ على كل ريال في حسابك.",
|
||
"home.owners.b1.title": "احتفظ بكل بيعة",
|
||
"home.owners.b1.body": "لا عمولة. لا أموال محجوزة. مدفوعات العملاء تصل إليك مباشرة.",
|
||
"home.owners.b2.title": "شاشة واحدة، كل القنوات",
|
||
"home.owners.b2.body": "مبيعات الكاشير، طلبات التطبيق، وإعادة التخزين بالجملة — كلها في نظام واحد بسيط.",
|
||
"home.owners.b3.title": "بيع حتى دون اتصال",
|
||
"home.owners.b3.body": "الإنترنت ينقطع. المبيعات لا. كل شيء يتزامن تلقائيًا بمجرد عودة الاتصال.",
|
||
"home.owners.b4.title": "نمُ دون تخمين",
|
||
"home.owners.b4.body": "مخزون لحظي، تقارير واضحة، وخط مباشر مع المتسوّقين القريبين الذين يريدون ما تبيعه.",
|
||
|
||
"shoppers.hero.eyebrow": "للمتسوّقين",
|
||
"shoppers.hero.title": "متجر حيك، الآن في جيبك.",
|
||
"shoppers.hero.lede": "اطلب البقالة الطازجة من متاجر محلية موثوقة واحصل على توصيل في نفس اليوم — بالعربية أو الإنجليزية.",
|
||
"shoppers.hero.cta": "حمّل التطبيق",
|
||
"shoppers.benefits.eyebrow": "لمَ التسوّق عبر أورديناكس",
|
||
"shoppers.benefits.title": "طازج، سريع ومألوف",
|
||
"shoppers.benefits.b1.title": "توصيل في نفس اليوم",
|
||
"shoppers.benefits.b1.body": "احصل على بقالتك في 25 دقيقة فقط من المتاجر التي تعرفها.",
|
||
"shoppers.benefits.b2.title": "مخزون حقيقي",
|
||
"shoppers.benefits.b2.body": "إذا كان المنتج في التطبيق فهو على الرف — لا مزيد من إلغاء العناصر بعد الدفع.",
|
||
"shoppers.benefits.b3.title": "ثنائي اللغة من الأساس",
|
||
"shoppers.benefits.b3.body": "بدّل بين العربية والإنجليزية في أي وقت. أسماء المنتجات والبحث والدفع يتبعانك.",
|
||
"shoppers.benefits.b4.title": "ادعم المحلي",
|
||
"shoppers.benefits.b4.body": "كل طلب يذهب مباشرة إلى متجر في مجتمعك — مالك يبقى في الحي.",
|
||
"shoppers.benefits.b5.title": "إعادة الطلب بسهولة",
|
||
"shoppers.benefits.b5.body": "كرّر قائمتك الأسبوعية بنقرة واحدة. احفظ المفضلات والسلال المجدولة للأيام المزدحمة.",
|
||
"shoppers.benefits.b6.title": "ادفع بثقة",
|
||
"shoppers.benefits.b6.body": "اختر الدفع عند الاستلام أو خيارات دفع محلية موثوقة. المتجر يتولّى الدفع مباشرة.",
|
||
"shoppers.categories.eyebrow": "كل ما تحتاجه",
|
||
"shoppers.categories.title": "من المخزن إلى الخضروات",
|
||
"shoppers.categories.lede": "تصفّح آلاف المنتجات في الفئات التي تستخدمها عائلتك يوميًا.",
|
||
"shoppers.categories.l1": "فاكهة وخضروات طازجة",
|
||
"shoppers.categories.l2": "ألبان، بيض ومنتجات مبردة",
|
||
"shoppers.categories.l3": "أرز، زيت، بهارات ومواد أساسية",
|
||
"shoppers.categories.l4": "منتجات المنزل والعناية الشخصية",
|
||
"shoppers.categories.l5": "مشروبات، خفائف ومخبوزات",
|
||
"shoppers.faq.title": "أسئلة شائعة",
|
||
"shoppers.faq.q1": "من يوصّل طلبي؟",
|
||
"shoppers.faq.a1": "المتجر الذي اخترته يجهّز الطلب وشريك توصيل محلي يأتيك به. يمكنك تتبّع الحالة في التطبيق.",
|
||
"shoppers.faq.q2": "هل يمكن الدفع نقدًا؟",
|
||
"shoppers.faq.a2": "نعم. يحصّل المتجر المدفوعات مباشرة — الدفع عند الاستلام أو الدفع الرقمي المحلي، حسب رغبتك.",
|
||
"shoppers.faq.q3": "ماذا إذا نفذ المنتج من المخزون؟",
|
||
"shoppers.faq.a3": "تُحدّث المتاجر التوفر لحظيًا. إذا تغيّر شيء، سيتواصلون معك لاقتراح بديل أو استرداد.",
|
||
"shoppers.cta.title": "طلبك الأول بانتظارك",
|
||
"shoppers.cta.lede": "حمّل التطبيق وتسوّق من المتاجر التي تثق بها.",
|
||
"shoppers.cta.button": "احصل على التطبيق",
|
||
|
||
"stores.hero.eyebrow": "لأصحاب المتاجر",
|
||
"stores.hero.title": "حوّل كاشيرك إلى أعمال بقالة عصرية.",
|
||
"stores.hero.lede": "احصل على مزيد من الطلبات، بسّط العمل اليومي، وابقَ المدفوعات في يدك.",
|
||
"stores.hero.cta": "اطلب عرضًا",
|
||
"stores.benefits.eyebrow": "لمَ تختار المتاجر أورديناكس",
|
||
"stores.benefits.title": "كل ما تحتاجه للنمو",
|
||
"stores.benefits.b1.title": "مزيد من الطلبات",
|
||
"stores.benefits.b1.body": "وصل إلى المتسوّقين القريبين عبر التطبيق وحوّل متجرك إلى علامة محلية إلكترونية.",
|
||
"stores.benefits.b2.title": "مالك، حسابك",
|
||
"stores.benefits.b2.body": "تحصّل مدفوعات العملاء مباشرة. لا نحتفظ بأموالك ولا نأخذ نسبة من كل بيعة.",
|
||
"stores.benefits.b3.title": "شاشة واحدة بسيطة",
|
||
"stores.benefits.b3.body": "تتدفق مبيعات الكاشير وطلبات التطبيق في مكان واحد — لا حاجة للتنقل بين التطبيقات والدفاتر.",
|
||
"stores.benefits.b4.title": "تعمل دون اتصال",
|
||
"stores.benefits.b4.body": "واصل البيع حتى عند انقطاع الاتصال. كل شيء يتزامن تلقائيًا بمجرد عودة الاتصال.",
|
||
"stores.benefits.b5.title": "ثنائية اللغة لفريقك",
|
||
"stores.benefits.b5.body": "يمكن لموظفيك استخدام العربية أو الإنجليزية — الملصقات والفواتير والتقارير تتبدّل فورًا.",
|
||
"stores.benefits.b6.title": "أعِد التخزين في دقائق",
|
||
"stores.benefits.b6.body": "اطلب مستلزمات الجملة مباشرة من التطبيق، بفواتير واضحة وتوصيل متوقع.",
|
||
"stores.pricing.eyebrow": "الأسعار",
|
||
"stores.pricing.title": "اشتراكات بسيطة، بدون عمولات خفية",
|
||
"stores.pricing.lede": "لا توجد عمولة سوق. اختر خطة نقاط البيع التي تناسب متجرك.",
|
||
"stores.pricing.period": "/شهر",
|
||
"stores.pricing.badge": "الأكثر شيوعًا",
|
||
"stores.pricing.p1.title": "البداية",
|
||
"stores.pricing.p1.f1": "موقع متجر واحد",
|
||
"stores.pricing.p1.f2": "نقطة بيع للكاشير",
|
||
"stores.pricing.p1.f3": "تقارير أساسية",
|
||
"stores.pricing.p1.f4": "دعم عبر البريد",
|
||
"stores.pricing.p2.title": "النمو",
|
||
"stores.pricing.p2.f1": "حتى 3 أجهزة موظفين",
|
||
"stores.pricing.p2.f2": "كاشير + طلبات التطبيق",
|
||
"stores.pricing.p2.f3": "مخزون مباشر",
|
||
"stores.pricing.p2.f4": "دعم أولوي",
|
||
"stores.pricing.p3.title": "المؤسسات",
|
||
"stores.pricing.p3.f1": "فروع متعددة",
|
||
"stores.pricing.p3.f2": "تحليلات متقدمة",
|
||
"stores.pricing.p3.f3": "تكاملات الجملة",
|
||
"stores.pricing.p3.f4": "مدير حساب مخصص",
|
||
"stores.pricing.cta": "اختر الخطة",
|
||
"stores.testimonials.eyebrow": "قصص المتاجر",
|
||
"stores.testimonials.title": "مبنية للمتاجر السعودية",
|
||
"stores.testimonials.t1.body": "\"كنّا نكتب كل طلب يدويًا. الآن ندير طلبات الكاشير والتطبيق والجملة في مكان واحد.\"",
|
||
"stores.testimonials.t1.name": "خالد، سوق الأندلس",
|
||
"stores.testimonials.t2.body": "\"الواجهة الثنائية اللغة جعلت تدريب موظفينا سهلًا. المبيعات استمرت حتى أثناء مشاكل الشبكة.\"",
|
||
"stores.testimonials.t2.name": "سارة، فريش كورنر",
|
||
"stores.testimonials.t3.body": "\"عملاؤنا يدفعون لنا مباشرة، والاشتراك متوقع. لا مفاجآت في نهاية الشهر.\"",
|
||
"stores.testimonials.t3.name": "عمر، دايلي مارت",
|
||
"stores.cta.title": "جاهز لترقية متجرك؟",
|
||
"stores.cta.lede": "احجز عرضًا مدته 15 دقيقة وشاهد كيف تناسب أورديناكس كاشيرك.",
|
||
"stores.cta.button": "احجز عرضًا",
|
||
|
||
"wholesale.hero.eyebrow": "للمورّدين والموزعين",
|
||
"wholesale.hero.title": "زوّد المتاجر التي تغذّي المملكة.",
|
||
"wholesale.hero.lede": "قناة جملة رقمية تربط منتجاتك بمتاجر الأحياء في جميع أنحاء المملكة العربية السعودية.",
|
||
"wholesale.hero.cta": "كن مورّدًا",
|
||
"wholesale.hero.cta2": "للمتاجر",
|
||
"wholesale.suppliers.eyebrow": "لمَ يتعاون المورّدون معنا",
|
||
"wholesale.suppliers.title": "وصل إلى مزيد من المتاجر بتكاليف أقل",
|
||
"wholesale.suppliers.b1.title": "شبكة متاجر جاهزة",
|
||
"wholesale.suppliers.b1.body": "وصول إلى مئات المتاجر النشطة التي تطلب بالفعل عبر أورديناكس.",
|
||
"wholesale.suppliers.b2.title": "رؤى الطلب",
|
||
"wholesale.suppliers.b2.body": "اعرف ما تشتريه المتاجر، ومتى تعيد التخزين، والمنتجات الأسرع مبيعًا.",
|
||
"wholesale.suppliers.b3.title": "خدمات لوجستية موثوقة",
|
||
"wholesale.suppliers.b3.body": "نسّق التوصيلات عبر أسطولك الخاص أو شركائنا اللوجستيين الموثوقين.",
|
||
"wholesale.suppliers.b4.title": "فواتير واضحة",
|
||
"wholesale.suppliers.b4.body": "يولّد كل طلب فاتورة بتوضيح الضريبة وحالة الدفع.",
|
||
"wholesale.suppliers.b5.title": "كتالوج رقمي",
|
||
"wholesale.suppliers.b5.body": "انشر الأصناف والصور والأسعار مرة واحدة. ترى المتاجر التحديثات لحظيًا.",
|
||
"wholesale.suppliers.b6.title": "دعم محلي",
|
||
"wholesale.suppliers.b6.body": "اعمل مع فريق سعودي يفهم التجزئة والمواسم ودورات التوريد.",
|
||
"wholesale.stores.eyebrow": "للمتاجر",
|
||
"wholesale.stores.title": "أعِد التخزين دون عناء",
|
||
"wholesale.stores.lede": "اعثر على ما تحتاجه، قارن بين المورّدين، وابقَ رفوفك ممتلئة — كل ذلك من شاشة واحدة.",
|
||
"wholesale.stores.f1": "كتالوج واسع من البقالة والمنزل والمنتجات المبردة",
|
||
"wholesale.stores.f2": "أسعار جملة تنافسية تُحدّث يوميًا",
|
||
"wholesale.stores.f3": "نوافذ توصيل متوقعة يمكنك التخطيط حولها",
|
||
"wholesale.stores.f4": "فاتورة واحدة لكل طلب بضريبة واضحة",
|
||
"wholesale.stores.cta": "انظر خطط المتاجر",
|
||
"wholesale.stores.panel.eyebrow": "كيف تعمل الجملة",
|
||
"wholesale.stores.panel.l1": "تصفّح الكتالوج",
|
||
"wholesale.stores.panel.v1": "1",
|
||
"wholesale.stores.panel.l2": "قدّم الطلب",
|
||
"wholesale.stores.panel.v2": "2",
|
||
"wholesale.stores.panel.l3": "استلم التوصيل",
|
||
"wholesale.stores.panel.v3": "3",
|
||
"wholesale.stores.panel.l4": "ادفع الفاتورة",
|
||
"wholesale.stores.panel.v4": "4",
|
||
"wholesale.faq.title": "أسئلة الجملة",
|
||
"wholesale.faq.q1": "من يمكنه أن يصبح مورّدًا؟",
|
||
"wholesale.faq.a1": "موزّعون ومصنّعون ومستوردون مرخّصون لمنتجات غذائية أو مشروبات أو منزلية أو عناية شخصية في المملكة العربية السعودية.",
|
||
"wholesale.faq.q2": "كيف تدفع المتاجر؟",
|
||
"wholesale.faq.a2": "تدفع المتاجر بناءً على فاتورة المورّد وفق شروط دفع متفق عليها — تحويل بنكي أو ائتمان أو دفع عند الاستلام.",
|
||
"wholesale.faq.q3": "هل عليّ إدراج كامل كتالوجي؟",
|
||
"wholesale.faq.a3": "لا. ابدأ بأكثر منتجاتك مبيعًا ووسّع مع رؤية الطلب من الشبكة.",
|
||
"wholesale.cta.title": "وسّع نطاق جملتك",
|
||
"wholesale.cta.lede": "تحدث إلى فريق الشراكات وشاهد كيف تناسب أورديناكس أعمال التوزيع لديك.",
|
||
"wholesale.cta.button": "تحدث إلى المبيعات",
|
||
|
||
"contact.hero.eyebrow": "تواصل",
|
||
"contact.hero.title": "لنتحدث عن البقالة.",
|
||
"contact.hero.lede": "اطلب عرضًا، كن متجرًا شريكًا، أو انضم إلى شبكة مورّدينا.",
|
||
"contact.form.eyebrow": "تواصل معنا",
|
||
"contact.form.title": "أرسل لنا رسالة",
|
||
"contact.form.lede": "املأ النموذج وسيردّ فريقنا خلال يوم عمل واحد.",
|
||
"contact.form.nameLabel": "الاسم",
|
||
"contact.form.namePlaceholder": "اسمك",
|
||
"contact.form.emailLabel": "البريد الإلكتروني",
|
||
"contact.form.emailPlaceholder": "you@example.com",
|
||
"contact.form.phoneLabel": "الهاتف",
|
||
"contact.form.phonePlaceholder": "+966 50 000 0000",
|
||
"contact.form.interestLabel": "أنا مهتم بـ",
|
||
"contact.form.interest.default": "اختر خيارًا",
|
||
"contact.form.interest.store": "تشغيل متجري على أورديناكس",
|
||
"contact.form.interest.shopper": "التسوّق كمستهلك",
|
||
"contact.form.interest.supplier": "توريد منتجات بالجملة",
|
||
"contact.form.interest.other": "شيء آخر",
|
||
"contact.form.messageLabel": "الرسالة",
|
||
"contact.form.messagePlaceholder": "أخبرنا عن عملك",
|
||
"contact.form.submit": "إرسال الرسالة",
|
||
"contact.form.success": "شكرًا لك — سنتواصل معك قريبًا.",
|
||
"contact.form.invalidEmail": "يرجى إدخال بريد إلكتروني صحيح.",
|
||
"contact.form.required": "يرجى ملء جميع الحقول المطلوبة.",
|
||
"contact.info.office.title": "المقر الرئيسي",
|
||
"contact.info.office.body": "الرياض، المملكة العربية السعودية",
|
||
"contact.info.email.title": "البريد الإلكتروني",
|
||
"contact.info.phone.title": "الهاتف",
|
||
"contact.info.hours.title": "ساعات العمل",
|
||
"contact.info.hours.body": "من الأحد إلى الخميس، 9:00 ص – 6:00 م بتوقيت السعودية",
|
||
"contact.cta.title": "تفضّل التحدث الآن؟",
|
||
"contact.cta.lede": "اتصل بنا خلال ساعات العمل أو اطلب معاودة الاتصال.",
|
||
"contact.cta.button": "اتصل +966 9200 123 45",
|
||
},
|
||
};
|
||
|
||
const TITLES = {
|
||
home: { en: "Ordenax — Groceries from your local stores, delivered", ar: "أورديناكس — بقالتك من متاجر حيّك، حتى باب البيت" },
|
||
shoppers: { en: "For shoppers — Ordenax", ar: "للمتسوّقين — أورديناكس" },
|
||
stores: { en: "For stores — Ordenax", ar: "للمتاجر — أورديناكس" },
|
||
wholesale: { en: "Wholesale supply — Ordenax", ar: "التوريد بالجملة — أورديناكس" },
|
||
contact: { en: "Contact — Ordenax", ar: "تواصل — أورديناكس" },
|
||
};
|
||
|
||
const html = document.documentElement;
|
||
const body = document.body;
|
||
const toggle = document.getElementById("lang-toggle");
|
||
const header = document.querySelector(".site-header");
|
||
const menuToggle = document.querySelector(".menu-toggle");
|
||
const mobileNav = document.getElementById("mobile-nav");
|
||
const page = body.dataset.page || "home";
|
||
|
||
function applyLang(lang) {
|
||
const dict = STRINGS[lang];
|
||
html.lang = lang;
|
||
html.dir = lang === "ar" ? "rtl" : "ltr";
|
||
document.title = (TITLES[page] && TITLES[page][lang]) || TITLES.home[lang];
|
||
|
||
document.querySelectorAll("[data-i18n]").forEach((el) => {
|
||
const key = el.getAttribute("data-i18n");
|
||
if (dict[key] !== undefined) el.textContent = dict[key];
|
||
});
|
||
document.querySelectorAll("[data-i18n-placeholder]").forEach((el) => {
|
||
const key = el.getAttribute("data-i18n-placeholder");
|
||
if (dict[key] !== undefined) el.setAttribute("placeholder", dict[key]);
|
||
});
|
||
|
||
toggle.textContent = lang === "ar" ? "English" : "العربية";
|
||
localStorage.setItem("ordenax-lang", lang);
|
||
}
|
||
|
||
let lang = localStorage.getItem("ordenax-lang") || "ar";
|
||
applyLang(lang);
|
||
|
||
function refreshHeroReveal() {
|
||
if (!heroTitle || page !== "home") return;
|
||
heroTitle.classList.remove("text-reveal");
|
||
const text = heroTitle.textContent;
|
||
heroTitle.innerHTML = text
|
||
.split(/(\s+)/)
|
||
.map((word, i) => (word.trim() ? `<span class="word" style="animation-delay: ${0.25 + i * 0.08}s">${word}</span>` : word))
|
||
.join("");
|
||
heroTitle.classList.add("text-reveal");
|
||
}
|
||
|
||
toggle.addEventListener("click", () => {
|
||
body.classList.add("is-switching-lang");
|
||
setTimeout(() => {
|
||
lang = html.lang === "ar" ? "en" : "ar";
|
||
applyLang(lang);
|
||
refreshHeroReveal();
|
||
body.classList.remove("is-switching-lang");
|
||
}, 120);
|
||
});
|
||
|
||
/* Current page nav highlight */
|
||
document.querySelectorAll('.nav a[href], .mobile-nav a[href]').forEach((a) => {
|
||
const href = a.getAttribute("href").replace('.html', '');
|
||
if (href === page || (page === 'home' && href === 'index')) {
|
||
a.setAttribute("aria-current", "page");
|
||
}
|
||
});
|
||
|
||
/* Mobile nav */
|
||
function closeMobileNav() {
|
||
mobileNav.classList.remove("is-open");
|
||
menuToggle.setAttribute("aria-expanded", "false");
|
||
mobileNav.setAttribute("aria-hidden", "true");
|
||
body.style.overflow = "";
|
||
}
|
||
menuToggle.addEventListener("click", () => {
|
||
const open = !mobileNav.classList.contains("is-open");
|
||
if (open) {
|
||
mobileNav.classList.add("is-open");
|
||
menuToggle.setAttribute("aria-expanded", "true");
|
||
mobileNav.setAttribute("aria-hidden", "false");
|
||
body.style.overflow = "hidden";
|
||
} else {
|
||
closeMobileNav();
|
||
}
|
||
});
|
||
mobileNav.querySelectorAll("a").forEach((a) => a.addEventListener("click", closeMobileNav));
|
||
|
||
/* Header show/hide on scroll */
|
||
let lastScrollY = 0;
|
||
let ticking = false;
|
||
function onScroll() {
|
||
const y = window.scrollY;
|
||
if (y > 20) header.classList.add("is-scrolled");
|
||
else header.classList.remove("is-scrolled");
|
||
|
||
if (y > lastScrollY && y > 120) header.classList.add("is-hidden");
|
||
else header.classList.remove("is-hidden");
|
||
lastScrollY = y;
|
||
ticking = false;
|
||
}
|
||
window.addEventListener("scroll", () => {
|
||
if (!ticking) { window.requestAnimationFrame(onScroll); ticking = true; }
|
||
}, { passive: true });
|
||
|
||
/* Hero entrance */
|
||
document.querySelectorAll(".hero").forEach((hero) => {
|
||
hero.classList.add("is-ready");
|
||
});
|
||
|
||
/* Scroll reveal */
|
||
const observer = new IntersectionObserver((entries) => {
|
||
entries.forEach((entry) => {
|
||
if (entry.isIntersecting) {
|
||
entry.target.classList.add("is-visible");
|
||
if (entry.target.dataset.animate === "stat") animateCounter(entry.target);
|
||
observer.unobserve(entry.target);
|
||
}
|
||
});
|
||
}, { threshold: 0.15, rootMargin: "0px 0px -40px 0px" });
|
||
|
||
document.querySelectorAll('[data-animate="card"], [data-animate="step"], [data-animate="fade"], [data-animate="stat"]').forEach((el) => {
|
||
observer.observe(el);
|
||
});
|
||
|
||
/* Stagger cards within grids */
|
||
document.querySelectorAll(".grid").forEach((grid) => {
|
||
grid.querySelectorAll(".reveal").forEach((el, i) => {
|
||
el.style.transitionDelay = `${i * 80}ms`;
|
||
});
|
||
});
|
||
|
||
/* Counter animation */
|
||
function animateCounter(stat) {
|
||
const numEl = stat.querySelector(".stat-number");
|
||
const target = parseInt(numEl.dataset.target, 10);
|
||
if (Number.isNaN(target)) return;
|
||
let start = 0;
|
||
const duration = 1600;
|
||
const startTime = performance.now();
|
||
function step(now) {
|
||
const progress = Math.min((now - startTime) / duration, 1);
|
||
const ease = 1 - Math.pow(1 - progress, 3);
|
||
numEl.textContent = Math.floor(start + (target - start) * ease).toString();
|
||
if (progress < 1) requestAnimationFrame(step);
|
||
}
|
||
requestAnimationFrame(step);
|
||
}
|
||
|
||
/* Contact form */
|
||
const contactForm = document.getElementById("contact-form");
|
||
if (contactForm) {
|
||
const note = document.getElementById("form-note");
|
||
contactForm.addEventListener("submit", (event) => {
|
||
event.preventDefault();
|
||
const dict = STRINGS[html.lang];
|
||
const email = contactForm.email.value.trim();
|
||
const name = contactForm.name.value.trim();
|
||
const interest = contactForm.interest.value;
|
||
if (!name || !email || !interest) {
|
||
note.textContent = dict["contact.form.required"];
|
||
return;
|
||
}
|
||
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
|
||
note.textContent = dict["contact.form.invalidEmail"];
|
||
contactForm.email.focus();
|
||
return;
|
||
}
|
||
note.textContent = dict["contact.form.success"];
|
||
contactForm.reset();
|
||
});
|
||
}
|
||
|
||
/* Parallax scroll */
|
||
const parallaxElements = document.querySelectorAll("[data-parallax]");
|
||
if (parallaxElements.length && !window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
|
||
let parallaxTicking = false;
|
||
function updateParallax() {
|
||
const y = window.scrollY;
|
||
parallaxElements.forEach((el) => {
|
||
const speed = parseFloat(el.dataset.parallax) || 0.1;
|
||
const offset = y * speed;
|
||
el.style.transform = `translate3d(0, ${offset}px, 0)`;
|
||
});
|
||
parallaxTicking = false;
|
||
}
|
||
window.addEventListener("scroll", () => {
|
||
if (!parallaxTicking) {
|
||
window.requestAnimationFrame(updateParallax);
|
||
parallaxTicking = true;
|
||
}
|
||
}, { passive: true });
|
||
}
|
||
|
||
/* Hero word-by-word reveal on home */
|
||
const heroTitle = document.querySelector(".hero-apple .hero-title");
|
||
refreshHeroReveal();
|