" + esc(t(it.name)) + "
" + esc(t(it.text)) + "
" + '" + '/* ====================================================================== * ناتوريد (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 = '
" + esc(t(o.sub)) + "
" : "") + "' + t(d.lead) + "
" + '" + esc(t(it.text)) + "
" + '" + '' + esc(r.text) + "
" + esc(t(q.a)) + "
" + esc(t(d.gift.text)) + "
" + priceHTML(p) + '" + 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 += "