/* ====================================================================== * ناتوريد (naturedcosmetic.com) — ثيم ساجي * بينلصق: سلة ← تصميم المتجر ← JavaScript مخصص (استبدال كامل) * كل شي تحت مشروط بوجود عنصرو، فما بيأثر على الصفحات التانية. * ====================================================================== */ /** * أدوات مشتركة (window.ntShop) * ----------------------------------------------------------------------- * اللغة: عربي بس حاليًا (AR = true). النصوص مكتوبة t(["عربي", "English"]) عشان الإنجليزي يرجع بسطر واحد. */ (function () { "use strict"; var p = location.pathname; // الموقع عربي بس حاليًا (طلب المستخدم 2026-10-10) — النصوص الإنجليزية موجودة بالكود بس ما بتطلع. // لما ينفتح الإنجليزي: رجّع السطر اللي تحت بدل AR = true // var AR = /^\/en(\/|$)/i.test(p) ? false : /^\/ar(\/|$)/i.test(p) ? true : !/^en/i.test(document.documentElement.lang || "ar"); var AR = true; var DIG = { "٠": 0, "١": 1, "٢": 2, "٣": 3, "٤": 4, "٥": 5, "٦": 6, "٧": 7, "٨": 8, "٩": 9 }; window.ntShop = { AR: AR, t: function (x) { return AR ? x[0] : x[1]; }, esc: function (s) { return String(s == null ? "" : s).replace(/[&<>"]/g, function (c) { return { "&": "&", "<": "<", ">": ">", '"': """ }[c]; }); }, // رقم من نص سعر («98»، «١٦٤٫٥٠»، «1,250.00 ر.س») num: function (el) { if (!el) return 0; var s = String(el.textContent || el).replace(/[٠-٩]/g, function (d) { return DIG[d]; }).replace(/٫/g, ".").replace(/[^\d.]/g, ""); return parseFloat(s) || 0; }, // 98 مش 98.00 — و66.5 بتضل 66.5 fmt: function (n) { return String(Math.round(n * 100) / 100); }, // نسبة الخصم لتحت (40.2 ← 40) حتى ما نوعد بأكتر من الحقيقي pct: function (price, regular) { return regular > price && price > 0 ? Math.floor((1 - price / regular) * 100 + 0.05) : 0; }, ready: function (fn) { if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", fn); else fn(); } }; })(); /** * الرئيسية: علامة مبكّرة * ----------------------------------------------------------------------- * nt-home-on على قبل ما الصفحة تجهز، حتى بلوكات الثيم اللي بدّلناها تنخفى بلا وميض (natured.css). * إذا «الرئيسية» تحت ما لقت home.html ملصوق بالصفحة، بتشيل العلامة وبترجع رئيسية الثيم. */ (function () { "use strict"; if (/^\/(ar|en)?\/?$/i.test(location.pathname)) document.documentElement.classList.add("nt-home-on"); })(); /** * الخط: أوزان تجوال التقيلة + خط العناوين (Baloo Bhaijaan 2، قريب من خط بنرات ناتوريد) * ----------------------------------------------------------------------- * الثيم بيحمّل تجوال بوزن 400 بس، فالعناوين العريضة بتطلع «مزيّفة» (المتصفح بيسمّكها). */ (function () { "use strict"; if (document.querySelector("link[data-nt-font]")) return; var l = document.createElement("link"); l.rel = "stylesheet"; l.href = "https://fonts.googleapis.com/css2?family=Tajawal:wght@500;700;800;900&family=Baloo+Bhaijaan+2:wght@700;800&display=swap"; l.setAttribute("data-nt-font", ""); document.head.appendChild(l); })(); /** * شارة الخصم * ----------------------------------------------------------------------- * نسبة الخصم محسوبة من السعرين (مش من نص «العرض» اليدوي بسلة): * - كروت المنتجات بكل الموقع (بتنرسم بالـJS، لهيك MutationObserver) * - صورة صفحة المنتج */ (function () { "use strict"; var S = window.ntShop; if (!S) return; function badge(host, pct, extra) { var b = host.querySelector(":scope > .nt-pct"); if (!pct) { if (b) b.remove(); return; } if (!b) { b = document.createElement("span"); b.className = "nt-pct" + (extra || ""); host.appendChild(b); } var txt = "-" + pct + "%"; if (b.textContent !== txt) b.textContent = txt; } function cards() { var list = document.querySelectorAll("custom-salla-product-card"); for (var i = 0; i < list.length; i++) { var c = list[i], img = c.querySelector(".product-entry__image"); if (!img) continue; var was = c.querySelector(".before-price"), now = c.querySelector(".total-price"); badge(img, was && now ? S.pct(S.num(now), S.num(was)) : 0); } } function productPage() { if (!document.body.classList.contains("product-single")) return; var host = document.querySelector(".saji-pdp__gallery .saji-pdp__slider"), box = document.querySelector(".saji-pdp__price-display .price_is_on_sale"); if (!host || !box || box.classList.contains("hidden")) return; badge(host, S.pct(S.num(box.querySelector(".total-price")), S.num(box.querySelector(".before-price"))), " nt-pct--pdp"); } function run() { cards(); productPage(); } var timer = null; function queue() { if (!timer) timer = setTimeout(function () { timer = null; run(); }, 150); } S.ready(function () { run(); if (window.MutationObserver) new MutationObserver(queue).observe(document.body, { childList: true, subtree: true }); }); })(); /** * ضمانات صفحة المنتج (بعمود المعلومات، تحت السعر) * ----------------------------------------------------------------------- * مكانها فوق مع الاسم والسعر — مش جوّا صندوق الشراء (هداك شريط عايم، بيتزاحم مع الأزرار). * بس اللي إلو مصدر: * - «منتج أصلي»: المتجر الرسمي للعلامة * - التقسيط: بيطلع بس إذا مكوّن التقسيط (تمارا/تابي) موجود بالصفحة * - واتساب: نفس رقم الزر العايم بالموقع * ممنوع وعود شحن أو استرجاع هون قبل ما تنقرا السياسة. */ (function () { "use strict"; var S = window.ntShop; if (!S) return; var t = S.t; function run() { if (!document.body.classList.contains("product-single")) return true; var info = document.querySelector(".saji-pdp__info"); if (!info) return false; if (info.querySelector(".nt-trust")) return true; // تحت السعر وحالة التوفّر، قبل الوصف var after = info.querySelector(".saji-pdp__stock") || info.querySelector(".saji-pdp__tax") || info.querySelector(".saji-pdp__price-display"); if (!after) return false; var wa = document.querySelector('#whatsapp-up a[href*="whatsapp"]'); var items = ['' + t(["منتج أصلي من ناتوريد", "Genuine NatuRed product"]) + ""]; if (document.querySelector("salla-installment")) items.push('' + t(["4 دفعات بدون فوائد", "4 interest-free payments"]) + ""); if (wa) items.push('' + t(["اسألينا على واتساب", "Ask us on WhatsApp"]) + ""); var el = document.createElement("div"); el.className = "nt-trust"; el.innerHTML = items.join(""); after.parentNode.insertBefore(el, after.nextSibling); return true; } S.ready(function () { if (run()) return; var n = 0, iv = setInterval(function () { if (run() || ++n > 20) clearInterval(iv); }, 300); }); })(); /** * محتوى A+ (قسم بعرض الشاشة تحت تفاصيل المنتج) * ----------------------------------------------------------------------- * منتج جديد = مدخلة جديدة بـ APLUS (المفتاح رقم المنتج). غير هيك ما بيطلعلو قسم. * - كل النصوص من وصف المنتج نفسه بسلة — ممنوع ادعاء مش مكتوب هناك. * - السعر بينقرا من الصفحة وقتها (مش مكتوب باليد)، فأي تغيير بسلة بينعكس لحالو. * - الحركة: مسرح 3D (طفو + ميلان مع الماوس + قلب «افتحي البوكس») وظهور مع السكرول. المكوّنات شبكة ثابتة (الدوّامة انشالت: كانت بتخبّي أغلب الكروت). * - النص بصيغة المؤنث لأنو هيك لغة المتجر («دلّلي نفسك»). */ (function () { "use strict"; var S = window.ntShop; if (!S) return; var t = S.t, esc = S.esc; // صور سلة عبر مصغّر الـCDN (نفس اللي بيستعملو الثيم): ~25KB بدل ~570KB للصورة الأصلية var CDN = "https://cdn.salla.sa/cdn-cgi/image/fit=scale-down,width=800,onerror=redirect,format=auto/QzBNv/"; var APLUS = { // مجموعة ناتوريد للعناية (بوكس: مقوي أظافر + سيروم هيالورونيك) 624400994: { closed: CDN + "fa35e146-7b2e-4594-974a-bffccb3f90a5-800.28530670471x1000-6KFSkw6DCzbb3OUq8ZSgTPFDwZcKiS53Bqt5DVNz.png", open: CDN + "22b73844-cc4a-41dd-8181-3eed7976ef3b-800.28530670471x1000-qVfic4ccXdapQ6yWk5tygbqURwU5onADZsIlbWr9.png", eyebrow: ["بوكس ناتوريد للعناية والتألق", "The NatuRed Care & Glow Box"], title: ["عناية لأظافرك وبشرتك", "Care for your nails and skin"], titleEm: ["في بوكس واحد", "in one box"], lead: [ "مقوي أظافر ناتوريد مع سيروم هيالورونيك أسيد ناتوريد — أساسيات عنايتك اليومية بلمسة فاخرة، لكِ أو هدية لمن تحبين.", "NatuRed Nail Hardener with NatuRed Hyaluronic Acid Serum — your daily care essentials with a luxurious touch, for you or as a gift." ], mini: [["قطعتان في بوكس واحد", "Two pieces in one box"], ["جاهز للإهداء", "Gift-ready"]], miniPay: ["4 دفعات بدون فوائد", "4 interest-free payments"], openLabel: ["افتحي البوكس", "Open the box"], closeLabel: ["أغلقي البوكس", "Close the box"], // عبارات الشريط المتحرك — كلها من وصف المنتج (والأخيرتين الجملة المطبوعة على البوكس) marquee: [["قطعتان في بوكس واحد", "Two pieces in one box"], ["مقوي أظافر ناتوريد", "NatuRed Nail Hardener"], ["سيروم هيالورونيك أسيد", "Hyaluronic Acid Serum"], ["جاهز للإهداء", "Gift-ready"], ["ابقي طبيعية", "Stay Natural."], ["ابقي متألقة", "Stay Glowing."]], // ملخّص بصري بعمود المعلومات بدل الوصف الطويل (التفاصيل كلها تحت بالقسم) sum: { lead: ["قطعتان في بوكس واحد: عناية للأظافر وعناية للبشرة.", "Two pieces in one box: care for nails and care for skin."], more: ["شاهدي كل التفاصيل", "See all the details"] }, inside: { tag: ["محتويات البوكس", "What's inside"], title: ["قطعتان… وروتين عناية متكامل", "Two pieces. One complete care routine"], sub: ["بوكس عملي وأنيق يجمع العناية بالأظافر والبشرة.", "A practical, elegant box for nail and skin care."], items: [ { cls: "serum", pid: 1521157829, who: ["للبشرة", "For skin"], short: ["ترطيب عميق وإشراقة صحية", "Deep hydration and a healthy glow"], name: ["سيروم هيالورونيك أسيد ناتوريد", "NatuRed Hyaluronic Acid Serum"], text: ["سيروم النضارة المعزز بحمض الهيالورونيك، يمنح البشرة ترطيبًا عميقًا وإشراقة صحية وملمسًا ناعمًا.", "A radiance serum enriched with hyaluronic acid for deep hydration, a healthy glow and a soft feel."], tags: [["حمض الهيالورونيك", "Hyaluronic acid"], ["فيتامين B5", "Vitamin B5"], ["فيتامين C", "Vitamin C"]], use: ["بعد غسل الوجه، ضعي كمية مناسبة على راحة يدك ووزعيها على كامل الوجه والرقبة مع التدليك بلطف حتى تمتصه البشرة.", "After washing your face, put a suitable amount in your palm and spread it over the whole face and neck, massaging gently until absorbed."] }, { cls: "nail", pid: 249878975, who: ["للأظافر", "For nails"], short: ["تقوية الأظافر وتغذيتها", "Strengthens and nourishes nails"], name: ["مقوي أظافر ناتوريد", "NatuRed Nail Hardener"], text: ["معزز بالأحماض الأمينية والكيراتين، يعمل على تقوية الأظافر وتغذيتها ويمنحها مظهرًا صحيًا لامعًا.", "Enriched with amino acids and keratin to strengthen and nourish nails and give them a healthy, glossy look."], tags: [["كيراتين", "Keratin"], ["أحماض أمينية", "Amino acids"]], use: ["ضعي طبقة رقيقة من مقوي ناتوريد على الأظافر 3 إلى 4 مرات في الأسبوع.", "Apply a thin layer of NatuRed hardener to your nails 3 to 4 times a week."] } ] }, ingr: { tag: ["المكوّنات", "Ingredients"], title: ["ما الذي بداخل التركيبة؟", "What's in the formula?"], sub: ["خمسة مكوّنات أساسية مذكورة في وصف المنتجين.", "Five key ingredients named in the two products' descriptions."], list: [ { sym: "01", name: ["حمض الهيالورونيك", "Hyaluronic acid"], text: ["ترطيب عميق وإشراقة صحية", "Deep hydration and a healthy glow"], of: ["السيروم", "Serum"] }, { sym: "02", name: ["الكيراتين", "Keratin"], text: ["تقوية الأظافر وتغذيتها", "Strengthens and nourishes nails"], of: ["مقوي الأظافر", "Nail hardener"] }, { sym: "03", name: ["فيتامين B5", "Vitamin B5"], text: ["ضمن تركيبة السيروم لنضارة البشرة", "In the serum formula for skin radiance"], of: ["السيروم", "Serum"] }, { sym: "04", name: ["الأحماض الأمينية", "Amino acids"], text: ["أظافر غير هشّة بمظهر لامع", "Less brittle nails with a glossy look"], of: ["مقوي الأظافر", "Nail hardener"] }, { sym: "05", name: ["فيتامين C", "Vitamin C"], text: ["ضمن تركيبة السيروم لملمس ناعم", "In the serum formula for a soft feel"], of: ["السيروم", "Serum"] } ] }, routine: { tag: ["طريقة الاستخدام", "How to use"], title: ["روتينك في خطوات بسيطة", "Your routine in simple steps"], cols: [ { cls: "", name: ["البشرة", "Skin"], when: ["بعد غسل الوجه", "After cleansing"], steps: [["اغسلي وجهك", "Wash your face"], ["ضعي كمية مناسبة من السيروم على راحة يدك", "Put a suitable amount of serum in your palm"], ["وزعيها على كامل الوجه والرقبة", "Spread it over the whole face and neck"], ["دلّكي بلطف حتى تمتصه البشرة", "Massage gently until absorbed"]] }, { cls: " nt-ap-panel--o", name: ["الأظافر", "Nails"], when: ["3 إلى 4 مرات في الأسبوع", "3 to 4 times a week"], steps: [["ضعي طبقة رقيقة من مقوي ناتوريد على الأظافر", "Apply a thin layer of NatuRed hardener to your nails"], ["كرّري ذلك 3 إلى 4 مرات في الأسبوع", "Repeat 3 to 4 times a week"]] } ] }, // قيمة القطعتين منفردتين: الأسعار بتنجاب وقتها من سلة (pid فوق)، والقسم ما بيطلع إلا إذا المجموع أعلى من سعر البوكس value: { tag: ["القيمة", "The value"], title: ["قطعتان… بسعر أقل", "Two pieces for less"], sum: ["سعرهما منفردتين", "Bought separately"], box: ["سعر البوكس", "Box price"], save: ["توفيرك", "You save"] }, // آراء حقيقية منشورة بالمتجر (reviews_list type=testimonial، 5 نجوم) — آراء عن المتجر ومنتجاتو، مش عن البوكس تحديدًا reviews: { tag: ["آراء عميلات ناتوريد", "NatuRed customers"], title: ["من تجاربهن مع ناتوريد", "From their experience with NatuRed"], list: [ { text: "يجنن يقوي الاظافر ويطولها بشكل فضيع", name: ["وفاء", "Wafa"], city: ["الدمام", "Dammam"] }, { text: "رائع وتعاملهم راقي والمنتج ممتاز جدا رجعت طلبته ثاني", name: ["ابتسام", "Ibtisam"], city: ["المدينة المنورة", "Madinah"] }, { text: "رائع وسريع التوصيل", name: ["لميس", "Lamees"], city: ["جدة", "Jeddah"] } ] }, // الأجوبة من وصف المنتج نفسه. سؤال التقسيط بيطلع بس إذا مكوّن التقسيط موجود بالصفحة (pay: true) faq: { tag: ["أسئلة شائعة", "FAQ"], title: ["كل ما تودّين معرفته", "Everything you want to know"], list: [ { q: ["ماذا يحتوي البوكس؟", "What is in the box?"], a: ["مقوي أظافر ناتوريد وسيروم هيالورونيك أسيد ناتوريد في بوكس واحد.", "NatuRed Nail Hardener and NatuRed Hyaluronic Acid Serum in one box."] }, { q: ["كيف أستخدم مقوي الأظافر؟", "How do I use the nail hardener?"], a: ["ضعي طبقة رقيقة من مقوي ناتوريد على الأظافر 3 إلى 4 مرات في الأسبوع.", "Apply a thin layer to your nails 3 to 4 times a week."] }, { q: ["كيف أستخدم السيروم؟", "How do I use the serum?"], a: ["بعد غسل الوجه، ضعي كمية مناسبة على راحة يدك ووزعيها على كامل الوجه والرقبة مع التدليك بلطف حتى تمتصه البشرة.", "After washing your face, spread a suitable amount over the face and neck and massage gently until absorbed."] }, { q: ["هل يصلح البوكس كهدية؟", "Is the box a good gift?"], a: ["نعم، بوكس عملي وأنيق ومثالي كهدية أو كروتين عناية متكامل لكِ.", "Yes — a practical, elegant box, ideal as a gift or as your own care routine."] }, { pay: true, q: ["هل يمكنني الدفع بالتقسيط؟", "Can I pay in instalments?"], a: ["نعم، على 4 دفعات بدون فوائد أو رسوم مع تمارا أو تابي.", "Yes, in 4 interest-free payments with Tamara or Tabby."] } ] }, gift: { title: ["دلّلي نفسك… أو أهدي من تحبين", "Treat yourself… or gift someone you love"], text: ["بوكس عملي وأنيق، مثالي كهدية أو كروتين عناية متكامل لكِ.", "A practical, elegant box — ideal as a gift or as your own complete care routine."] }, cta: ["أضيفي إلى السلة", "Add to cart"] } }; var SAR = ''; function productId() { var el = document.querySelector('.saji-pdp__layout[id^="product-"]'); var m = el ? el.id.match(/(\d+)/) : location.pathname.match(/\/p(\d+)(?:[/?#]|$)/); return m ? m[1] : ""; } // السعر الحالي من الصفحة: القسم الظاهر من (خصم / عادي) function prices() { var box = document.querySelector(".saji-pdp__price-display"); if (!box) return null; var sale = box.querySelector(".price_is_on_sale"), on = sale && !sale.classList.contains("hidden"); var src = on ? sale : box.querySelector(".starting-or-normal-price") || box; var now = S.num(src.querySelector(".total-price")), was = on ? S.num(sale.querySelector(".before-price")) : 0; return now ? { now: now, was: was > now ? was : 0 } : null; } function priceHTML(p) { if (!p) return ""; var h = '
' + S.fmt(p.now) + SAR + ""; if (p.was) h += "" + S.fmt(p.was) + SAR + "" + t(["وفّري ", "Save "]) + S.fmt(p.was - p.now) + SAR + ""; return h + "
"; } function head(o, sub) { return '
' + esc(t(o.tag)) + "

" + esc(t(o.title)) + "

" + (sub && o.sub ? "

" + esc(t(o.sub)) + "

" : "") + "
"; } function build(d) { var p = prices(), pay = !!document.querySelector("salla-installment"); var mini = d.mini.concat(pay ? [d.miniPay] : []); var cta = '"; // زر شراء بين الأقسام (بالسعر) — الزائرة ما تحتاج ترجع لفوق لتشتري var buyRow = '
"; var marq = d.marquee.map(function (m) { return "" + esc(t(m)) + ""; }).join(""); // 6 نسخ ورا بعض: الحركة بتزيح نص العرض (3 نسخ) وبترجع، فلازم 3 نسخ يغطّوا أعرض شاشة — غير هيك بيبيّن فراغ بآخر الشريط marq = marq + marq + marq + marq + marq + marq; return "" + // 1) الهيرو '
' + '
' + '
' + '' + esc(t(d.eyebrow)) + "" + '

' + esc(t(d.title)) + "" + esc(t(d.titleEm)) + "

" + '

' + t(d.lead) + "

" + '
' + priceHTML(p) + cta + "
" + '
    ' + mini.map(function (x) { return "
  • " + esc(t(x)) + "
  • "; }).join("") + "
" + "
" + '
' + '' + '
' + '
' + '
' + esc(t(d.eyebrow)) + '
' + '
' + esc(t(d.inside.tag)) + '
' + "
" + "
" + '" + "
" + '
    ' + d.inside.items.map(function (it) { return "
  • " + esc(t(it.who)) + "" + esc(t(it.name)) + "" + esc(t(it.short)) + "
  • "; }).join("") + "
" + "
" + "
" + '' + "
" + // الشريط المتحرك '" + // القيمة (مخفي لحد ما توصل الأسعار من سلة) (d.value ? '" : "") + // 2) محتويات البوكس '
' + head(d.inside, true) + '
' + d.inside.items.map(function (it, i) { return '
' + '' + '
' + esc(t(it.who)) + "

" + esc(t(it.name)) + "

" + esc(t(it.text)) + "

" + '
    ' + it.tags.map(function (g) { return "
  • " + esc(t(g)) + "
  • "; }).join("") + "
" + '
' + esc(t(d.routine.tag)) + "" + esc(t(it.use)) + "
" + "
"; }).join("") + "
" + "
" + // 3) المكوّنات '
' + head(d.ingr, true) + '
' + d.ingr.list.map(function (g, i) { return '
' + esc(g.sym) + "" + esc(t(g.name)) + "" + esc(t(g.text)) + "" + esc(t(g.of)) + "
"; }).join("") + "
" + "
" + // 4) طريقة الاستخدام '
' + head(d.routine, false) + '
' + d.routine.cols.map(function (c, i) { return '

' + esc(t(c.name)) + "" + esc(t(c.when)) + "

" + '
    ' + c.steps.map(function (s) { return "
  1. " + esc(t(s)) + "
  2. "; }).join("") + "
"; }).join("") + "
" + buyRow + "
" + // آراء العميلات (d.reviews ? '
' + head(d.reviews, false) + '
' + d.reviews.list.map(function (r, i) { return '
' + esc(r.text) + "
" + esc(t(r.name)) + "" + esc(t(r.city)) + "
"; }).join("") + "
" : "") + // أسئلة شائعة (d.faq ? '
' + head(d.faq, false) + '
' + d.faq.list.filter(function (q) { return !q.pay || pay; }).map(function (q, i) { return "" + esc(t(q.q)) + "

" + esc(t(q.a)) + "

"; }).join("") + "
" : "") + // 5) الخاتمة '
' + "

" + esc(t(d.gift.title)) + "

" + esc(t(d.gift.text)) + "

" + priceHTML(p) + '
" + '
' + "
"; } // ملخّص بعمود المعلومات بدل الوصف: جملة وحدة + زر بينزّل للتفاصيل. بلا كروت ولا صور هون — كلها تحت بالقسم. // (الوصف الأصلي بيضل بالصفحة مخفي — الكلاس nt-desc بيخلّي «ترتيب الوصف» يتخطّى هالمنتج.) function summary(d, sec) { var info = document.querySelector(".saji-pdp__info"), src = info && info.querySelector("#more-content"); if (!src || !d.sum || info.querySelector(".nt-desc")) return; var el = document.createElement("div"); el.className = "nt-desc nt-sum"; el.innerHTML = "

" + esc(t(d.sum.lead)) + '

"; var btn = info.querySelector("#btn-show-more"), ref = btn || src; ref.parentNode.insertBefore(el, ref.nextSibling); info.classList.add("nt-desc-on"); el.querySelector(".nt-sum__more").addEventListener("click", function () { if (sec.scrollIntoView) sec.scrollIntoView({ behavior: "smooth", block: "start" }); }); } // قسم القيمة: سعر كل قطعة من سلة وقتها (salla.product.getDetails)، المجموع، وسعر البوكس من الصفحة. // أي فشل (السعر ما وصل، أو المجموع مش أعلى من البوكس) = القسم بيضل مخفي. function value(sec) { var box = sec.querySelector("[data-nt-value]"), p = prices(); if (!box || !p || !(window.salla && salla.product && salla.product.getDetails)) return; var cells = [].slice.call(box.querySelectorAll("[data-nt-pid]")); Promise.all(cells.map(function (c) { return salla.product.getDetails(Number(c.getAttribute("data-nt-pid"))).then(function (r) { var d = r && r.data ? r.data : r, v = d && (d.sale_price && S.num(String(d.sale_price.amount != null ? d.sale_price.amount : d.sale_price)) || S.num(String(d.price && d.price.amount != null ? d.price.amount : d.price))); if (!v) throw new Error("no price"); return v; }); })).then(function (list) { var sum = list.reduce(function (a, b) { return a + b; }, 0); if (!(sum > p.now)) return; cells.forEach(function (c, i) { c.innerHTML = S.fmt(list[i]) + SAR; }); box.querySelector("[data-nt-sum]").innerHTML = S.fmt(sum) + SAR; box.querySelector("[data-nt-box]").innerHTML = S.fmt(p.now) + SAR; box.querySelector("[data-nt-save]").innerHTML = S.fmt(sum - p.now) + SAR; box.hidden = false; }).catch(function () {}); } // زر القسم = كبسة على زر الثيم نفسه، فالإشعار والسلة الجانبية والكمية بيشتغلوا متل العادة function buy(id) { var b = document.querySelector("#single-product-form salla-add-product-button button, .saji-pdp__buybox salla-add-product-button button"); if (b) { b.click(); return; } var f = document.getElementById("single-product-form"); if (f && f.requestSubmit) { f.requestSubmit(); return; } if (window.salla && salla.cart && salla.cart.addItem) salla.cart.addItem({ id: Number(id), quantity: 1 }); } function wire(sec, d, id) { var motion = !(window.matchMedia && matchMedia("(prefers-reduced-motion: reduce)").matches); var hover = window.matchMedia && matchMedia("(hover: hover) and (pointer: fine)").matches; sec.addEventListener("click", function (e) { var el = e.target.closest ? e.target.closest("[data-nt-buy],[data-nt-flip]") : null; if (!el) return; if (el.hasAttribute("data-nt-buy")) { buy(id); return; } toggle(true); }); // فتح/إغلاق البوكس var stage = sec.querySelector("[data-nt-stage]"), openBtn = sec.querySelector(".nt-ap-open"), touched = false; function toggle(byUser, force) { if (byUser) touched = true; var on = force != null ? force : !stage.classList.contains("is-open"); stage.classList.toggle("is-open", on); openBtn.textContent = t(on ? d.closeLabel : d.openLabel); openBtn.setAttribute("aria-pressed", on ? "true" : "false"); } // الظهور مع السكرول + فتح البوكس لحالو أول ما يبيّن (مرة وحدة، وإذا الزائر ما كبس قبل) var rv = sec.querySelectorAll(".nt-rv"); if (window.IntersectionObserver && motion) { var io = new IntersectionObserver(function (list) { list.forEach(function (en) { if (en.isIntersecting) { en.target.classList.add("is-in"); io.unobserve(en.target); } }); }, { threshold: 0.12, rootMargin: "0px 0px -6% 0px" }); rv.forEach(function (el) { io.observe(el); }); var so = new IntersectionObserver(function (list) { if (!list[0].isIntersecting) return; so.disconnect(); setTimeout(function () { if (!touched) toggle(false, true); }, 1100); }, { threshold: 0.6 }); so.observe(stage); } else { rv.forEach(function (el) { el.classList.add("is-in"); }); } if (!motion) return; // موجات الهيرو بتتحرّك مع السكرول (--sy من 0 لـ1 طول ما الهيرو ظاهر) var hero = sec.querySelector(".nt-ap-hero"), tick = false; function onScroll() { if (tick) return; tick = true; requestAnimationFrame(function () { tick = false; var r = hero.getBoundingClientRect(), vh = window.innerHeight || 1; if (r.bottom < 0 || r.top > vh) return; hero.style.setProperty("--sy", Math.max(0, Math.min(1, (vh - r.top) / (vh + r.height))).toFixed(3)); }); } window.addEventListener("scroll", onScroll, { passive: true }); onScroll(); if (!hover) return; // ميلان البوكس مع الماوس (الكمبيوتر بس — عالجوال الحركة التلقائية كافية) var tilt = sec.querySelector(".nt-ap-tilt"); hero.addEventListener("pointermove", function (e) { var r = stage.getBoundingClientRect(); var x = (e.clientX - (r.left + r.width / 2)) / r.width, y = (e.clientY - (r.top + r.height / 2)) / r.height; tilt.style.setProperty("--ry", (Math.max(-1, Math.min(1, x)) * 16).toFixed(2)); tilt.style.setProperty("--rx", (Math.max(-1, Math.min(1, y)) * -12).toFixed(2)); }); hero.addEventListener("pointerleave", function () { tilt.style.setProperty("--ry", 0); tilt.style.setProperty("--rx", 0); }); // ميلان كروت «محتويات البوكس» sec.querySelectorAll("[data-nt-tilt]").forEach(function (card) { card.addEventListener("pointermove", function (e) { var r = card.getBoundingClientRect(); card.style.setProperty("--ry", (((e.clientX - r.left) / r.width - 0.5) * 9).toFixed(2)); card.style.setProperty("--rx", (((e.clientY - r.top) / r.height - 0.5) * -9).toFixed(2)); }); card.addEventListener("pointerleave", function () { card.style.setProperty("--ry", 0); card.style.setProperty("--rx", 0); }); }); } function run() { if (!document.body.classList.contains("product-single")) return true; var id = productId(), d = APLUS[id]; if (!id) return false; if (!d) return true; if (document.querySelector(".nt-aplus")) return true; var after = document.querySelector(".saji-pdp"); if (!after || !after.parentNode) return false; var sec = document.createElement("section"); sec.className = "nt-aplus"; sec.setAttribute("dir", S.AR ? "rtl" : "ltr"); sec.setAttribute("lang", S.AR ? "ar" : "en"); sec.setAttribute("data-nt-product", id); sec.innerHTML = build(d); after.parentNode.insertBefore(sec, after.nextSibling); // الصفحة من هون لآخر الفوتر قطعة وحدة (natured.css ← nt-pdp-one) document.documentElement.classList.add("nt-pdp-one"); summary(d, sec); wire(sec, d, id); if (window.salla && salla.onReady) salla.onReady(function () { value(sec); }); else value(sec); return true; } S.ready(function () { if (run()) return; var n = 0, iv = setInterval(function () { if (run() || ++n > 20) clearInterval(iv); }, 300); }); })(); /** * ترتيب الوصف (صفحة المنتج) * ----------------------------------------------------------------------- * وصف سلة فقرات ورا بعض بأسطر فاضية وزر «اقرأ المزيد». هون بينقرا نفس النص وبينعرض أقسام: * - فقرة كلها عريضة أو عنوان (h2…) ← عنوان قسم · قسم عنوانو فيه «استخدام» ← كرت برتقالي * - قائمة، أو 3 أسطر قصيرة وأكتر ورا بعض ← نقاط بعلامة ✓ * - «الحجم: 100 مل» ← جدول مواصفات * النص ما بيتغيّر ولا حرف — بس الشكل، والأقسام النصية بتنطوى (كلام أقل قدّام العين). الوصف الأصلي بيضل بالصفحة (مخفي) عشان محركات البحث. * منتج إلو A+ ما بيمرق من هون: «محتوى A+» بيحطلو ملخّص بصري (nt-sum) بدل الوصف. */ (function () { "use strict"; var S = window.ntShop; if (!S) return; var esc = S.esc; function norm(s) { return String(s || "").replace(/ /g, " ").replace(/\s+/g, " ").trim(); } function bare(s) { return s.replace(/[\s::.،,]/g, ""); } function parse(src) { var secs = [], cur = { h: "", items: [] }; function flush() { if (cur.h || cur.items.length) secs.push(cur); } [].forEach.call(src.children, function (el) { var tag = el.tagName, txt = norm(el.textContent); if (!txt) return; if (tag === "UL" || tag === "OL") { [].forEach.call(el.querySelectorAll("li"), function (li) { var x = norm(li.textContent); if (x) cur.items.push({ t: "li", x: x }); }); return; } var strong = norm([].map.call(el.querySelectorAll("strong,b"), function (b) { return b.textContent; }).join(" ")); var isHead = /^H[1-6]$/.test(tag) || (strong && txt.length <= 60 && bare(strong) === bare(txt)); if (isHead) { flush(); cur = { h: txt.replace(/[\s::]+$/, ""), items: [] }; return; } var m = txt.match(/^([^::]{2,24})[::]\s*(.{1,60})$/); if (m && !/[.،]$/.test(m[2])) cur.items.push({ t: "spec", k: norm(m[1]), v: norm(m[2]) }); else cur.items.push({ t: "p", x: txt }); }); flush(); // 3 أسطر قصيرة وأكتر بلا قائمة = نقاط secs.forEach(function (s) { var ps = s.items.filter(function (i) { return i.t === "p"; }); var hasLi = s.items.some(function (i) { return i.t === "li"; }); if (!hasLi && ps.length >= 3 && ps.every(function (i) { return i.x.length <= 70; })) ps.forEach(function (i) { i.t = "li"; }); }); return secs; } // كلام أقل: المقدمة 3 أسطر مع «اقرأ المزيد»، النقاط والمواصفات ظاهرة (هي البصرية)، // وأي قسم نصّي بعنوان (طريقة الاستخدام…) بينطوى تحت عنوانو وبينفتح بالكبسة. function render(secs) { return secs.map(function (s, n) { var ps = "", lis = "", specs = ""; s.items.forEach(function (i) { if (i.t === "p") ps += "

" + esc(i.x) + "

"; else if (i.t === "li") lis += "
  • " + esc(i.x) + "
  • "; else specs += "
    " + esc(i.k) + "
    " + esc(i.v) + "
    "; }); var body = ps + (lis ? '" : "") + (specs ? '
    ' + specs + "
    " : ""); var use = /استخدام|how to use/i.test(s.h) ? " nt-desc__sec--use" : ""; if (!s.h) { var long = ps && !lis && !specs && s.items.reduce(function (a, i) { return a + i.x.length; }, 0) > 170; return '
    ' + body + (long ? '" : "") + "
    "; } if (!s.items.length) return '

    ' + esc(s.h) + "

    "; // قسم كلو فقرات = مطوي؛ قسم فيه نقاط/مواصفات = مفتوح return '

    " + esc(s.h) + "

    " + body + "
    "; }).join(""); } function run() { if (!document.body.classList.contains("product-single")) return true; var info = document.querySelector(".saji-pdp__info"), src = info && info.querySelector("#more-content"); if (!src) return false; if (info.querySelector(".nt-desc")) return true; if (norm(src.textContent).length < 40) return true; var secs = parse(src); if (!secs.length) return true; var el = document.createElement("div"); el.className = "nt-desc"; el.innerHTML = render(secs); var btn = info.querySelector("#btn-show-more"), ref = btn || src; ref.parentNode.insertBefore(el, ref.nextSibling); info.classList.add("nt-desc-on"); el.addEventListener("click", function (e) { var b = e.target.closest ? e.target.closest(".nt-desc__more") : null; if (!b) return; var open = b.parentNode.classList.toggle("is-open"); b.textContent = b.getAttribute(open ? "data-less" : "data-more"); }); return true; } S.ready(function () { if (run()) return; var n = 0, iv = setInterval(function () { if (run() || ++n > 20) clearInterval(iv); }, 300); }); })(); /** * يكمّل طلبك (صفحة المنتج + السلة) * ----------------------------------------------------------------------- * اقتراحات حسب نوع المنتج (من اسمو). كل نوع إلو مجموعة أو مجموعتين، وكل مجموعة: عنوان + رف + «شاهدي الكل». * - أظافر لصق ← مناكير + العناية بالأظافر · مناكير ← مقوي ومزيل + أظافر لصق · مقوي ← مناكير + أظافر لصق * - صبغات ماكسيما ← أوكسي كريم (بينطلبوا سوا بطلبات المتجر) + العناية بالوجه (السيروم) * الرف يا تصنيف كامل (cat: بيتحدّث لحالو مع أي منتج جديد) يا منتجات مختارة (ids). * نوع جديد = سطر بـ RULES (الترتيب مهم: أول قاعدة بتطابق الاسم بتنأخد). تصنيف أو منتج انحذف = شيل رقمو من هون. */ (function () { "use strict"; var S = window.ntShop; if (!S) return; var t = S.t, esc = S.esc, L = S.AR ? "/ar" : "/en"; var P = { box: 624400994, boxPlus: 2112458759, nailsSet: 1117192944, friends: 477764138, nailsSet2: 1896605779, hardener: 249878975, serum: 1521157829, remover: 483493465, red: 570006398, pink: 325266895, press: 2140779696, oxy: 1167947058, lift: 1494022547, black: 1176028404 }; var C = { polish: 1682430411, press: 1714804233, nails: 842969338, face: 472152731, maxima: 1919088103, offers: 364828832, all: 1196577971 }; var G = { polish: { title: ["أكملي الإطلالة بلون", "Finish the look with colour"], cat: C.polish, all: C.polish, allLabel: ["شاهدي كل المناكير", "View all nail polish"] }, press: { title: ["أظافر جاهزة للتركيب", "Ready-to-wear nails"], cat: C.press, all: C.press, allLabel: ["تصفّحي كل الأظافر", "Browse all nails"] }, care: { title: ["العناية بالأظافر", "Nail care"], ids: [P.hardener, P.remover], all: C.nails, allLabel: ["تصفّحي قسم الأظافر", "Browse the nails section"] }, oxy: { title: ["يُطلب مع الصبغة", "Ordered with hair colour"], ids: [P.oxy, P.lift, P.black], all: C.maxima, allLabel: ["شاهدي كل الصبغات", "View all hair colours"] }, face: { title: ["دلّلي بشرتك أيضًا", "Treat your skin too"], cat: C.face, all: C.face, allLabel: ["شاهدي العناية بالوجه", "View face care"] }, serumSet: { title: ["يناسب السيروم", "Goes with the serum"], ids: [P.box, P.hardener], all: C.face, allLabel: ["شاهدي العناية بالوجه", "View face care"] }, boxes: { title: ["بوكسات ومجموعات أخرى", "More boxes and sets"], ids: [P.box, P.boxPlus, P.nailsSet, P.friends, P.nailsSet2], all: C.offers, allLabel: ["شاهدي كل العروض", "View all offers"] }, best: { title: ["الأكثر طلبًا في المتجر", "Most ordered in the store"], ids: [P.hardener, P.serum, P.box, P.remover, P.red, P.pink, P.press, P.lift], all: C.all, allLabel: ["شاهدي كل المنتجات", "View all products"] } }; var RULES = [ [/بوكس|مجموعة/, ["boxes"]], [/ماكسيما|صبغ|أوكسي/, ["oxy", "face"]], [/مقوي/, ["polish", "press"]], [/مزيل/, ["polish", "care"]], [/لصق/, ["polish", "care"]], [/مناكير|طلاء/, ["care", "press"]], [/سيروم|مناديل/, ["serumSet"]] ]; function group(g, self) { var src; if (g.cat) src = 'source="categories" source-value="[' + g.cat + ']"'; else { var ids = g.ids.filter(function (x) { return x !== self; }); if (!ids.length) return ""; src = 'source="selected" source-value="[' + ids.join(",") + ']"'; } return '

    ' + esc(t(g.title)) + '

    ' + esc(t(g.allLabel)) + "
    " + '
    '; } function section(tag, title, keys, self) { var body = keys.map(function (k) { return group(G[k], self); }).join(""); if (!body) return null; var el = document.createElement("section"); el.className = "nt-aplus nt-more"; el.setAttribute("dir", S.AR ? "rtl" : "ltr"); el.innerHTML = '
    ' + '
    ' + esc(t(tag)) + "

    " + esc(t(title)) + "

    " + body + "
    "; return el; } function productPage() { var layout = document.querySelector('.saji-pdp__layout[id^="product-"]'), h1 = document.querySelector("h1.product-title"), pdp = document.querySelector(".saji-pdp"); if (!layout || !h1 || !pdp) return false; var id = Number((layout.id.match(/(\d+)/) || [])[1]), name = h1.textContent, keys = ["best"]; for (var i = 0; i < RULES.length; i++) if (RULES[i][0].test(name)) { keys = RULES[i][1]; break; } var el = section(["يكمّل طلبك", "Complete your order"], ["اختيارات تناسب هذا المنتج", "Picks that go with this product"], keys, id); if (!el) return true; // بعد محتوى A+ إذا موجود، وإلا بعد تفاصيل المنتج مباشرة var aplus = document.querySelector(".nt-aplus[data-nt-product]"), after = aplus || pdp; after.parentNode.insertBefore(el, after.nextSibling); return true; } function cartPage() { var main = document.getElementById("main-content"); if (!main) return false; var empty = !!document.getElementById("store-cart-empty"); var el = empty ? section(["الأكثر مبيعًا", "Best sellers"], ["سلتك فارغة… ابدئي من هنا", "Your cart is empty — start here"], ["best"], 0) : section(["أضيفي لطلبك", "Add to your order"], ["قبل إتمام الطلب", "Before you check out"], ["best"], 0); if (el) main.appendChild(el); return true; } function run() { if (document.querySelector(".nt-more")) return true; var b = document.body.classList; if (b.contains("product-single")) return productPage(); if (b.contains("cart")) return cartPage(); return true; } // بعد «محتوى A+» حتى ينحط الرف تحتو S.ready(function () { setTimeout(function () { if (run()) return; var n = 0, iv = setInterval(function () { if (run() || ++n > 20) clearInterval(iv); }, 300); }, 0); }); })(); /** * قائمة الجوال: أيقونة لكل رابط * ----------------------------------------------------------------------- * الشكل (كروت) بـnatured.css. هون بس الأيقونات، حسب رقم التصنيف/المنتج بالرابط. * العنصر مش لأنو الثيم بيستعمل span الرابط للنص. */ (function () { "use strict"; var S = window.ntShop; if (!S) return; var ICON = [[/\/p624400994/, "sicon-gift"], [/\/c842969338/, "sicon-brush"], [/\/c472152731/, "sicon-smile"], [/\/c1919088103/, "sicon-magic-wand"], [/\/c1196577971/, "sicon-grid"], [/\/c364828832|offers/, "sicon-tag"]]; function run() { var links = document.querySelectorAll("#big--menu > ul.main-menu > li > a"); if (!links.length) return false; [].forEach.call(links, function (a) { if (a.querySelector(".nt-mi")) return; var href = a.getAttribute("href") || "", icon = /^https?:\/\/[^/]+\/(ar|en)?\/?$/.test(href) ? "sicon-home" : "sicon-star"; for (var i = 0; i < ICON.length; i++) if (ICON[i][0].test(href)) { icon = ICON[i][1]; break; } var b = document.createElement("b"); b.className = "nt-mi"; b.innerHTML = ''; a.insertBefore(b, a.firstChild); }); return true; } S.ready(function () { if (run()) return; var n = 0, iv = setInterval(function () { if (run() || ++n > 20) clearInterval(iv); }, 300); }); })(); /** * الرئيسية (home.html) * ----------------------------------------------------------------------- * المحتوى كلو بـ home.html (HTML بس، بينلصق ببلوك بالرئيسية). هون بس السلوك: * - الروابط مكتوبة /ar/ بالملف — بالإنجليزي بتتبدّل لـ /en/ * - الظهور مع السكرول: العناصر اللي عليها data-nt-rv (الرقم = ترتيب التأخير). الإخفاء بينحط من هون، * فإذا السكربت ما اشتغل المحتوى بيضل ظاهر كلو. * - مروحة الهيرو وكروت التصنيفات بتميل مع الماوس، وموجات الهيرو بتتحرّك مع السكرول * - الخاتمة (data-nt-end) بتنتقل لآخر
    (بعد بلوكات الثيم) وبتندمج مع الفوتر؛ وحاويات البلوك بتنعلّم nt-home-host (بلا هوامش) * إذا home.html مش ملصوق: بتنشال علامة nt-home-on وبترجع رئيسية الثيم متل ما هي. */ (function () { "use strict"; var S = window.ntShop, root = document.documentElement; if (!S || !root.classList.contains("nt-home-on")) return; function localize(el) { el.setAttribute("dir", S.AR ? "rtl" : "ltr"); el.setAttribute("lang", S.AR ? "ar" : "en"); if (S.AR) return; el.querySelectorAll('a[href^="/ar/"]').forEach(function (a) { a.setAttribute("href", a.getAttribute("href").replace(/^\/ar\//, "/en/")); }); } // الخاتمة بقسم لحالها آخر
    (بعد كل بلوكات الثيم) حتى تلزق بالفوتر وتصير معو قطعة وحدة. // إذا ما في بلوكات ثيم ظاهرة بعد بلوكنا، بتضل مكانها (هي أصلًا آخر شي). function moveEnd(top, main) { var end = top.querySelector("[data-nt-end]"); if (!end || !main) return null; var later = false, n = top; while (n && n !== main && !later) { for (var s = n.nextElementSibling; s; s = s.nextElementSibling) if (s.offsetHeight > 0) { later = true; break; } n = n.parentNode; } if (!later) return null; var sec = document.createElement("section"); sec.className = "nt-aplus nt-home nt-home--end"; sec.appendChild(end); main.appendChild(sec); localize(sec); return sec; } // حاويات البلوك (بين home.html و
    ) بلا هوامش — التنسيق بـnatured.css // وبلوكات الثيم الفاضية بعد بلوكنا (ارتفاعها صفر بس إلها هوامش) كمان — هي اللي بتعمل الفراغ الأبيض قبل الفوتر function flush(top, main) { for (var n = top.parentNode; n && n !== main && n !== document.body; n = n.parentNode) n.classList.add("nt-home-host"); if (!main) return; [].forEach.call(main.children, function (el) { if (!el.contains(top) && el.offsetHeight === 0) el.classList.add("nt-home-host"); }); } function wire(parts) { var motion = !(window.matchMedia && matchMedia("(prefers-reduced-motion: reduce)").matches); var hover = window.matchMedia && matchMedia("(hover: hover) and (pointer: fine)").matches; var top = parts[0]; if (!motion) return; if (window.IntersectionObserver) { var io = new IntersectionObserver(function (list) { list.forEach(function (en) { if (en.isIntersecting) { en.target.classList.add("is-in"); io.unobserve(en.target); } }); }, { threshold: 0.1, rootMargin: "0px 0px -5% 0px" }); parts.forEach(function (part) { part.querySelectorAll("[data-nt-rv]").forEach(function (el) { el.style.setProperty("--d", el.getAttribute("data-nt-rv") || 0); el.classList.add("nt-rv"); io.observe(el); }); }); } var hero = top.querySelector(".nt-ap-hero"), tick = false; if (!hero) return; function onScroll() { if (tick) return; tick = true; requestAnimationFrame(function () { tick = false; var r = hero.getBoundingClientRect(), vh = window.innerHeight || 1; if (r.bottom < 0 || r.top > vh) return; hero.style.setProperty("--sy", Math.max(0, Math.min(1, (vh - r.top) / (vh + r.height))).toFixed(3)); }); } window.addEventListener("scroll", onScroll, { passive: true }); onScroll(); if (!hover) return; var fan = top.querySelector("[data-nt-fan]"); if (fan) { hero.addEventListener("pointermove", function (e) { var r = fan.getBoundingClientRect(); var x = (e.clientX - (r.left + r.width / 2)) / r.width, y = (e.clientY - (r.top + r.height / 2)) / r.height; fan.style.setProperty("--ry", (Math.max(-1, Math.min(1, x)) * 14).toFixed(2)); fan.style.setProperty("--rx", (Math.max(-1, Math.min(1, y)) * -10).toFixed(2)); }); hero.addEventListener("pointerleave", function () { fan.style.setProperty("--ry", 0); fan.style.setProperty("--rx", 0); }); } top.querySelectorAll("[data-nt-tilt]").forEach(function (card) { card.addEventListener("pointermove", function (e) { var r = card.getBoundingClientRect(); card.style.setProperty("--ry", (((e.clientX - r.left) / r.width - 0.5) * 10).toFixed(2)); card.style.setProperty("--rx", (((e.clientY - r.top) / r.height - 0.5) * -10).toFixed(2)); }); card.addEventListener("pointerleave", function () { card.style.setProperty("--ry", 0); card.style.setProperty("--rx", 0); }); }); } function run() { var top = document.body.classList.contains("index") ? document.querySelector(".nt-home") : null; if (!top) { root.classList.remove("nt-home-on"); return; } var main = document.getElementById("main-content") || document.querySelector("main"); localize(top); flush(top, main); var end = moveEnd(top, main); wire(end ? [top, end] : [top]); } S.ready(function () { try { run(); } catch (e) { root.classList.remove("nt-home-on"); throw e; } }); })();