1 2<!DOCTYPE html> 3<html lang=ar dir=rtl> 4<head> 5 6 <base href="https://brandfull.com" target="_top"> 7 <link rel="dns-prefetch" href="https://brandfull.com" /> 8 <link rel="preconnect" href="https://cdn.brandfull.com"> 9 <link rel="preconnect" href="https://cdn.brandfull.com" crossorigin> 10 <link rel="dns-prefetch" href="https://cdn.brandfull.com"> 11 <link rel="preconnect" href="https://brandfullsapi.azurewebsites.net" crossorigin> 12 13 14 15 16 <title>ÙØ§Ø¦Ù Ø© ØµÙØØ© اÙÙ ÙØ¶ÙØ© - Ø¨Ø±Ø§ÙØ¯ÙÙ</title> 17 <meta charset="utf-8"> 18 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 19 <meta http-equiv="content-type" content="text/html; charset=utf-8"> 20 <meta http-equiv="content-language" content="ar"> 21 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=5, shrink-to-fit=no" /> 22 23 <meta name="robots" content="index,follow"> 24 <meta name="googlebot" content="index,follow"> 25 26 <!-- Loading JS & CSS --> 27
27<script>!function(){var o=EventTarget.prototype.addEventListener;EventTarget.prototype.addEventListener=function(e,t,n){"touchstart"!==e&&"touchmove"!==e&&"wheel"!==e||("object"!=typeof n&&(n={capture:!!n}),n.passive=!0),o.call(this,e,t,n)}}();</script>
27 28 29 <link rel="stylesheet" href="/site-Ar.min.css?v=639260136226636726"> 30<link rel="preload" href="https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Light.woff2" as="font" fetchpriority="low" crossorigin="anonymous"> 31<link rel="preload" href="https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Regular.woff2" as="font" crossorigin="anonymous"> 32<link rel="preload" href="https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Bold.woff2" as="font" crossorigin="anonymous"> 33<link rel="preload" href="https://cdn.brandfull.com/Themes/Cartzilla/Assets/fonts/cartzilla-icons-sub.woff2?v=1" as="font" fetchpriority="low" crossorigin="anonymous"> 34<style> 35 36 37@font-face { 38 font-family: 'IBMPlexSansArabic'; 39 font-style: normal; 40 font-weight: 300; 41 src: url(https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Light.woff2) format('woff2'); 42 font-display: swap; 43} 44 45@font-face { 46 font-family: 'IBMPlexSansArabic'; 47 font-style: normal; 48 font-weight: 400; 49 src: url(https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Regular.woff2) format('woff2'); 50 font-display: swap; 51} 52 53@font-face { 54 font-family: 'IBMPlexSansArabic'; 55 font-style: normal; 56 font-weight: 700; 57 src: url(https://cdn.brandfull.com/Themes/Cartzilla/_Font/IBMPlexSansArabic-Bold.woff2) format('woff2'); 58 font-display: swap; 59} 60 61 62 63@font-face { 64 font-family: "cartzilla-icons"; 65 src: url(https://cdn.brandfull.com/Themes/Cartzilla/Assets/fonts/cartzilla-icons.woff2?v=6) format("woff2"); 66 font-weight: normal; 67 font-style: normal; 68 font-display: block; 69} 70 71@font-face { 72 font-family: "cartzilla-icons"; 73 src: url(https://cdn.brandfull.com/Themes/Cartzilla/Assets/fonts/cartzilla-icons-sub.woff2?v=1) format("woff2"); 74 font-weight: normal; 75 font-style: normal; 76 font-display: block; 77 unicode-range: U+E902,U+E903,U+E904,U+E906,U+E908,U+E90A,U+E90C,U+E90F,U+E910,U+E912,U+E914,U+E916,U+E918,U+E919,U+E91A,U+E91B,U+E91C,U+E91D,U+E91F,U+E920,U+E921,U+E922,U+E923,U+E926,U+E928,U+E929,U+E92C,U+E92D,U+E92F,U+E933,U+E937,U+E938,U+E939,U+E93B,U+E93F,U+E940,U+E944,U+E945,U+E946,U+E947,U+E948,U+E94A,U+E94C,U+E94D,U+E952,U+E953,U+E954,U+E956,U+E957,U+E959,U+E95A,U+E95D,U+E95E,U+E963,U+E964,U+E965,U+E969,U+E96A,U+E96B,U+E96E,U+E970,U+E972,U+E974,U+E97A,U+E97F,U+E980,U+E982,U+E983,U+E985,U+E986,U+E987,U+E98A,U+E98B,U+E98C,U+E98D,U+E98F,U+E991,U+E994,U+E99C,U+E99F,U+E9A6,U+E9AA,U+E9AB,U+E9AE,U+E9BE,U+E9BF,U+E9C1,U+E9C3,U+E9D5,U+E9DA,U+E9DB,U+E9DD,U+E9DF,U+E9E0,U+E9E1,U+E9E2,U+E9E4,U+E9E5,U+E9E6; 78} 79 80@font-face { 81 font-family: "cartzilla-icons"; 82 src: url(data:font/woff2;base64,d09GMgABAAAAAA7YAAsAAAAAGQgAAA6KAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAgSwRCAqrNKQCATYCJAMqCyoABCAFgRAHIBtpFFGUj1YN4OeB7ciNNa7Y8fpdT0YrmhkhyewP/DZ7RArzW19BPiIWKRysgsgd2Fg4XamThTfcias2cNHWospcpXKtXhXOla7VgRS7q740EAw4G0GKDdbZ/6T4SJ7ouzB4UtsP3qDJNbkOuvJgpbZrtQ0sksuddi/x4SkFJVSlAv9vLbW7QVL3ogAtCZeoxKGOsHHzJ7fvzb9N2oXQXBiP567MLqogbIWaKwEJ1TpUFbqKhDI1QtTWqM2CptBZ8p65IUZqZQyYtPES+69e0lsAAuEzbhOQAPA1+McAsFE/PtwzUOJo0GpDQFR5id6/CW2+toMEhuzOOA+dV1S8SsBgT8fp2UTYxfnAo18T3kv0Ur2IN9Ab5uV5VV6DN9vr9C7yrvJWe/d4u71/+3wUv3p13qy/MT2EfkL70T70Ofoveg+9jZ5H69BtaDW6GnWio1AZ4OACKMT5fLRjg1WBMjmJsruLpvl0uPXyRMABBUhAzqYBHgk3kg4SgQRWCB4YNowRGqzPLplE1DNRKo3DjCbSGFIOQqPR6f6I/6hYTigWEBoYTg7zHzYsSMi47iWax2TM/SLTb5gfh6OURccIdNJIZOPP/E1UxlaeQuM8D1FDyjIAYF0I+w+i2gBbbET9bMUoAb4nHnU+eYSIlga3Ged5CSd4s6lxscYYyZTu4RD5JfG5AWJizYBfoPVwYCzw6o7Mb/gZ0R0ieW3LVNoaw8W6oapkmwPkElIHJQAV+2u4swKUZKRr6bAd762SfrkX7LZH87Ihdq/3zZpXa1+8XgfW/+3sKBW+WoBFK1gKVf99tWJAmAObqF+IjDCyr5pZ0pvqm60lGYHMEuVf7uHlvpOuCzc0iObsZa2hH6ivnHomjdINwwq9O8uzHQruXVMnUXuxS9Zz6E+SjaF0f+ATHs6v7RjEuh/Jtf6VRLPidEu+mkH0Zq6YbgNVZ1oLtewLIoCloJwwTkHdaeRVjZ5UIcBDPOGZkAGqObOeDiOev+RfSIF3XRwZqzUUe0XDBYTR855arIkvSad7DcMSX6xyZVMzvFMJu0HQpo3ciyRJdHFGTcDaA7Ui1XqHP1xskGvJCKw7WCfTbS8j2co9CFflnpdRVL2vmiWar0WjmduD3FuzH74aSDGmsn1QXpRyvfwC1dC98mTLbfFoSeQ69d+Hz7ZJf91BxM61s8XC333XM/mOXoVp3kO5Ja0ytlkB+FlBXIsdpZWoPNtWrOeuUiro4YbFqL/ZPRkuh5sQIOxQECw/hRF2VfE0z6/4dZ/Gc4aU++JJKXpCMAATjMUujUie2Su9pNB9TQy9WGW0T3j6HbmSLaQq5/Pf21as9yF6OZNPVih2Na9UuuEnLPda865y01lxGqgFgZcGxshc7qHlvpv8vLUVlRFdPPtVb9tbhV2VZ4CR17ipsid/JxtJ4ItXHbUbRMQcDK6lw4jak+FS/QUCpMAT2eyNyb0WHDCVgO/X766+rnaJP3WnZddb5H7+KaeO8SoVQCIQxVL8uoZc6l9JlJ8IfqVoCdr25ocZq+nVXDFd1XdXe1oLtV4Ivpge
82kwA4FNS/6q90/bviOl+naXEtnhVsHjuwJyt5psaf5hkn+7GWGdb7wxe75HwexcQ1nmtnkxlI7s2JXCfAGD8SRvhXkSsFR2h/V4/QKdVbQxzTAxLBGMecRs3+cateHjFVUD0zetxKSxr+M8guUZt+I5pP4y1jJ+0GVarQYQC3yRyvYIQ4dsItM/TBH0CBj0Weqs88VlBg6xWxJ/rzQLggQFUy/sx4GsoyQEoPjz7XnvjciZS/88UFxgRDwhojjDLBaCo0nWF02xBM3cyhGZPpCsygs4ixQOlM2ApjviVy2e72hXPyZjoRe4jRb5AMBWy4aiiJw5yBZX2SEmK9mgMMwZEMUlL0Zk7mu07ehU5Ry97AtX6WaVec7+DVzHt63B91cnS4fCTi1UdPBGMu/l6sajweJhxPWr7CFD1h1r97XVVARbqhdgJJLnWHh8YgGhfTpd6/V5EsrQC672z1nKbF49JOQX5GjmCJr6sEv0jLZ1MtS1qmMm2lvR869bXEDB66kRWjKRiN07z74vPs7ADVqt2TZD7jO0BE7Yhq7Oh8IV3icg+vZo77p1u4s0L57yXxtSO0Y0mr2TArGJ6rBWN72DVuSIaDsmgrdZgQJvVyrhHClb29JF/NXG/oUXRh07RsL6uC4+j3CGAZD6lnRH1h8e/TVpttm0pzxJvhNWQuFrQijl3juiKB3R6L0nJZDHOJAwDlYQRereYb7YwFc0xmIl47RQUwZpYou0GsTbLrlSEOFdunSOo1YFUqsSSaJzpi3Bw5cTmCykqBazocIcuZmDN3cdh2hrqMfOCKPTHyNl0ucSfa7ZXEFN0ru82D8Q+Sj6RbA7HJCJ/v3xk6v2GyGOhQPOY/Nv4AcKv11qke/IcHvAMD2RE3U8fM4X4XhMA/GAEoYabhBF2MNMlYwFjN8N1d9niK8GmRIp35s7Ocs8tfVoG5LxxLN4C+XZxyI+wRETYbc3OysIJHgOTW0+jSpcsglse2seUFsHgRuvCMnyoLfNxZErssW5+Wrp33q/n41p935DpgTNIZvuf3CGtLe+4E1do9WQYfTIixGvlyo2ESEKF1tnCLaLkq92kL1/K7Ryc0ptssLA/ysf5p4iQrboqll6+HeqrEEzrHVmMqOvZd0Pd5N7sZzO6bxTcV00fTw82pqSnysQHz31rfruc8FocPUqV29oyG1SyWgb//5tYti51weIer4C4A+BbLN2/+lcWSy1ns37ZslmfUX1iEtvZiy35ZpTY3V3utjR0njI49z4NQ/u8bTQ5qCObCWFgh5vNSDGK1hE6eK16FXBdW9OlKwJPjRqe4PbDciQQvNtWiBoOlteFQq6DJJ2hXr/rDp48/3tuDtHH60D3bNHawXYwZpw/XxfwQOi0kf1A8+NYo8AhN5MuOqyzfOzspHbiiOLtZUd73/xZxln/3C+//KJn1eWiB0f/OpSwHW8NWE8z/lBTvDzp4QZj34H70Lht2+LIws7098Z9p05uSX7+W5bz/f+7hJQ00tmz6Dz/ENa3fPvPJz4LCK1dGN+D1G8NUtlk7tn++06D79rZoevdDrdq/ZJVtRvMpig5Z/nXvQPy0b7/T7ycZ21uyZ948D5JvlZ5Nm3oFYTICnsBuXuvT6LT6be6DBwEuHdrm1ug0+qHtzWx/Gu3XVVteEfGEsN/aT6zf6fvFWXeivT3ULJoxUjNuoGBkbFKlWaDZQ6rla167l1SsUY/TjJNGjY7CVOPU48vX1tf7R+hJO4vFmipzEgDE78an7MJppxMALM3NOQYtEUktu21mmdm1RNwfcxuLFOcllZPeisVvSeVJeWLknI0dSaM2SZzOu93d9q7u2xAxyelLakh6qjKnDvupQ+YpxqCllmyulZktMJHPvlw6SSlzXt4MY+yujUgZp+xmD1bIK8MWc5AHDwb6ZZ5qT667sanHg7kwAKjmqOf19DTpG12XXTqI79gf1BhkNOkdy+uS3utBwQTEgnFo4EifSFD0W8empIwt+S2daHBXhyADU7S5072eksl2p97fGuQUpnTQGetq1i+uriavJ2srMQsMN6ImOr35qXv8kWQG8d0XbB1AEjONkMhIhq5//3nBTRgOOBiR4Bh6auXyA5BA5stfajzxIG88g882HVfL3cIwBRoDer3eGl5NY+So8+GmMy25eZ8GTKZnn/ykljOQy8odeGYMDACgQ2QfY503z3pvKZNrNPJnUuVD8+o2Pooax58+nT9OAQBw5+e3bKwUq2YdxtA7j+8wFPVeAJDlKaPTwf1YAmV2EqdwS2NpLqD74B3y9toH4I8/cFqLEAU5T/JQrBA3zHJgHms6V1/smjbN9U7PLrJWW2167jsovzhcv84MHTUoeUfWchjJV3EN8hXt/UtGGviGJSN8t86tNHDzTWkjx0/IyJhgRYKZXETNZHMnaJSGycQ3o7ljHBIsKvkTuCF2OS0xeezb+32YTlQmEpr7UvGG7+k7ZY/SZZJT0q1pY8fJTSn5q1li3mPe+CkT/zCNo2K205iv6OLTxqS1W4osbT7XBD6t8srlSUkh6MSJKGli0uUrI0bkiO8iSXLIJLmCEePx1F87Gh9/7Gr9ccUgSVePJR+99pzpfX0zJLKRt4AIB1I1VWRUUiBCSVXa1EP9ZJlkxnn8tauzdGKNSFOCpCMXLZuv1yNWF+muXYMxQW1dErVa2oXYECUuz0c6eSYWKUB+bcZOQGh1St2okhUrUYmXO3NLXbt4NRVGdvmyMoQfyxQSDArmNbyKigcAlJbmvvz8gtJh5AWxtq7OHhNGU86yx2XHllfE5cTaHVreMoGJyjDlLOGqwGF/eEVFrHtPDmTPppiso0er/4exDu4gpUEkrPmqL2L+hEye5ebznRZcW6bItf5LblzsL79Md3K/LHOJcBmRFtjO+Q6ffM+4Lbqo6as68rNuxqRv2rqqXnbfkFlUFusmj4gVExThhhmrPBQyk0wJLa8BuVxmjQl897aqeNmbLPuF/E19in0FtgBizN3VsKXrOF+AGY7XGLgCgYF7rJZrEPBPUL/XBQy3UIo5ifwAYjg7nBjAT+QUU6fodN9TU3R+L/yMmZKykC5WKh1LpqfqdNu7WqiL40csUCqNEdwMpXJmBD/eLtmbH/i0sbE3kB3Y23ji18D8fdK7VCTUh4b6QhHWD5I46fcfNftlKHoRGkxqfQUAvrYok9BW4vtzrhBud8XgiH22EdbxpyQMbs5nL7rGaFJf0xhUt7pxAHfJfu4/zXn+499S/R7aJv+xkY264Rt83yra/+cHVMADjCJA3yKADuU9ZDdzaR4cERCHxWCcCVBk84cvGRKAALi/pXC1fjEehgF3Z4JtZ6IUkwAFiU4W+QyYBk5YAIugCObckEFpdLEZUAzzoARSIB8K4evCnZBO6Hz0Io/vnAdfQDzIgQAXAAA=) format("woff2"); 83 font-weight: normal; 84 font-style: normal; 85 font-display: block; 86 unicode-range: U+E904,U+E908,U+E910,U+E912,U+E918,U+E920,U+E940,U+E944,U+E945,U+E946,U+E959,U+E95A,U+E972,U+E97A,U+E982,U+E98D,U+E99F,U+E9DB,U+E9E4; 87} 88 89 90 91@font-face { 92 font-family: "digital"; 93 src: url(https://cdn.brandfull.com/Themes/Cartzilla/_Font/digital-7.woff2) format('woff2'); 94 font-weight: normal; 95 font-style: normal; 96 font-display: swap; 97}</style> 98 <link rel="preload" href="https://cdn.brandfull.com/script.min.js?v=639260136226636726" as="script" fetchpriority="high"> 99 100 <link rel="preload" href="https://cdn.brandfull.com/InitData.ar.js?v=639260136446764345" as="script"> 101 <style> 102 .cart-drawer{position:fixed;top:0;right:0;width:380px;max-width:92vw;
102height:100vh;transform:translateX(var(--cart-hide-tx,100%));visibility:hidden} 103 [dir="rtl"] .cart-drawer{right:auto;left:0} 104 [dir="rtl"]{--cart-hide-tx:-100%} 105 .filter-drawer{position:fixed;top:0;left:0;width:340px;max-width:88vw;transform:translateX(var(--filter-hide-tx,-100%));visibility:hidden} 106 [dir="rtl"] .filter-drawer{left:auto;right:0} 107 [dir="rtl"]{--filter-hide-tx:100%} 108 .modal{display:none} 109 .seo-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0} 110 </style> 111 <!-- ios support --> 112 <meta name="mobile-web-app-capable" content="yes" /> 113 <meta name="apple-mobile-web-app-capable" content="yes" /> 114 <meta name="application-name" content="PWA Workshop" /> 115 <meta name="apple-mobile-web-app-title" content="PWA Workshop" /> 116 <meta name="msapplication-starturl" content="/" /> 117 <link rel="apple-touch-icon" sizes="180x180" href="https://cdn.brandfull.com/Media/BrandFull/apple-touch-icon.png?version=639260136446764345"> 118 <meta name="apple-mobile-web-app-status-bar" content="#34200C" /> 119 <meta name="msapplication-TileColor" content="#34200C" /> 120 <meta name="theme-color" content="#34200C" /> 121 122 <!-- Favicon Icon --> 123 <link rel="icon" type="image/x-icon" href="https://cdn.brandfull.com/Media/BrandFull/favicon.png?version=639260136446764345" /> 124 <link rel="icon" type="image/png" sizes="32x32" href="https://cdn.brandfull.com/Media/BrandFull/favicon-32x32.png?version=639260136446764345"> 125 <link rel="mask-icon" href="https://cdn.brandfull.com/Media/BrandFull/safari-pinned-tab.svg?version=639260136446764345" color="#5bbad5"> 126 <link rel="shortcut icon" href="https://cdn.brandfull.com/Media/BrandFull/safari-pinned-tab.svg?version=639260136446764345" color="#5bbad5"> 127 128 <!--====== Required meta tags ======--> 129 130 <meta name="robots" content="noindex, nofollow"> 131 132 133 134 135
136<script type="application/javascript"> 137 var m_loadIndex = 0; 138 var m_listScript = []; 139 140 // GTM's snippet used to create this at head-parse time; it is deferred now (see the 141 // <template id="UI_headScript"> injector at the bottom of this file), and 142 // Tools/Deferred/ThirdParty.js -- the only other place that declares the name -- is fetched 143 // on idle. Anything touching bare `dataLayer` before either arrives throws a ReferenceError, 144 // and a Portal-authored blob does exactly that from inside a doLoadScript callback, which 145 // fires long before both. Seed the array here: GTM's own `w[l] = w[l] || []` adopts THIS 146 // array, so events pushed before gtm.js loads are still replayed rather than lost. 147 // Safe against every later writer -- `var dataLayer;` in ThirdParty.js keeps the existing 148 // value (a var redeclaration of a live global does not reset it), and doSetThirdParty only 149 // assigns when its argument is non-null. 150 window.dataLayer = window.dataLayer || []; 151 152 // On the CDN with every other script the app loads -- scriptPage.min.js, scriptGallery.min.js, 153 // Handlers/Pages/*.js, Tools/Deferred/ThirdParty.js. /InitData.js is the single exception and 154 // has to stay: it is generated per language and company by our own HostController. 155 // 156 // It MUST stay in step with the <link rel=preload as=script> in both themes' _Layout: 157 // doGetVersionedUrl appends the same ?v= the preload carries, so the two URLs match byte for 158 // byte and the preloaded bytes are the ones that run. Point one at the CDN and the other at this 159 // origin and the bundle is simply downloaded twice. Neither carries crossorigin, so both are 160 // no-cors fetches and the preload is reused -- adding it to one alone would split them again. 161 // 162 // m_CDNUrl is empty on any build that serves its own assets, so this is "/script.min.js" 163 // unchanged in local dev, and doCheckOwnAsset answers true either way (leading '/', or the 164 // m_cdnBase prefix), which is what keeps the ?v= and the async-and-first placement. 165 var defaultScript = "https://cdn.brandfull.com/script.min.js"; 166 var m_isEnumReady = false; 167 168 // The whole-site blobs -- the category tree, the company and country lists, the enum translation 169 // dictionary -- served as one cacheable file by HostController instead of being inlined into 170 // every HTML response (~280 KB of a 784 KB page, the category tree alone 270 KB of it). 171 // 172 // On the CDN like every other script, even though this one is an MVC route rather than a file -- 173 // so is scriptPage.min.js, which has always been served from there. The response is a pure 174 // function of (lang, v): HostController composes it from statics keyed on nothing else, and the 175 // action drops the Set-Cookie headers the middleware seeds, which is what a CDN refuses to cache 176 // against. 177 // 178 // The language is in the URL because a script element sends no custom headers, so the `lang` 179 // header the rest of the app rides on is not available to it - and it is a PATH segment rather 180 // than ?lang= so that a CDN cannot cache one language and serve it to every visitor. See 181 // SettingManager.doGetInitDataPath, which the preload in _Layout builds from too. 182 // 183 // ?v= is written here rather than left to doGetVersionedUrl, and it is m_version -- the API's 184 // data version -- because this file IS API data: the category tree, the company and country 185 // lists, the enum translations. An /AutoRefresh that changes them without a redeploy has to 186 // change this url, and the build token would not move. doGetVersionedUrl sees the v= and adds 187 // nothing, so this stays byte-identical to the preload in _Layout, which spells it the same way. 188 var m_initDataUrl = "https://cdn.brandfull.com/InitData.ar.js?v=639260136446764345"; 189 190 // Where the fold is, straight from the value doGenerateContentfull (called in _LayoutPreload) 191 // used to pick which div templates to inline and which image to preload. One number, one 192 // definition (SettingManager.m_foldHeight). The client no longer walks the fold to decide which 193 // sections reserve a height -- every un-hydrated section holds the same 320px floor -- but the 194 // value is still read by the div loader, so it stays emitted here. 195 var m_foldHeight = 700; 196 197 // event.persisted == restored from the back/forward cache: the whole page came back frozen from 198 // memory, so nothing re-ran and m_currentCart still holds whatever it held when the visitor left. 199 // This used to call document.location.reload(), which fixed the staleness by throwing away the 200 // free instant restore -- re-downloading script.min.js, re-binding every Knockout template and 201 // re-issuing the div-section calls, on every single back navigation. 202 // doInitDataPageCart() re-fetches just the cart (CartService.GetInitData) and repopulates 203 // m_currentCart, which is what the header badge, the drawer and the totals all read. Its default 204 // arguments (reloadPage = false, url = '') mean it never navigates or reloads. 205 window.addEventListener('pageshow', function(event) { 206 if (!event.persisted) 207 return; 208 // Guard: the handler is created in the doLoadScript callback below. A restore always implies a 209 // fully-initialised page, but a restore racing a failed script load would otherwise throw here. 210 if (typeof m_handlerSession == "object" && m_handlerSession != null) 211 m_handlerSession.doInitDataPageCart(); 212 });
213 214 function doLoadReady(url) { 215 var item = m_listScript.find(item => item._url == url); 216 if (item._isLoaded == false) 217 { 218 item._isLoaded = true; 219 doRunOnReady(url, true); 220 } 221 } 222 223 var m_cdnBase = "https://cdn.brandfull.com"; 224 225 // The BUILD's token (SettingManager.m_assetVersion), not the API's data version. It buys nothing 226 // here to spend a thought on which: the bundles this versions ship with the binary, and the one 227 // url that is API data -- /InitData.js -- carries its own ?v= already, which doGetVersionedUrl 228 // leaves alone. Read the comment on SettingManager.m_assetVersion for why the two were split: 229 // versioning script.min.js with a number the API owns meant a front-only deploy re-served the 230 // same immutable url, and visitors ran an old bundle behind new markup. 231 var m_assetVersion = "639260136226636726"; 232 233 // Free-shipping teaser sentences, whole rather than assembled from labels. The teaser used to be 234 // built in the view out of "You already have" + a number + "off your shipping" + ..., and the 235 // translation service sees each fragment alone: "off your shipping" came back as the imperative 236 // "Ø§ÙØ²Ù Ù Ù Ø´ØÙÙ" ("get off your shipment"), and the Arabic sentence read as nonsense. One label per 237 // sentence gives the translator the whole clause and lets it place the number itself, which RTL 238 // needs. Substitution is doGetShipmentTeaserMessage in Handler_Session. Json.Serialize, not bare 239 // quotes: these strings are machine-translated and may legitimately contain a quote. 240 var m_textShipmentTeaserSaved = "\u0644\u0642\u062F \u0648\u0641\u0631\u062A {0} {1} \u0645\u0646 \u062A\u0643\u0644\u0641\u0629 \u0627\u0644\u0634\u062D\u0646"; 241 var m_textShipmentTeaserDiscount = "\u0644\u062F\u064A\u0643 \u0628\u0627\u0644\u0641\u0639\u0644 \u062E\u0635\u0645 \u0634\u062D\u0646"; 242 var m_textShipmentTeaserTopUp = "\u0623\u0636\u0641 \u0627\u0644\u0645\u0632\u064A\u062F \u0645\u0646 {0} {1} \u0644\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0634\u062D\u0646 \u0645\u062C\u0627\u0646\u064A"; 243 244 // Is this one of our own assets, as opposed to a third-party SDK? 245 // 246 // The old test was `url.indexOf('@SettingManager.m_CDNUrl') == -1`. m_CDNUrl is an empty 247 // string whenever the app serves its own assets (local dev, and any deployment without a 248 // separate CDN host) -- and "anything".indexOf("") is 0, never -1. Every URL therefore 249 // looked like ours, which mattered because the branches below both version the URL and 250 // choose defer-vs-async from this answer. 251 // A root-relative URL is same-origin by definition, and it is answered before the CDN test: 252 // /InitData.js is served by our own HostController, never by the CDN host, so with a CDN 253 // configured the old form called it third-party -- which skipped the ?v= cache-bust that is the 254 // only thing invalidating it across deploys. 255 function doCheckOwnAsset(url) { 256 if (url.charAt(0) === '/') 257 return true; 258 return m_cdnBase ? url.indexOf(m_cdnBase) === 0 : false; 259 } 260 261 // Cache-bust our own assets so a deploy is actually picked up, and never touch a 262 // third-party URL: several already carry a query string (Google Maps key/callback, 263 // MISPay authorize, Checkout.com), and a second "?" makes them malformed. 264 function doGetVersionedUrl(url) { 265 if (!doCheckOwnAsset(url)) 266 return url; 267 268 // Already versioned by the server -- /InitData.js, which is API data and so carries 269 // m_version rather than the build token. Appending a second v= here would both make it a 270 // different url from the <link rel=preload> in _Layout (two downloads of the same file) and 271 // hand the server two values for one parameter. 272 if (url.indexOf('?v=') !== -1 || url.indexOf('&v=') !== -1) 273 return url; 274 275 return url + (url.indexOf('?') === -1 ? '?' : '&') + 'v=' + m_assetVersion; 276 } 277 278 function doLoadScript(callBack, url = defaultScript, isModule = false) { 279 var item = m_listScript.find(item => item._url == url); 280 if (!item) { 281 item = { _isReady: false, _url: url, _callBack: [callBack], _isLoaded: false }; 282 m_listScript.push(item); 283 284 var script = document.createElement("script"); 285 if (typeof callBack == "function" && !isModule) 286 script.type = "application/javascript"; 287 else { 288 script.type = "module"; 289 script.innerText = (callBack + "").replace("URL", url); 290 } 291 script.src = doGetVersionedUrl(url); 292 293 //script.defer = true; 294 script.charset = "utf-8"; 295 script.addEventListener('load', function () { 296 doLoadReady(url); 297 }); 298 299 script.onerror = function () { 300 item._isError = true; 301 console.log("Error loading " + url); 302 // Never leave the queue standing behind a script that is not coming. doRunOnReady 303 // steps over errored items when it picks the head, but nothing else would wake it, 304 // and for /InitData.js this is also what releases doSetEnumManager's fallback. 305 doRunOnReady(url, true); 306 }; 307 308 try { 309 // Third-party SDKs are deferred and appended; ours are async and put first so 310 // they start downloading as early as possible. 311 if (!doCheckOwnAsset(url)) 312 { 313 script.defer = true; 314 document.head.appendChild(script); 315 } 316 else{ 317 script.async = true; 318 var head = document.getElementsByTagName("head")[0]; 319 head.insertBefore(script, head.firstChild); 320 } 321 } catch (error) { 322 //once load before 323 console.log(error); 324 setTimeout(doRunOnReady, 1000, url, true); 325 return false; 326 } 327 } 328 else if (item._isReady === true) { 329 // Synchronous, because the script this callback waited for has already loaded. That is
330 // exactly the state an ajax view swap runs in: doHtmlSetInner evaluates the swapped-in 331 // page's inline block, it calls doLoadScript for a bundle that is already _isReady, and 332 // the callback runs right here, inside that eval. doLoadViewAjax now compares 333 // X-Asset-Version against m_assetVersion and navigates instead of swapping, so a skew 334 // introduced by the RESPONSE no longer reaches this line -- see doRunCallBack below for 335 // what still does. 336 if (typeof callBack == "function") 337 doRunCallBack(callBack); 338 } 339 else { 340 item._callBack.push(callBack); 341 } 342 } 343 344 // Run one page callback, and treat a missing symbol as a bundle that cannot serve this markup. 345 // 346 // A ReferenceError out of a page's own callback -- "doFinishPaintEarly is not defined", 347 // "doSetHandlerPageScroller is not defined" -- is never a typo in the view: those calls sit INSIDE a 348 // doLoadScript callback, so the bundle demonstrably arrived. It means the bundle that arrived is 349 // an OLD build. A tab held open across a deploy keeps the script.min.js it loaded then, and an 350 // ajax swap pulls markup from the server as it is NOW; ?v= cannot repair that, because the swap 351 // never re-loads the bundle and the old one is already parsed. A stale or failed 352 // Handlers/Pages/*.js throws the identical error and is fixed by the identical answer. 353 // 354 // Second line of defence since doLoadViewAjax gained its X-Asset-Version check, which stops the 355 // skew before anything is swapped. What still lands here is what no response header can see: a 356 // stale or failed Handlers/Pages/*.js, a bundle the CDN served old under a current ?v=, and the 357 // one navigation per build doClaimBuildNavigation lets through so a mixed fleet cannot ping-pong. 358 // 359 // The answer is to stop and let the browser fetch the document properly: the new document carries 360 // a new m_assetVersion, and every ?v= in it then points at the matching build. 361 // 362 // Keyed on m_assetVersion so it cannot loop -- the flag records the build we already reloaded 363 // for, so a genuine bug in the current build reloads once and then stops. A storage failure 364 // (Safari private mode) means no flag can be kept, so it does not reload at all. 365 function doReloadOnceForBuild() { 366 try { 367 if (sessionStorage.getItem('bundleReload') == m_assetVersion) 368 return false; 369 sessionStorage.setItem('bundleReload', m_assetVersion); 370 } 371 catch (storageError) { return false; } 372 window.location.reload(); 373 return true; 374 } 375 376 function doRunCallBack(callBack) { 377 try { 378 callBack(); 379 } 380 catch (error) { 381 console.log(error); 382 if (!(error instanceof ReferenceError)) 383 return; 384 doReloadOnceForBuild(); 385 } 386 } 387 388 // /InitData.js carries the 111 enums, m_jsonTranslate and the three jsonList* blobs. It is 389 // fetched, not inlined, so it can fail -- and if it does, every one of those globals is missing 390 // and nothing on the page would ever run. Deliberately keyed on _isError and not on a timeout, 391 // so a slow file is waited for rather than given up on. 392 function doCheckInitDataFailed() { 393 var item = m_listScript.find(item => item._url == m_initDataUrl); 394 return item ? item._isError === true : false; 395 } 396 397 function doSetEnumManager(url) { 398 // TranslateEnum used to arrive with script.min.js and only m_jsonTranslate came from 399 // /InitData.js. The enums moved there too, so both tests now answer the same question -- 400 // "has /InitData.js landed" -- and are asked together. Neither says anything about the 401 // bundle any more; that is what the doApplyTranslations test further down is for. 402 // 403 // Not here yet -> "not yet". Gone for good -> RELOAD, once per build, on the same 404 // sessionStorage guard doRunCallBack uses. Standing empty objects up is no longer a 405 // degraded-but-working page the way it was when the enums were in the bundle: every page on 406 // the site has a binding that reads one, so an empty stand-in trades one failed request for 407 // a page of failed bindings. A reload is the only thing that can actually fix it, and the 408 // guard is what stops it looping. 409 // 410 // If the reload has already been spent on this build (or sessionStorage is unavailable, as 411 // in Safari private mode), fall through to the old behaviour: empty lists, keys for labels,
412 // no category menu. Worse than it was, but still a page. 413 if (typeof TranslateEnum != "object" || typeof m_jsonTranslate != "object") { 414 if (!doCheckInitDataFailed()) 415 return false; 416 if (doReloadOnceForBuild()) 417 return false; 418 419 if (typeof TranslateEnum == "undefined") TranslateEnum = {}; 420 if (typeof m_jsonTranslate != "object") m_jsonTranslate = {}; 421 if (typeof jsonListCategory == "undefined") jsonListCategory = []; 422 if (typeof jsonListCompany == "undefined") jsonListCompany = []; 423 if (typeof jsonListCountry == "undefined") jsonListCountry = []; 424 } 425 426 // Comes from _LayoutScriptTail at the foot of the document. Same "not yet" answer as the 427 // tests above: doRunOnReady waits on DOMContentLoaded, which is the instant it comes into 428 // being. 429 // 430 // Never write a literal body tag in a comment inside an inline script. doLoadViewAjax 431 // pulls a full-page ajax response apart by searching the TEXT for one, so a mention in 432 // the head matches 20 KB before the real element and the rest of this script gets 433 // written into the page as visible text. That shipped. Ajax.ts no longer scans for it, 434 // but the phrasing here stays deliberate. 435 // doApplyTranslations comes from script.min.js (Tools/Enums.ts). Nothing above tests for the 436 // bundle any more: TranslateEnum moved to /InitData.js with the other 110 enums, so the 437 // TranslateEnum test now proves /InitData.js landed and says nothing about the bundle. Without 438 // this, /InitData.js winning the race against the bundle threw 439 // "doApplyTranslations is not defined" out of the try below on every such load. 440 if (typeof doApplyTranslations != "function" || typeof doApplySettingByCompany != "function") 441 return false; 442 443 try { 444 doApplyTranslations(m_jsonTranslate); 445 doApplySettingByCompany(); 446 } catch (error) {console.log(error); return false;} 447 448 m_isEnumReady = true; 449 return true; 450 } 451 452 453 // Nothing may run before the document has finished parsing, and the two things that gate a 454 // callback resolve on their own events: doApplySettingByCompany appears when the parser reaches 455 // _LayoutScriptTail, and TranslateEnum / m_jsonTranslate appear when script.min.js and 456 // /InitData.js load. So this is entirely event-driven -- there is no timer left in it. 457 // 458 // It used to be setTimeout(..., sleepTime) with sleepTime += 50 on every miss -- 50, 100, 150, 459 // 200 -- and the escalated value was then carried into the readyState test and into the 460 // queue-order test, where scriptPage.min.js polled behind script.min.js on its own growing timer. 461 // Dead latency sitting in front of doSetSetting, i.e. in front of the page's bind, and the page 462 // gate charges every millisecond of it to LCP. 463 // 464 // The `url` argument is now only a hint about WHY we were woken. What actually runs is decided by 465 // walking the queue from its head, which is what makes the ordering safe no matter which script 466 // wins the race: whoever arrives last finds everything before it already loaded and drains the 467 // lot. Draining only `url` would deadlock -- the head could be ready with nobody left to notice. 468 function doRunOnReady(url, byscript = false) { 469 if (document.readyState === "loading") { 470 document.addEventListener('DOMContentLoaded', function () { doRunOnReady(url, byscript); }, { once: true }); 471 return ; 472 } 473 474 // Still missing a dependency. Do NOT schedule a retry: every one of them arrives on a load 475 // event that calls straight back in here. 476 if(m_isEnumReady == false && !doSetEnumManager(url)) 477 return ; 478 479 try { 480 //console.log("ByScript " + byscript + ", " + url + " "+document.readyState) 481 for (;;) { 482 // The head of the queue: the first script still owing its callbacks. One that failed 483 // to load is stepped over rather than left at the head -- it is never becoming ready, 484 // and leaving it there would wedge everything behind it. 485 var item = m_listScript.find(x => x._isReady == false && x._isError != true); 486 487 // Nothing waiting, or the head has not arrived yet -- and callbacks run in request 488 // order, so anything behind it waits for its load event. 489 if (!item || item._isLoaded != true) 490 return ; 491 492 while (item._callBack.length != 0) { 493 var callBack = item._callBack.shift(); 494 // Detached by setTimeout, so the try around this loop never sees what the 495 // callback throws -- doRunCallBack is the only thing that can. 496 if (typeof callBack == "function") 497 setTimeout(doRunCallBack, 0, callBack); 498 } 499 500 item._isReady = true; 501 //console.log("ByScript " + item._url + " is passed") 502 } 503 }catch (error) { 504 console.log(error); 505 } 506 } 507 508</script>
508 509 510
510<script> 511 function doGetBrowserName() { 512 var nAgt = navigator.userAgent; 513 var browserName = navigator.appName; 514 var nameOffset, verOffset; 515 516 if ((verOffset = nAgt.indexOf("OPR/")) != -1) 517 browserName = "Opera"; 518 else if ((verOffset = nAgt.indexOf("Opera")) != -1) 519 browserName = "Opera"; 520 else if ((verOffset = nAgt.indexOf("MSIE")) != -1) 521 browserName = "Microsoft Internet Explorer"; 522 else if ((verOffset = nAgt.indexOf("Chrome")) != -1) 523 browserName = "Chrome"; 524 else if ((verOffset = nAgt.indexOf("Safari")) != -1) 525 browserName = "Safari"; 526 else if ((verOffset = nAgt.indexOf("Firefox")) != -1) 527 browserName = "Firefox"; 528 else if ((nameOffset = nAgt.lastIndexOf(' ') + 1) < 529 (verOffset = nAgt.lastIndexOf('/'))) { 530 browserName = nAgt.substring(nameOffset, verOffset); 531 if (browserName.toLowerCase() == browserName.toUpperCase()) 532 browserName = navigator.appName; 533 } 534 return browserName; 535 } 536 537 function doGetSystemInfo() { 538 var browserName = doGetBrowserName(); 539 var nav = navigator || {}; 540 var scr = (typeof screen != "undefined") ? screen : {}; 541 var data = decodeURI(window.location.href) + "#" + browserName + "#" + nav.platform + "#" 542 + "\nUA: " + nav.userAgent 543 + "\nViewport: " + window.innerWidth + "x" + window.innerHeight + " @" + (window.devicePixelRatio || 1) + "x" 544 + "\nScreen: " + (scr.width || "?") + "x" + (scr.height || "?") 545 + "\nLang: " + (nav.language || "?") + " | Online: " + nav.onLine + " | Mem: " + (nav.deviceMemory ? nav.deviceMemory + "GB" : "?") 546 + "\nReferrer: " + document.referrer; 547 return data; 548 } 549 550 // Client-side dedupe. The hash identifies the *fault*, not the visit: page URLs, 551 // line/col and cache-busting query strings are deliberately left out, so the same 552 // error raised on 500 product pages collapses to one hash and is posted once. 553 // Kept in localStorage so it also survives reloads and in-app-browser page hops -- 554 // repeat visits from the same device stop re-posting a fault we already have. 555 var m_sentHash = {}; // this page load; still works when storage is blocked 556 var m_hashKey = "errHash", m_hashMax = 100; 557 558 function doGetStackSignature(stack) { 559 var lines = ("" + stack).split("\n"), out = [], i, m; 560 for (i = 0; i < lines.length && out.length < 5; i++) { // 5 frames: deep recursion collapses 561 m = lines[i].match(/^\s*at\s+([^\s(]+)/) // Chrome/Edge: " at doFoo (url:1:2)" 562 || lines[i].match(/^\s*([^\s@]+)@/); // Safari/Firefox: "doFoo@url:1:2" 563 if (m && m[1]) 564 out.push(m[1]); 565 } 566 return out.join(">"); 567 } 568 569 function doGetHash(text) { 570 var h = 0x811c9dc5; // FNV-1a, 32-bit 571 for (var i = 0; i < text.length; i++) { 572 h ^= text.charCodeAt(i); 573 h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0; 574 } 575 return h.toString(36); 576 } 577 578 // true = already reported, skip. Marks as seen on first call. 579 function doCheckSentBefore(hash) { 580 if (m_sentHash[hash] === true) 581 return true; 582 m_sentHash[hash] = true; 583 var list = []; 584 try { list = (localStorage.getItem(m_hashKey) || "").split(","); } catch (e) { } 585 if (list.indexOf(hash) != -1) 586 return true; 587 list.push(hash); 588 if (list.length > m_hashMax) // bounded ring, oldest hashes fall off 589 list = list.slice(list.length - m_hashMax); 590 try { localStorage.setItem(m_hashKey, list.join(",")); } catch (e) { } 591 return false; 592 } 593 594 function doReportError(kind, message, source, lineno, colno, error) { 595 var msgStr = (message == null) ? "" : ("" + message); 596 if (msgStr == "Script error." || msgStr.indexOf("_AutofillCallbackHandler") != -1) 597 return; 598 // Third-party noise, not our code -> ignore. Six families: 599 // 1. In-app browsers (Meta/IG/FB/Snapchat) inject native bridges that throw in non-native webviews. 600 // 2. Android/iOS WebView bridge objects get torn down on navigation ("Java object is gone"). 601 // 3. Injected analytics (GTM Custom HTML tags) throw from their own host, not ours. 602 // 4. Browser reader-mode shims (Brave/Firefox iOS inject window.__firefox__) throw before .reader exists. 603 // 5. MS Office/Outlook link-handler bridge rejects on a torn-down object id, on pages opened from email. 604 // 6. TikTok/Bytedance webview (musical_ly UA, FalconTag) injects its own script that handshakes 605 // with a parent iframe bridge that doesn't exist in the ad-preview dialog. 606 var stackStr = (error && error.stack) ? ("" + error.stack) : ""; 607 var noise = [ 608 "window.webkit.messageHandlers", // iOS webkit bridge (Meta/IG/FB) 609 "WebJSBridge", // Snapchat bridge 610 "sendDataToNative",
611 "sendPageShowMessage", 612 "Java object is gone", // Android WebView bridge torn down (IG keyboard/nav loggers) 613 "googletagmanager.com", // GTM Custom HTML tags 614 "__firefox__", // Brave/Firefox iOS reader-mode injection 615 "Object Not Found Matching Id:", // MS Office/Outlook bridge, e.g. "...Id:6, MethodName:update, ParamCount:4" 616 "iframeBridge", // TikTok FalconTag handshake into a parent bridge that isn't there 617 "user-script:" // frames from webview-injected scripts (TikTok/Bytedance); ours are https:// URLs 618 ]; 619 var haystack = msgStr + "\n" + stackStr + "\n" + (source == null ? "" : source); 620 for (var i = 0; i < noise.length; i++) 621 if (haystack.indexOf(noise[i]) != -1) 622 return; 623 // In-app browsers run injected scripts under a private "<name>js://" URL scheme 624 // (iabjs:// = Instagram). Our own code only ever runs from http(s):// -> any *js:// frame is theirs. 625 if (/[a-z0-9_]+js:\/\//i.test(stackStr)) 626 return; 627 // ServiceWorker registration failing to *fetch the script* (AbortError) = in-app browsers / 628 // blocked-storage contexts that can't install a SW. Benign, non-actionable. Deliberately narrow: 629 // real breakage (bad HTTP 404, SecurityError, parse error) has a different message and still logs. 630 if (msgStr.indexOf("Failed to register a ServiceWorker") != -1 && msgStr.indexOf("fetching the script") != -1) 631 return; 632 // Benign network/fetch-abort promise rejections (flaky mobile networks, in-app browsers, 633 // navigation aborting an in-flight request, blocked third-party trackers). No stack, not 634 // actionable. Scoped to promise rejections so real TypeErrors in our code still log. 635 if (kind == "promise" && (msgStr == "Load failed" 636 || msgStr.indexOf("Failed to fetch") != -1 637 || msgStr.indexOf("NetworkError") != -1 638 || msgStr.indexOf("network connection was lost") != -1 639 || msgStr.indexOf("cancelled") != -1 640 || msgStr.indexOf("appears to be offline") != -1)) 641 return; 642 // Benign browser notice, not an exception: an observer callback resized things again, so the 643 // browser deferred the remaining notifications to the next frame. Comes from third-party 644 // swiper/animation code, has no stack, and nothing breaks. Both wordings ("loop limit exceeded" 645 // = Chrome, "loop completed with undelivered notifications" = Safari/Chrome) are the same event. 646 if (msgStr.indexOf("ResizeObserver loop") != -1) 647 return; 648 var parameters = {}; 649 try { 650 var name = (error && error.name) ? error.name : ""; 651 var realMsg = (error && error.message) ? error.message : msgStr; 652 var stack = (error && error.stack) ? error.stack : "(no stack available)"; 653 parameters["_exceptionMessage"] = "[" + kind + "] " + (name ? name + ": " : "") + realMsg; 654 parameters["_methodName"] = source + " -- Row N° " + lineno + " Col N° " + colno; 655 parameters["_exception"] = doGetSystemInfo() + "\n\n" + stack; 656 657 658 if (typeof doSendAjax == "function") { 659 var hash = doGetHash(kind + "|" + name + "|" + realMsg + "|" + doGetStackSignature(stack)); 660 if (!doCheckSentBefore(hash)) 661 doSendAjax(RequestCode.SystemService.SaveExceptionJS, ko.toJSON(parameters), null, null); 662 } 663 } 664 catch (e) { console.log(e); } 665 } 666 667 window.onerror = function doErrorHandler(message, source, lineno, colno, error) { 668 doReportError("onerror", message, source, lineno, colno, error); 669 return true; 670 }; 671 672 window.addEventListener('unhandledrejection', function (e) { 673 var reason = e ? e.reason : null; 674 var msg = (reason && reason.message) ? reason.message : ("" + reason); 675 doReportError("promise", msg, 676 (reason && reason.fileName) || "", 677 (reason && reason.lineNumber) || 0, 678 (reason && reason.columnNumber) || 0, 679 reason); 680 }); 681 </script>
vendor: 2 bytes, line 681
681
682<script type="application/javascript"> 683 m_isCrawlByBot = 'True' == 'True'; 684 685 window.addEventListener('resize', function() 686 { 687 if(typeof m_handlerLayout != "object" || m_handlerLayout == null) 688 return; 689 690 if(typeof m_handlerLayout.m_isViewMobile == "function") 691 m_handlerLayout.m_isViewMobile('False' == 'True' || window.innerWidth < 768); 692 693 if(typeof m_handlerLayout.m_isMenuMobile == "function") 694 m_handlerLayout.m_isMenuMobile(window.innerWidth < 992); 695 }); 696 697 698 window.doOpenCropper = function (handler, folder, item) {} 699 700 // Requested FIRST, so it sits at the head of m_listScript and no page callback can run before its 701 // globals exist -- doSetEnumManager reads m_jsonTranslate, and the callback below reads all three 702 // jsonList* blobs. It carries no callback of its own; being in the queue is the whole point. 703 // It is a parallel fetch, not a serial one: it goes out alongside script.min.js, and the bundle is 704 // the bigger of the two. 705 doLoadScript(function () { }, m_initDataUrl); 706 707 doLoadScript(function () { 708 m_version = '639260136446764345'; 709 doSetSetting('https://brandfullsapi.azurewebsites.net', 'ar', 'sa', 'https://cdn.brandfull.com', 'BrandFull', "", "{\u0022_bundleSelectPercentage\u0022:40,\u0022_addCartQuantityLimit\u0022:\u0022100\u0022,\u0022_showObjectHtml\u0022:true,\u0022_showObjectExtras\u0022:true,\u0022_showObjectIsReturnable\u0022:true,\u0022_showObjectCounter\u0022:true,\u0022_showObjectDeliveryTime\u0022:false,\u0022_returnPolicyDays\u0022:\u00227\u0022,\u0022_returnPolicyFees\u0022:0,\u0022_returnPolicyMethod\u0022:0,\u0022_returnPolicyRefundType\u0022:0,\u0022_returnPolicyCountry\u0022:\u0022SA\u0022,\u0022_isBarCodeOptional\u0022:true,\u0022_allowPriceSaleAbovePriceRegulare\u0022:true}"); 710 711 712 if (doGetParamFromURL('Cookies') == "delete") 713 { 714 doSetCookie('cart', null, 1); 715 doGetSessionID(); 716 717 doRemoveURLParam("Cookies"); 718 } 719 720 m_handlerSession = new Handler_Session(); 721 m_handlerSession.doInitData(jsonListCompany, jsonListCountry); 722 doSetHandlerSession(m_handlerSession); 723 m_handlerLayout = new Handler_Layout(); 724 m_handlerLayout.m_isViewMobile('False' == 'True' || window.innerWidth < 768); 725 m_handlerLayout.doInitData(jsonListCategory); 726 m_handlerLayout.m_currentCategoryShortName(''); 727 m_handlerLayout.m_search(""); 728 doSetHandlerLayout(m_handlerLayout); 729 730 731 }); 732 733 // scriptPage.min.js -- bootstrap.bundle plus the Google-Maps position helper -- is NOT requested 734 // here any more. It was, on every page, with the empty callback this comment replaced: nothing 735 // waited on it, so 82 KB was parsed and compiled on the main thread ahead of the page's bind for 736 // no reader. Its entire consumer surface is interaction-driven: bootstrap.Modal (Tools/Html.ts), 737 // bootstrap.Collapse (Handler_PageCheckout), doGetCurrentPosition, and the data-api attributes in 738 // the markup -- dropdown, collapse, tab, dismiss. None of it runs at load. 739 // 740 // Defined here rather than in the bundle because callers reach it from inline script. 741 var m_pageScriptUrl = "https://cdn.brandfull.com/scriptPage.min.js"; 742 743 function doLoadPageScript(callBack = function () { }) { 744 doLoadScript(callBack, m_pageScriptUrl); 745 } 746 747 // Google Maps, requested once per document rather than once per view. 748 // 749 // doLoadScript dedupes by exact url string, and five views asked for Maps with four different 750 // strings -- two callback names (doInitMap, doInitGoogleMap), and Page_CreateSupport on 751 // maps.google.com rather than maps.googleapis.com, without libraries=places. Ajax navigation 752 // never reloads the document, so visiting two of those pages in one session appended two script 753 // tags for the same library: "You have included the Google Maps JavaScript API multiple times", 754 // followed by the custom elements it registers being defined twice 755 // (Element with name "gmp-internal-dialog" already defined). 756 // 757 // So: one url, and one name for Google to call. Pages hand their own initializer to 758 // doLoadGoogleMaps instead of naming it in a query string. Note the initializer
758s are read at 759 // call time, which is what keeps Page_About and Page_CreateSupport from fighting over the 760 // window.doInitGoogleMap they both define -- each view's inline block re-runs on its own ajax 761 // swap, so the one queued is always the current page's. 762 var m_googleMapUrl = "https://maps.googleapis.com/maps/api/js?libraries=places&key=AIzaSyBELKgTURcJMCbnFgFY4aizo0dbwokRqU4&callback=doGoogleMapsReady&loading=async&language=ar"; 763 var m_isGoogleMapsReady = false; 764 var m_listGoogleMapsReady = []; 765 766 // The single name in the url above. Global because Google resolves it off window. 767 function doGoogleMapsReady() { 768 m_isGoogleMapsReady = true; 769 while (m_listGoogleMapsReady.length > 0) 770 doRunCallBack(m_listGoogleMapsReady.shift()); 771 } 772 773 function doLoadGoogleMaps(callBack = function () { }) { 774 // scriptPage.min.js first: every page initializer this fans out to reaches into 775 // _Js/GoogleMapGetCurrentLocation.js -- doInitMap is defined there outright, and 776 // Page_About / Page_CreateSupport push into the `markers` array it declares. 777 doLoadPageScript(function () { 778 if (m_isGoogleMapsReady) { 779 doRunCallBack(callBack); 780 return; 781 } 782 783 m_listGoogleMapsReady.push(callBack); 784 doLoadScript(function () { }, m_googleMapUrl); 785 }); 786 } 787 788 // Bootstrap installs its data-api listeners on document when it evaluates, so a click that lands 789 // before the file does is a click that does nothing. Hence arming on the earliest signals a real 790 // visitor produces -- hover and scroll both precede the first tap far more often than not -- and 791 // not merely on the click itself. Capture phase so a stopPropagation somewhere cannot hide them. 792 // 793 // The load-event fallback is for the visitor who reads without touching anything. It is behind 794 // `load` on purpose: an idle callback armed any earlier competes with the page's own bind for the 795 // main thread, which is the cost this whole change exists to remove. 796 (function () { 797 var isArmed = false; 798 799 function doArmPageScript() { 800 if (isArmed) 801 return; 802 isArmed = true; 803 doLoadPageScript(); 804 } 805 806 var listEvent = ['pointerover', 'pointerdown', 'touchstart', 'keydown', 'scroll']; 807 for (var i = 0; i < listEvent.length; i++) 808 window.addEventListener(listEvent[i], doArmPageScript, { capture: true, once: true, passive: true }); 809 810 window.addEventListener('load', function () { 811 if (typeof window.requestIdleCallback == "function") 812 window.requestIdleCallback(doArmPageScript, { timeout: 3000 }); 813 else 814 setTimeout(doArmPageScript, 1000); 815 }); 816 })(); 817 818 // The Portal's head hook -- GTM, and through GTM's Custom HTML tags the Facebook, Snapchat and 819 // TikTok pixels -- injected on the same signals as scriptPage.min.js instead of parsed inline. 820 // 821 // It used to sit below this script as raw markup, which meant every visitor parsed, compiled and 822 // EXECUTED a tag manager plus three pixels before the browser had seen a single byte of <body>. 823 // Measured on the Blends home page: TBT 1,700ms, FCP 3.3s, and three rounds of asset trimming 824 // ahead of this moved FCP by 0.1s because none of them touched the thing actually holding the 825 // main thread. The error-swallow list at the top of this file already names googletagmanager.com 826 // and the Snapchat WebJSBridge -- the cost was known, only its timing was not. 827 // 828 // A <template> because its content is INERT: the parser builds the nodes but runs no script and 829 // fetches no src, which is the whole point. innerHTML would have been inert too, but only by 830 // accident and only for scripts -- an <img> in the blob would still have been fetched. 831 (function () { 832 var isArmed = false; 833 var isInjected = false; 834 835 function doInjectHeadScript() { 836 if (isInjected) 837 return; 838 isInjected = true; 839 840 var holder = document.getElementById('UI_headScript'); 841 if (!holder) 842 return; 843 844 var fragment = holder.content.cloneNode(true); 845 var listNode = Array.prototype.slice.call(fragment.childNodes); 846 847 for (var i = 0; i < listNode.length; i++) { 848 var node = listNode[i]; 849 850 // A
850<script> moved out of a template stays inert -- "already started" is not the 851 // flag, but a parser-inserted script that was never executed will not execute on 852 // insertion either. It has to be re-created as a fresh element. 853 if (node.nodeName == 'SCRIPT') { 854 var script = document.createElement('script'); 855 for (var a = 0; a < node.attributes.length; a++) 856 script.setAttribute(node.attributes[a].name, node.attributes[a].value); 857 script.text = node.text; 858 859 // async=false on a DYNAMICALLY created script means "in-order", not "blocking": 860 // externals then execute in insertion order relative to each other. GTM's inline 861 // snippet seeds window.dataLayer and must run before gtm.js reads it, and the 862 // default async=true would have let that race. 863 if (script.src) 864 script.async = false; 865 866 document.head.appendChild(script); 867 } 868 else 869 document.head.appendChild(node); 870 } 871 } 872 873 function doArmHeadScript() { 874 if (isArmed) 875 return; 876 isArmed = true; 877 878 // The blob calls doSetThirdParty (see Tools/ThirdPartyDefer.ts, which stubs that name 879 // for exactly this reason). The stub ships in script.min.js, which is fetched async, so 880 // waiting on its ready callback is what guarantees the call lands somewhere. In the old 881 // inline arrangement it did not: the blob ran at parse time, well before the bundle. 882 if (typeof window.doSetThirdParty == "function") { 883 doInjectHeadScript(); 884 return; 885 } 886 887 doLoadScript(doInjectHeadScript); 888 889 // Backstop, because a callback registered on script.min.js never fires if that bundle 890 // errors -- and "the bundle failed" must not also mean "no analytics for that visit". 891 // doInjectHeadScript is idempotent, so whichever path arrives first wins. 892 setTimeout(doInjectHeadScript, 4000); 893 } 894 895 var listHeadEvent = ['pointerover', 'pointerdown', 'touchstart', 'keydown', 'scroll']; 896 for (var h = 0; h < listHeadEvent.length; h++) 897 window.addEventListener(listHeadEvent[h], doArmHeadScript, { capture: true, once: true, passive: true }); 898 899 // WHEN the blob runs, and the reason it is not simply "on load, then idle" any more. 900 // 901 // Measured on the Blends home page: the tag manager and the pixels it injects through its 902 // Custom HTML tags cost 2,217 ms of main-thread CPU -- more than every first-party script 903 // on the page put together (1,944 ms). Five Google containers alone are 1,204 ms of that, 904 // then Facebook 417, Clarity 252, TikTok 137, Pinterest 110, Snapchat 97. 905 // 906 // The old trigger was `load` plus requestIdleCallback(timeout 3000). Both fire while the 907 // page is still doing its own work: `load` only means subresources finished, not that the 908 // bind and the div hydration have, and a 3-second timeout fires whether or not an idle slot 909 // ever appeared. So 2.2 seconds of vendor script landed on a main thread that was still 910 // building the page. 911 // 912 // "Stable" is defined here as the browser itself defines it -- no long task for a 913 // continuous stretch -- rather than as a delay someone picked. Every long task pushes the 914 // decision back; when the page finally goes quiet for m_headQuietMs the blob goes in on the 915 // next idle slot. That is the same shape as TTI with a shorter quiet window, which is the 916 // point: analytics should start as soon as the page has actually settled, not at a fixed 917 // time that is too early on a slow device and too late on a fast one. 918 // 919 // Interaction still wins outright, above: a visitor who is already touching the page has a 920 // usable page by definition, and their session is the one most worth recording. 921 var m_headQuietMs = 2000; // continuous no-long-task stretch that counts as settled 922 var m_headCapMs = 10000; // hard backstop -- see below 923 var m_headQuietTimer = null; 924 925 function doDelayHeadScript() { 926 clearTimeout(m_headQuietTimer); 927 m_headQuietTimer = setTimeout(function () { 928 if (typeof window.requestIdleCallback == "function") 929 window.requestIdleCallback(doArmHeadScript, { timeout: 2000 }); 930 else 931 doArmHeadScript(); 932 }, m_headQuietMs); 933 } 934 935 window.addEventListener('load', function () { 936 // A main thread that never goes quiet -- a slow device, a runaway third-party, a tab 937 // that stays busy -- must not mean no analytics at all for that visit. This fires 938 // regardless; doArmHeadScript is idempotent, so whichever path gets there first wins. 939 setTimeout(doArmHeadScript, m_headCapMs); 940 941 // longtask is Chromium-only. Where it is missing (Safari, Firefox) there is nothing to 942 // observe, so the quiet timer simply runs once from load and behaves like the old 943 // fixed delay -- degraded to the previous behaviour, not to no behaviour. 944 try { 945 if (typeof PerformanceObserver == "function" 946 && PerformanceObserver.supportedEntryTypes 947 && PerformanceObserver.supportedEntryTypes.indexOf('longtask') != -1) { 948 new PerformanceObserver(function () { 949 if (!isArmed) 950 doDelayHeadScript(); // still busy -- restart the quiet window 951 }).observe({ type: 'longtask', buffered: false }); 952 } 953 } 954 catch (error) { console.log(error); } 955 956 doDelayHeadScript(); 957 }); 958 })(); 959 960</script>
vendor: 2 bytes, line 960
960
961<script> 962 (function () { 963 // The reference file is NOT a stylesheet -- it opens with an HTML comment header and 964 // wraps the payload in <style>, exactly as the Portal field must. So it cannot be a 965 // <link>: the header would be a parse error and the tags are not CSS. Fetch it and 966 // hand the browser the same string @Html.Raw would have emitted. 967 var url = 'https://brandfull.com/Themes/Cartzilla/_Css/BrandFull/StyleCss_Script.reference.css?version=639260136446764345'; 968 969 fetch(url, { cache: 'no-store' }) 970 .then(function (response) { 971 if (!response.ok) 972 throw new Error('StyleCss_Script.reference.css -> HTTP ' + response.status); 973 974 return response.text(); 975 }) 976 .then(function (text) { 977 // Take what is BETWEEN the tags. Assigning the raw text to innerHTML would put a 978 // literal <style> inside a <style>, which parses as nothing at all. 979 var match = /<style[^>]*>([\s\S]*?)<\/style>/i.exec(text); 980 if (!match) { 981 console.warn('[StyleCss_Script test] no <style> block in ' + url); 982 return; 983 } 984 985 // Appended to <head> AFTER the site bundle link, so a :root here outranks the 986 // same :root in StyleApp.css -- the same seam the Portal value occupies. 987 var style = document.createElement('style'); 988 style.id = 'UI_styleCssScriptTest'; 989 style.textContent = match[1]; 990 document.head.appendChild(style); 991 }) 992 .catch(function (error) { console.warn('[StyleCss_Script test] ' + error.message); }); 993 })(); 994</script>
994 995<template id="UI_headScript"> 996<!-- Google Tag Manager -->
997<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s);j.async=true;j.src="https://shn.brandfull.com/cjbruxijtzaj.js?"+i;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','ezx8gtx3=AwVHMz4kVSU%2BKzA3PSU0UxxcSFpbTxwbVwMIFQQNHgAGDVQXBQQ%3D');</script>
997 998<!-- End Google Tag Manager --> 999 1000</template> 1001 1002</head> 1003 1004<body id="UI_body" style="overflow-y: clip;" class="noPadding"> 1005 1006 1007 1008 1009 1010 1011 <h2 class="seo-hidden"></h2> 1012 1013
1013<script type="application/ld+json"> 1014 { 1015 "@context": "https://schema.org", 1016 "@type": "OnlineStore", 1017 "name": "Brandfull", 1018 "alternateName": "Brandfull", 1019 "description": "At Brandfull we believe in second chances and the thrill of discovering hidden treasures. Our journey began with a simple idea: to bring new life into pre-loved items while offering our customers unique finds that resonate with their individuality.", 1020 "knowsLanguage": "AR,EN", 1021 "sameAs": [ 1022 "https://www.facebook.com/brandfullCom/", 1023 "https://twitter.com/brandful_l", 1024 "https://www.instagram.com/brandfull_ksa/", 1025 "https://api.whatsapp.com/send?phone=966592905003", 1026 "https://www.snapchat.com/add/brandful_l" 1027 ], 1028 "url": "https://brandfull.com", 1029 "logo": "https://brandfull.com/_Image/favicon.png","hasMerchantReturnPolicy":{"@type":"MerchantReturnPolicy","applicableCountry":"SA","returnPolicyCategory":"https://schema.org/MerchantReturnFiniteReturnWindow","merchantReturnDays":7,"returnMethod":"https://schema.org/ReturnByMail","returnFees":"https://schema.org/FreeReturn","refundType":"https://schema.org/FullRefund"} 1030 } 1031 </script>
1031 1032 1033
1033<script type="application/ld+json"> 1034 { 1035 "@context": "https://schema.org", 1036 "@type": "ContactPoint", 1037 "@contactType": "Customer Service", 1038 "availableLanguage": "AR,EN", 1039 "email": "[email protected]", 1040 "telephone": "966592905003" 1041 } 1042 </script>
1042 1043
1043<script type="application/ld+json"> 1044 { 1045 "@context": "https://schema.org", 1046 "@type": "WebSite", 1047 "name": "WebSite Brandfull", 1048 "url": "https://brandfull.com", 1049 "potentialAction": [ 1050 { 1051 "@type": "SearchAction", 1052 "target": "https:/brandfull.com/Shop/search?q={search_term_string}", 1053 "query-input": "required name=search_term_string" 1054 } 1055 ] 1056 } 1057 </script>
1057 1058 1059 1060 <!-- Home Popup Section --> 1061 <!-- End Screen Load Popup Section --> 1062 <!-- START HEADER --> 1063 1064 1065 1066
1067<script type="application/javascript"> 1068 1069 window.doClosePopUp = function () { 1070 document.querySelectorAll('.dropdown-menu.show').forEach(function (option) { 1071 option.classList.remove('show'); 1072 }); 1073 document.querySelectorAll('.dropdown-menu.hide').forEach(function (option) { 1074 option.classList.remove('hide'); 1075 }); 1076 } 1077 1078 window.doShowQuickPopup = function (id, isFocus) { 1079 if (isFocus == true) 1080 m_handlerLayout.doGetQuickFilter(); 1081 else 1082 setTimeout(function () { 1083 m_handlerLayout.m_showQuickPopUp(false); 1084 }, 250) 1085 } 1086 1087 window.doJSClickSearch = function (){ 1088 var searchSection = document.querySelector('#UI_searchSection'); 1089 if(searchSection.classList.contains('show')) 1090 searchSection.classList.remove('show'); 1091 else 1092 searchSection.classList.add('show'); 1093 1094 var searchIcon = document.querySelector('#UI_searchIcon'); 1095 if(searchIcon.classList.contains('ci-search')){ 1096 searchIcon.classList.remove('ci-search'); 1097 searchIcon.classList.add('ci-close'); 1098 } 1099 else{ 1100 searchIcon.classList.remove('ci-close'); 1101 searchIcon.classList.add('ci-search'); 1102 } 1103 } 1104 doLoadScript(function () { 1105 if (!ko.dataFor(document.getElementById('UI_headerSession'))) { 1106 ko.applyBindings(m_handlerSession, document.getElementById("UI_headerSession")); 1107 } 1108 1109 if (!ko.dataFor(document.getElementById('UI_LayoutHeader'))) { 1110 ko.applyBindings(m_handlerLayout, document.getElementById("UI_LayoutHeader")); 1111 ko.applyBindings(m_handlerLayout, document.getElementById("UI_preLoader")); 1112 } 1113 1114 var navBar = document.getElementById("UI_menuNavBar"); 1115 if (navBar) navBar.style.visibility = "visible"; 1116 var searchPopup = document.getElementById("UI_searchQuickPopup"); 1117 if (searchPopup) searchPopup.style.visibility = "visible"; 1118 var layoutHeader = document.getElementById("UI_LayoutHeader"); 1119 if (layoutHeader) layoutHeader.style.visibility = "visible"; 1120 // After applyBindings above, so every marked block already carries the inline display its 1121 // binding gave it and nothing flashes as the gate lifts. 1122 if (layoutHeader) layoutHeader.classList.remove("ko-pending"); 1123 1124 doJsDropdownSelect(); 1125 1126 }); 1127 1128</script>
1128 1129 1130 1131<header id="UI_LayoutHeader" class="bg-light shadow-sm fixHeightHeader ko-pending"> 1132 1133 <div id="UI_menuQuick" class="topbar topbar-dark bg-darker py-sm-1 py-md-0"> 1134 <div class="container"> 1135 <div class="topbar-text dropdown d-md-none"> 1136 <a class="topbar-link dropdown-toggle" href="#" data-bs-toggle="dropdown">Ø±ÙØ§Ø¨Ø· Ù ÙÙØ¯Ø©</a> 1137 <ul class="dropdown-menu"> 1138 <li> 1139 <a class="dropdown-item textAlignAuto" enable-href="false" href="/Support"><i class="ci-support text-muted me-2-Auto"></i>Ø§ØªØµÙ Ø¨ÙØ§</a> 1140 </li> 1141 <li> 1142 <a class="dropdown-item textAlignAuto" href="#" target="_blank" enable-href="true" data-bind="attr:{href:m_handlerSession.m_currentCompany._whatsappLink}" rel="noreferrer"> 1143 <i class="ci-whatsapp text-muted me-2-Auto"></i>ÙØ§ØªØ³ اب 1144 </a> 1145 </li> 1146 </ul> 1147 </div> 1148 <div class="topbar-text text-nowrap d-none d-md-inline-block"> 1149 <a class="topbar-link" enable-href="false" href="/Support"><i class="ci-support me-2-Auto"></i>Ø§ØªØµÙ Ø¨ÙØ§</a> 1150 <!-- ko if: !doCheckEmptyData(m_handlerSession.m_currentCompany._whatsappLink()) --> 1151 <a class="btn-social bs-light bs-whatsapp me-1-Auto mb-1" href="#" enable-href="true" data-bind="attr:{href:m_handlerSession.m_currentCompany._whatsappLink}" target="_blank" rel="noreferrer" aria-label="Share WhatsApp"> 1152 <i class="ci-whatsapp font-size-14"></i> 1153 </a> 1154 <!-- /ko --> 1155 </div> 1156 1157 <slotHeader class="bf-announceSlot"></slotHeader> 1158 1159 <div class="text-nowrap"> 1160 <div class="topbar-text dropdown disable-autohide"> 1161 <a class="topbar-link dropdown-toggle" href="#" data-bs-toggle="dropdown"> 1162 <span class="px-1" data-bind="text: doGetCulture()=='ar'? 'عربÙ':'English'"></span> 1163 <span class="px-1">/</span><span class="px-1" data-bind="text: m_handlerSession.m_currentCurrency._code"></span> 1164 </a> 1165 1166 <ul class="dropdown-menu dropdown-menu-end"> 1167 <!-- ko if: m_handlerSession.m_currentCompany._currences().length > 1 --> 1168 <li class="dropdown-item"> 1169 <select class="form-select form-select-sm" style=" padding: 5px;" data-bind="value: m_handlerSession.m_currentCurrency._code, options: m_handlerSession.m_currentCompany._currences, optionsText: '_code', optionsValue: '_code'"> 1170 </select> 1171 </li> 1172 <!-- /ko --> 1173 <!-- ko if: m_handlerSession.m_listCompany().length > 1 --> 1174 <li class="dropdown-item"> 1175 <div class="fs-sm fw-medium mb-1 w-100 textAlignAuto">Ø¨ÙØ¯</div> 1176 <select class="form-select" style=" padding: 5px;" data-bind="value: m_handlerSession.m_currentCompany._id, options: m_handlerSession.m_listCompany, optionsText: '_countryName', optionsValue: '_id'"> 1177 </select> 1178 </li> 1179 <!-- /ko --> 1180 <li> 1181 <button class="dropdown-item d-flex align-items-center font-size-10" onclick="m_handlerSession.doSetCulture('ar')"> 1182 <span class="langImage me-2-Auto" data-bind="style:{'background-position-x': doGetlangImage('ar')}" style="background-image: url(https://cdn.brandfull.com/Media/BrandFull/images.png?version=639260136446764345)"></span> 1183 <span>عربÙ</span> 1184 </button> 1185 </li> 1186 <li> 1187 <button class="dropdown-item d-flex align-items-center font-size-10" onclick="m_handlerSession.doSetCulture('en')">
1188 <span class="langImage me-2-Auto" data-bind="style:{'background-position-x': doGetlangImage('en')}" style="background-image: url(https://cdn.brandfull.com/Media/BrandFull/images.png?version=639260136446764345)"></span> 1189 <span>English</span> 1190 </button> 1191 </li> 1192 </ul> 1193 </div> 1194 </div> 1195 </div> 1196 </div> 1197 <div class="navbar-sticky bg-light pt-1"> 1198 <div class="navbar navbar-expand-lg navbar-light py-0"> 1199 <div class="container bf-headerRow"> 1200 <div id="UI_searchSection" class="input-group widthSearch mt-sm-2 collapse"> 1201 <div class="input-group d-lg-flex m-0 "> 1202 <input autocomplete="off" class="form-control focus-black m_search" type="text" data-bind="value: m_search" onfocusin="doShowQuickPopup('UI_searchQuickPopup', true)" onfocusout="doShowQuickPopup('UI_searchQuickPopup', false)" placeholder="Ø§ÙØ¨ØØ« Ø¹Ù Ø§ÙØ¹Ùا٠ة Ø§ÙØªØ¬Ø§Ø±ÙØ©" /> 1203 <div class="m_searchIcons position-absolute top-50 translate-middle-y text-muted"> 1204 <i class="ci-camera pointer" data-bind="click: window.doOpenCropper.bind($root, $root, GlobalSettingTranslateEnum.PathObjectPicture, m_currentPicture)"></i> 1205 <i class="ci-search pointer" data-bind="click: $root.doSearchByWord.bind($root)"></i> 1206 </div> 1207 </div> 1208 1209 1210 1211<div id="UI_searchQuickPopup" data-koPending class="quickPopUp border rounded-1 p-3 mt-md-n1 bg-white" data-bind="visible:m_showQuickPopUp()"> 1212 1213 <!-- ko if: m_listQuickFilterCategory().length != 0 --> 1214 <b class="font-size-10 fw-bolder mt-2 mb-1 text-accent">ÙØ¦Ø§Øª Ù ÙØ¶ÙØ© ÙØ¯ÙÙÙ </b> 1215 <div class="d-flex flex-wrap align-content-around" data-bind="foreach: m_listQuickFilterCategory"> 1216 <a class=" border rounded me-1 mb-1" href="#" enable-href="false" data-bind="click: doLoadMenuLink.bind($root, doGetLinkQuickFilter($data._value())) , attr:{href: doGetLinkQuickFilter($data._value()) }"> 1217 <div class="btn btn-sm p-1 font-size-10" data-bind=" text: $data._name()"> 1218 </div> 1219 </a> 1220 </div> 1221 <!-- /ko --> 1222 <!-- ko if: m_listQuickFilterColor().length != 0 --> 1223 <b class="font-size-10 fw-bolder mt-3 mb-1 text-accent ">اÙÙÙ٠ذات شعبÙÙ</b> 1224 <div class="d-flex flex-wrap align-content-around" data-bind="foreach: m_listQuickFilterColor"> 1225 <a class=" border rounded me-1 mb-1" href="#" enable-href="false" data-bind="click: m_handlerLayout.doSetSearch.bind($root, $data._name()), attr:{href: doGetLinkQuickFilter($data._name()) }"> 1226 <div class="btn btn-sm p-1 font-size-10" data-bind=" text: $data._name()"> 1227 </div> 1228 </a> 1229 </div> 1230 <!-- /ko --> 1231 <!-- ko if: m_listQuickFilterTag().length != 0 --> 1232 <b class="font-size-10 fw-bolder mt-3 mb-1 text-accent">اÙÙ Ø§Ø±ÙØ§Øª Ø§ÙØ£Ùثر Ø´Ø¹Ø¨ÙØ©</b> 1233 <div class="d-flex flex-wrap align-content-around" data-bind="foreach: m_listQuickFilterTag"> 1234 <a class=" border rounded me-1 mb-1" href="#" enable-href="false" data-bind="click: m_handlerLayout.doSetSearch.bind($root, $data._name()), attr:{href: doGetLinkQuickFilter($data._name()) }"> 1235 <div class="btn btn-sm p-1 font-size-10" data-bind=" text: $data._name()"> 1236 </div> 1237 </a> 1238 </div> 1239 <!-- /ko --> 1240 1241</div> 1242 1243 </div> 1244 <div class="bf-headerRow-lead"> 1245 <a class="navbar-tool d-lg-none" href="/#UI_menuSection" aria-label="menu" name="menu" onclick="doClosePo
1245pUp()" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="UI_menuSection"> 1246 <span class="navbar-tool-icon-box"><i class="navbar-toggler-icon mt-1"></i></span> 1247 </a> 1248 </div> 1249 <div class="bf-headerRow-brand"> 1250 <a class="navbar-brand textAlignAuto" href="https://brandfull.com" enable-href="true"> 1251 <img class="headerBrandLogo" style="--logo-width: 125px; --logo-height: 41px;" fetchpriority="high" decoding="async" src="https://cdn.brandfull.com/Media/BrandFull/headerDesktopLogo_ar.png?format=webp&size=Thumb&version=639260136446764345" width="905" height="297" alt="AltLogo" title="Ø§ÙØ¹ÙÙØ§ÙØ§ÙØ´Ø¹Ø§Ø±" /> 1252 </a> 1253 </div> 1254 <!-- ko stopBinding: true --> 1255 <div id="UI_headerSession" class="navbar-toolbar d-flex flex-shrink-0 align-items-center bf-headerRow-trail"> 1256 1257 <!-- ko if: doCheckUUID(m_currentUser._id()) --> 1258 <a name="Favorites" aria-label="Favorites" class="navbar-tool-icon-box dropdown-toggle flipAuto d-lg-block d-md-none d-sm-none" enable-href="false" href="/Account/Favorites"> 1259 <i class="navbar-tool-icon ci-heart" style="width: 45px;"></i> 1260 </a> 1261 <div class="navbar-tool dropdown pointer d-lg-flex d-md-none d-sm-none" data-bind="visible: doCheckUUID(m_currentUser._id())" onmouseenter="doPrepareAdvertisement()"> 1262 <span class="navbar-tool-icon-box dropdown-toggle flipAuto" onclick="doOpenAdvertisement()"> 1263 <span class="navbar-tool-label flipAuto" data-bind="text: m_countAdvertisement() > 99 ? '99+' : m_countAdvertisement()"></span> 1264 <i class="navbar-tool-icon ci-bell" style="width: 45px;"></i> 1265 </span> 1266 <div id="UI_menuWebAdvertisement" class="dropdown-menu dropdown-menu-end textAlignAuto"> 1267 <div class="widget widget-cart px-3 pt-2 pb-0"> 1268 <div class="d-flex align-items-center justify-content-between"> 1269 <!-- ko if: !m_handlerLayout.m_isViewMobile() --> 1270 <div class="col-md-10"> 1271 <!-- ko if: m_enableNotifGrant() --> 1272 <button id="UI_notifGrant" class="btn d-flex align-content-between align-items-center font-size-10 p-1 " onclick="doGetPermissionNotification()"> 1273 <i class="ci-settings me-2-Auto font-size-14 "></i> 1274 <span class="form-check-label elide text-black fw-bolder heartbeat" for="UI_agreeWebPush"> 1275 ابÙÙ٠عÙÙ Ø§Ø·ÙØ§Ø¹ 1276 </span> 1277 </button> 1278 <!-- /ko --> 1279 <!-- ko if: m_enableNotifDenied() --> 1280 <div id="UI_notifDenied" class="d-flex align-content-between align-items-center font-size-10 p-1 "> 1281 <i class="ci-announcement me-2-Auto font-size-14 fw-bolder"></i> 1282 <span class="form-check-label elide text-danger fw-bolder heartbeat"> 1283 Ø§ÙØ¥Ø´Ø¹Ø§Ø±Ø§Øª Ù ØØ¬Ùبة. شغÙÙØ§ Ù٠إعدادات اÙÙ ØªØµÙØ ÙØªØØµÙ عÙÙ ØªÙØ¨ÙÙØ§Øª. 1284 </span> 1285 </div> 1286 <!-- /ko --> 1287 1288 </div> 1289 <!-- /ko --> 1290 </div> 1291 1292 <div id="UI_notificationList" data-simplebar data-simplebar-auto-hide="false" style="overflow-x: hidden;max-height: 21rem;" data-bind="visible: m_listAdvertisement().length!=0, foreach: { data: m_showAdvertisement() ? m_listAdvertisement() : [] }"> 1293 <div class="border-bottom py-1 me-3-Auto d-flex justify-content-between border-danger" style=" border-bottom-style: dotted !important;" data-bs-dismiss=""> 1294 <label class="form-text elide w-75 pointer" data-bind="click: $root.doSetTaged.bind($root, $data, true), text:$data._subject()"></label> 1295 <b class="form-check-label textAlignReverse font-size-10 d-inline-block mb-n2 fw-light" data-bind="click: $root.doSetTaged.bind($root, $data, true), text: doCalcDateDifference(doCastFromUTC($data._dateCreate()))"></b> 1296 </div> 1297</div> 1298 1299 </div> 1300 </div> 1301 </div> 1302 1303 1304 <!-- /ko --> 1305 <div id="UI_userSession" class="navbar-tool dropdown pointer d-lg-flex d-md-none d-sm-none">
1306 <span class="navbar-tool-icon-box " onclick="doOpenProfile()"> 1307 <i class="navbar-tool-icon ci-user "></i> 1308 </span> 1309 1310 <span class=" d-none d-lg-flex" style="padding-left:unset; max-width: 75px;" href="#"> 1311 <!-- ko if: doCheckUUID(m_currentUser._id()) --> 1312 <small class="elide text-black" data-bind="text: m_currentUser._name()"></small> 1313 <!-- /ko --> 1314 <!-- ko if: !doCheckUUID(m_currentUser._id()) --> 1315 <small class="elide text-black">ØØ³Ø§Ø¨</small> 1316 <!-- /ko --> 1317 </span> 1318 <!-- Session dropdown--> 1319 <!-- ko if: doCheckUUID(m_currentUser._id()) --> 1320 <div class="dropdown-menu dropdown-menu-end"> 1321 <div class="widget widget-cart px-3 pt-2 pb-3 textAlignAuto"> 1322 <!-- ko if: doCheckUUID(m_currentUser._id()) --> 1323 <div class="fs-sm fw-medium mb-1">ØØ³Ø§Ø¨</div> 1324 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Profile"> 1325 <i class="ci-user opacity-60 me-2-Auto"></i>اÙÙ ÙÙ Ø§ÙØ´Ø®ØµÙ 1326 </a> 1327 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Invoices"> 1328 <i class="ci-basket opacity-60 me-2-Auto"></i>اÙÙÙØ§ØªÙر 1329 </a> 1330 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Supports"> 1331 <i class="ci-help opacity-60 me-2-Auto"></i>ØªØ°Ø§ÙØ± 1332 </a> 1333 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Messages"> 1334 <i class="ci-message opacity-60 me-2-Auto"></i>رسائ٠1335 </a> 1336 1337 <div class="dropdown-divider"></div> 1338 <a class="dropdown-item d-flex align-items-center py-1" href="#" enable-href="false" data-bind="click: $root.doLogOut.bind($root, '/Account/LogOff?Value=https%3A%2F%2Fbrandfull.com%2FAccount%2FFavorites')"> 1339 <i class="ci-sign-out opacity-60 me-2-Auto"></i>تسجÙÙ Ø§ÙØ®Ø±Ùج 1340 </a> 1341 <!-- /ko --> 1342 </div> 1343 </div> 1344 <!-- /ko --> 1345 </div> 1346 1347 <a href="#" aria-label="Ø§ÙØ¨ØØ«" name="Search" class="navbar-tool-icon-box dropdown-toggle flipAuto" enable-href="false" onclick="doJSClickSearch()"> 1348 <i id="UI_searchIcon" class="navbar-tool-icon ci-search animate-target" style="width: 45px;"></i> 1349 </a> 1350 <div id="UI_shopNav" class="navbar-tool pointer" onclick="m_handlerSession.doOpenCartDrawer();"> 1351 <span class="navbar-tool-icon-box flipAuto"> 1352 <span class="navbar-tool-label flipAuto" data-bind="text: doGetCartCount()"></span> 1353 <i class="navbar-tool-icon bold ci-card-bag"></i> 1354 </span> 1355 <span class="d-flex flex-column d-none d-md-flex ps-2-Auto"> 1356 <small class="font-size-10 text-black">Ø³ÙØ© Ø§ÙØªØ³ÙÙ</small> 1357 <!-- ko if: m_currentCart._listCartDetailModel().length!=0 --> 1358 <span class="text-accent fs-base font-size-12" data-bind="html: $root.doCalcPriceDynamic(m_currentCart._total(), true)"></span> 1359 <!-- /ko --> 1360 </span> 1361 </div> 1362 1363 </div> 1364 <!-- /ko --> 1365 </div> 1366 <!-- Search--> 1367 </div> 1368 1369 1370 <div id="UI_menuNavBar" class="navbar navbar-expand-lg navbar-light navbar-stuck-menu mt-n2 pt-0 pb-2" style="visibility: hidden; margin-top: auto !important;"> 1371 <div class="container "> 1372 <div id="UI_menuSection" class="navbar-collapse collapse" data-bind="class: m_listCategoryMenuDepartmentHeader().length ==0 ? 'justify-content-around':''"> 1373 1374<style> 1375 1376 /* The sprite URL is per-request (CDN base + m_version), so it cannot live in the bundled 1377 CSS. It is emitted once here and read by .categoryMerge in StyleCartzilla-Menu.css. 1378 It used to be a full inline `background: url(...)` on EVERY category node -- in this file 1379 and, worse, inside Template_ItemDeskMenu / Template_ItemMobileMenu, which recurse, so the 1380 whole CDN path was re-emitted into the live DOM once per category at every depth. */ 1381 :root { 1382 --category-sprite: url('https://cdn.brandfull.com/Content/category/Merge.png?v=639260136446764345'); 1383 } 1384 1385 .quickPopUp { 1386 visibility: hidden; 1387 z-index: +100; 1388 position: absolute; 1389 top: 47px; 1390 } 1391 1392 [lang="ar"] .quickPopUp { 1393 right: 1px; 1394 } 1395 1396 [lang="en"] .quickPopUp { 1397 left: 1px; 1398 } 1399 1400 1401 @media screen and (max-width:767px) { 1402 .quickPopUp { 1403 z-index: +1; 1404 position: unset; 1405 top: 81px; 1406 width: 100%; 1407 border: hidden !important; 1408 } 1409 } 1410</style> 1411
1412<script id="Template_ItemDeskMenu" type="text/html"> 1413 1414 1415 <ul class="dropdown-menu " data-bind="foreach: $data._list, css:{'d-block fixRtl': $data.mode=='block' }"> 1416 <li class="" data-bind="class: $data._list() != 0 ? 'dropdown':''"> 1417 <a class="dropdown-item d-flex" href="#" enable-href="false" data-bind=" 1418 class: $data._list() != 0 ? 'dropdown-toggle':'', 1419 attr:{href: doGetLinkCategory($data) }"> 1420 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) --> 1421 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1422 </span> 1423 <!-- /ko --> 1424 <span class="categoryColor menuSpan" data-bind="text: $data._name, attr:{'data-code': $data._code}, style:{'--data-categoryColor': $data._colorDesktopHex()}"></span> 1425 </a> 1426 <!--ko if : $data._list() != 0 --> 1427 <!-- ko run: $data.mode='' --><!-- /ko --> 1428 <!-- ko template: { name: 'Template_ItemDeskMenu' , data:$data} --><!-- /ko --> 1429 <!-- /ko --> 1430 </li> 1431 </ul> 1432 1433</script>
vendor: 2 bytes, line 1433
1433
1434<script id="Template_ItemDeskMegaMenu" type="text/html"> 1435 1436 <ul class="dropdown-menu " data-bind="foreach: $data._list"> 1437 <li class="dropdown mega-dropdown"> 1438 <a class="dropdown-item dropdown-toggle d-flex" href="#" enable-href="false" data-bind="class: $data._list() != 0 ? 'dropdown-toggle':'', attr:{href: !doCheckEmptyData($data._link())? $data._link() : '/Shop'+'/'+$data._code() }" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="true"> 1439 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) --> 1440 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1441 </span> 1442 <!-- /ko --> 1443 <span class="categoryColor menuSpan " data-bind="text: $data._name, attr:{'data-code': $data._code}, style:{'--data-categoryColor': $data._colorDesktopHex()}"></span> 1444 </a> 1445 </li> 1446 </ul> 1447 1448 1449</script>
vendor: 2 bytes, line 1449
1449
1450<script id="Template_ItemMobileMenu" type="text/html"> 1451 1452 <ul class="widget-list mt-1" data-bind="attr:{'id': 'UI_'+$data._id()}, css:{'collapse collapseShow mx-3': $data.mode=='block'}, foreach: $data._list"> 1453 <li class="widget-list-item"> 1454 <a class="dropdown-item d-flex" href="#" enable-href="false" data-bind="attr:{'aria-controls': 'UI_'+$data._id(), 'data-bs-target':'#UI_'+$data._id(), href: doGetLinkCategory($data) }"> 1455 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) --> 1456 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1457 </span> 1458 <!-- /ko --> 1459 <span class="categoryColor font-size-14" data-bind="class: ($data._list() != 0 && $parent.mode=='block') ? 'fw-medium':'fw-light', text: $data._name, attr:{'data-code': $data._code}, click: doLoadMenu.bind($root, $data, 'Shop'), style:{'--data-categoryColor': $data._colorMobileHex()}"></span> 1460 </a> 1461 <!--ko if : $data._list() != 0 --> 1462 <!-- ko template: { name: 'Template_ItemMobileMenu' , data:$data} --><!-- /ko --> 1463 <!-- /ko --> 1464 </li> 1465 </ul> 1466 1467</script>
1467 1468 1469 1470 1471<!-- ko ifnot: m_isMenuMobile() --> 1472<!-- ko if: $root.m_listCategoryMenuDepartmentHeader().length!=0 --> 1473<ul class="navbar-nav d-none d-lg-flex navbar-mega-nav pe-lg-2-Auto me-lg-2-Auto" style="padding-right:unset !important"> 1474 <li class="nav-item dropdown"> 1475 <a class="nav-link dropdown-toggle ps-lg-0-Auto " href="#" data-bs-toggle="dropdown" data-bs-auto-close="outside"> 1476 <i class="ci-menu align-middle mt-n1 me-2-Auto"></i> 1477 Ø§ÙØ§Ø¯Ø§Ø±Ø§Øª 1478 </a> 1479 <ul class="dropdown-menu " data-bind="foreach: $root.m_listCategoryMenuDepartmentHeader"> 1480 <li class="dropdown mega-dropdown"> 1481 <a class="dropdown-item dropdown-toggle d-flex" href="#" enable-href="false" data-bind="class: $data._list() != 0 ? 'dropdown-toggle':'', attr:{href: doGetLinkCategory($data) }" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="true"> 1482 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) --> 1483 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1484 </span> 1485 <!-- /ko --> 1486 <span class="categoryColor menuSpan" data-bind="text: $data._name, attr:{'data-code': $data._code}, click: doLoadMenu.bind($root, $data, 'Shop'), style:{'--data-categoryColor': $data._colorDesktopHex()}"></span> 1487 </a> 1488 <div class="dropdown-menu p-0 megaMenuRtl" data-bind="style: {'min-width': doCheckEmptyData($data._bannerName()) ? '0rem':'12rem'}"> 1489 <div class="d-flex flex-wrap flex-sm-nowrap p-2"> 1490 <div style="max-width: 12rem;" data-bind="class: doCheckEmptyData($data._bannerName()) ? '':'mega-dropdown-column'"> 1491 <!--ko if : $data._list() != 0 --> 1492 <!-- ko run: $data.mode='block' --><!-- /ko --> 1493 <!-- ko template: { name: 'Template_ItemDeskMenu' , data:$data} --><!-- /ko --> 1494 <!-- /ko --> 1495 </div> 1496 <!--ko if : !doCheckEmptyData($data._bannerName()) --> 1497 <div class="mega-dropdown-column d-none d-lg-block text-center"> 1498 <img width="100%" data-bind="attr:{ src: GlobalSettingTranslateEnum.PathCategoryPicture + $data._bannerName(), 'alt': $data._code()}" alt="Menu"> 1499 </div> 1500 <!-- /ko --> 1501 </div> 1502 </div> 1503 </li> 1504 </ul> 1505 </li> 1506</ul> 1507<!-- /ko --> 1508<!-- Primary menu--> 1509<ul class="navbar-nav d-none d-lg-flex" data-bind="css:{'hide': m_listCategoryMenuHeader().length==0}, foreach: m_listCategoryMenuHeader"> 1510 <li class="nav-item dropdown"> 1511 <a class="nav-link dropdown-toggle" enable-href="false" href="#" data-bs-auto-close="outside" data-bind="attr:{href: doGetLinkCategory($data)}"> 1512 <span class="categoryColor bolder" data-bind="text: $data._name, attr:{'data-code': $data._code}, style:{'--data-categoryColor': $data._colorDesktopHex()}"></span> 1513 </a> 1514 <!-- ko if: $data._list().length!=0 --> 1515 <!-- ko run: $data.mode='' --><!-- /ko --> 1516 <!-- ko template: { name: 'Template_ItemDeskMenu' , data:$data} --><!-- /ko --> 1517 <!-- /ko --> 1518 </li> 1519</ul> 1520 1521<!-- Tag menu --> 1522<ul class="navbar-nav d-none d-lg-flex ms-auto align-items-center" data-bind="css:{'hide': m_listCategoryMenuTag().length==0}, foreach: m_listCategoryMenuTag"> 1523 <li class="nav-item me-2-Auto"> 1524 <a class="btn btn-sm rounded-pill border px-3 categoryColor" enable-href="false" href="#" data-bind=" 1525 attr:{href: doGetLinkCategory($data), 'data-code': $data._code}, 1526 text: $data._name, 1527 style:{'--data-categoryColor': $data._colorDesktopHex()}"></a> 1528 </li> 1529</ul> 1530<!-- /ko --> 1531 1532<!-- ko if: m_isMenuMobile() --> 1533<aside class="w-100 zindex-lg-5 pt-lg-5 d-lg-none" aria-modal="true" role="dialog"> 1534 <div class="pt-2 d-none d-lg-block"></div> 1535 1536 <!--ko if : m_listCategoryMenuDepartmentHeader().length!=0--> 1537 <ul class="nav nav-tabs nav-justified mt-4 mt-lg-5 mb-0" role="tablist" style="min-height: 3rem;"> 1538 <li class="nav-item" role="presentation"> 1539 <a class="nav-link fw-medium" href="#UI_departments" data-bs-toggle="tab" role="tab" aria-selected="false" tabindex="-1"> 1540 Ø§ÙØ§Ø¯Ø§Ø±Ø§Øª 1541 </a> 1542 </li> 1543 <li class="nav-item" role="presentation"> 1544 <a class="nav-link fw-medium active" href="#UI_headers" data-bs-toggle="tab" role="tab" aria-selected="true"> 1545 ÙØ§Ø¦Ù Ø© 1546 </a> 1547 </li> 1548 </ul> 1549 <!-- /ko --> 1550 1551 <div class="offcanvas-body px-0 pt-3" data-simplebar="init" data-simplebar-auto-hide="false" style="height: calc( 100% - 35px);"> 1552 <div class="tab-content"> 1553 1554 <!--ko if : m_listCategoryMenuDepartmentHeader().length!=0--> 1555 <div class="sidebar-nav tab-pane fade" id="UI_departments" role="tabpanel"> 1556 <div class="widget widget-categories accordion " id="shop-categories" data-bind="foreach: m_listCategoryMenuDepartmentHeader"> 1557 <div class="accordion-item border-bottom accordion-header pe-2-Auto"> 1558 <button class="accordion-button collapsed fw-bold d-flex align-items-center" type="button" data-bs-toggle="collapse" data-bind="attr:{'aria-controls': 'UI_'+$data._id(), 'data-bs-target':'#UI_'+$data._id()}" aria-expanded="false"> 1559 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) -->
1560 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1561 </span> 1562 <!-- /ko --> 1563 <span class="categoryColor menuSpan " data-bind="text: $data._name, attr:{'data-code': $data._code}, click: doLoadMenu.bind($root, $data, 'Shop'), style:{'--data-categoryColor': $data._colorMobileHex()}"></span> 1564 1565 </button> 1566 <!-- ko run: $data.mode='block' --><!-- /ko --> 1567 <!-- ko template: { name: 'Template_ItemMobileMenu' , data:$data} --><!-- /ko --> 1568 </div> 1569 </div> 1570 </div> 1571 <!-- /ko --> 1572 1573 <div class="sidebar-nav tab-pane fade active show" id="UI_headers" role="tabpanel"> 1574 <div class="widget widget-categories accordion" data-bind="css:{'hide': m_listCategoryMenuHeader().length==0}, foreach: m_listCategoryMenuHeader"> 1575 <div class="accordion-item accordion-header"> 1576 <button class="categoryBgColor accordion-button collapsed d-flex align-items-center px-1 py-3" style="padding-top: .75rem; padding-bottom: .75rem;" type="button" data-bs-toggle="collapse" data-bind="css:{'hideAfter': $data._list().length==0}, attr:{'aria-controls': 'UI_'+$data._id(), 'data-bs-target':'#UI_'+$data._id()}, style:{'--data-categoryBgColor': $data._colorBackgroundHex()}" aria-expanded="false"> 1577 <!-- ko ifnot: doCheckEmptyData($data._pictureName()) --> 1578 <span class="categoryMerge" data-bind="style:{'background-position-x': $data._picturePosition()+'px', 'alt': $data._code()}"> 1579 </span> 1580 <!-- /ko --> 1581 <span onclick="" class="categoryColor font-size-18 menuSpan" data-bind="text: $data._name, attr:{'data-code': $data._code}, click: doLoadMenu.bind($root, $data, 'Shop'), style:{'--data-categoryColor': $data._colorMobileHex()}"></span> 1582 </button> 1583 1584 <!--ko if : $data._list().length!=0 --> 1585 <!-- ko run: $data.mode='block' --><!-- /ko --> 1586 <!-- ko template: { name: 'Template_ItemMobileMenu' , data:$data} --><!-- /ko --> 1587 <!-- /ko --> 1588 1589 </div> 1590 </div> 1591 </div> 1592 1593 </div> 1594 </div> 1595</aside> 1596<!-- /ko --> 1597 1598 1599 </div> 1600 </div> 1601 </div> 1602 1603 </div> 1604</header> 1605 1606 1607 <!-- END HEADER --> 1608 <div style="min-height: 60vh;"> 1609 <div id="UI_AjaxLoader" class="page-wrapper" style="display: none;"> 1610 <div id="UI_LayoutBody" class="main_content"> 1611 1612 1613 1614 1615
1616<script type="application/javascript"> 1617 1618 var m_handlerPageListFavorite; 1619 1620 doLoadScript(function () { 1621 m_handlerPageListFavorite = new Handler_PageListFavorite(); 1622 doSetHandlerPageScroller(m_handlerPageListFavorite); 1623 m_handlerPageListFavorite.doInitData({"_page":"1"}); 1624 1625 if (!ko.dataFor(document.getElementById('UI_LayoutBody'))) 1626 ko.applyBindings(m_handlerPageListFavorite, document.getElementById('UI_LayoutBody')); 1627 1628 1629 }, "https://cdn.brandfull.com/Handlers/Pages/Handler_PageListFavorite.js"); 1630</script>
1630 1631 1632<style> 1633 1634 @media only screen and (max-width:769px) { 1635 .table td, .table th { 1636 border-top: none; 1637 } 1638 1639 .wishlist_table .table td:nth-last-child(5n+4) { 1640 border-bottom: 1px solid black !important; 1641 } 1642 1643 .wishlist_table .table td:nth-child(5n+5) { 1644 border-bottom: none !important; 1645 } 1646 } 1647</style> 1648<main class="page-wrapper"> 1649 <div class="page-title-overlap bg-BreadCrumb pt-4"> 1650 <div class="container breadcrumbContainer"> 1651 <div class="breadcrumbLink mb-3 "> 1652 <nav aria-label="breadcrumb"> 1653 <nav aria-label="breadcrumb"> 1654 <ol class="breadcrumb flex-lg-nowrap justify-content-start"> 1655 <li class="breadcrumb-item"><a class="text-nowrap" href="/" enable-href="false"><i class="ci-home"></i>Ø§ÙØµÙØØ© Ø§ÙØ±Ø¦ÙØ³ÙØ©</a></li> 1656 <li class="breadcrumb-item text-nowrap"> 1657 <a href="#">ÙØ§Ø¦Ù Ø© ØµÙØØ© اÙÙ ÙØ¶ÙØ©</a> 1658 </li> 1659 </ol> 1660 </nav> 1661 </nav> 1662 </div> 1663 <div class="breadcrumbTitle pe-lg-4-Auto "> 1664 <h1 class="h4 text-black mb-0">ÙØ§Ø¦Ù Ø© ØµÙØØ© اÙÙ ÙØ¶ÙØ©</h1> 1665 </div> 1666 </div> 1667 </div> 1668 <div class="container pb-5 mb-2 mb-md-4"> 1669 <div class="row"> 1670 <!-- Content --> 1671 <section class="col-12"> 1672 <!-- Toolbar--> 1673 <div class="d-none d-lg-flex justify-content-between align-items-center pt-lg-3 pb-4 pb-lg-5 mb-lg-3"> 1674 <div class="d-flex flex-wrap"> 1675 <div class="d-flex align-items-center flex-nowrap me-3-Auto me-sm-4-Auto pb-3"> 1676 <span class="fs-sm text-black opacity-75 text-nowrap ms-2-Auto d-block" data-bind="html:'عرض: <b>' + m_paging.m_totalCount() + '</b> Ø¨ÙØ¯'"> 1677 </span> 1678 </div> 1679 </div> 1680 <div class="d-flex pb-3"> 1681 </div> 1682 <div class="d-flex pb-3"> 1683 </div> 1684 </div> 1685 <div class="row mx-n2 mt-2" id="UI_listObject"> 1686 <!-- ko if: m_listObject().length!=0 --> 1687 <!--ko foreach: m_listObject --> 1688 <!-- ko run: $data.mode='grid' --><!-- /ko --> 1689 <div class="col-lg-3 col-md-3 col-6 px-2 mb-4"> 1690 <!-- ko template: { name: 'Template_ItemComponent_ObjectDefault' , data:$data} --><!-- /ko --> 1691 </div> 1692 <!-- /ko --> 1693 <!-- /ko --> 1694 1695<nav class="pt-2 justify-content-center" aria-label="Page navigation" data-bind="class: m_paging.m_pageCount() > 1? 'd-flex':'d-none'"> 1696 <!-- ko if: $root.m_paging.m_previousPageActive() --> 1697 <ul class="pagination"> 1698 <li class="page-item"> 1699 <a aria-label="Ø§ÙØ³Ø§Ø¨Ù" class="page-link" href="#" data-bind="click: $root.doSeekListData.bind($root,$root.m_paging.m_currentPage() - 1)"> 1700 <i class="me-2-Auto" data-bind="class: doGetCulture() =='en'? 'ci-arrow-left':'ci-arrow-right' "></i> 1701 </a> 1702 </li> 1703 </ul> 1704 <!-- /ko --> 1705 <ul class="pagination"> 1706 <!-- ko foreach: $root.m_paging.m_getPages() --> 1707 <li class="page-item" data-bind="css: { active: $root.m_paging.m_currentPageActive($data) }"> 1708 <a class="page-link " data-bind="text:$data,click: $root.doSeekListData.bind($root,$data) "></a> 1709 </li> 1710 <!-- /ko --> 1711 </ul> 1712 <!-- ko if: $root.m_paging.m_nextPageActive() --> 1713 <ul class="pagination"> 1714 <li class="page-item"> 1715 <a class="page-link" data-bind="click: $root.doSeekListData.bind($root,$root.m_paging.m_currentPage() +1)" href="#" aria-label="Next"> 1716 <i class="ms-2-Auto" data-bind="class: doGetCulture() =='en'? 'ci-arrow-right':'ci-arrow-left' "></i> 1717 </a> 1718 </li> 1719 </ul> 1720 <!-- /ko --> 1721</nav> 1722 </div> 1723 1724 <!-- ko if: m_listObject().length==0 --> 1725 <div class="align-items-center justify-content-center" style="text-align: center; margin: auto;"> 1726 <span class="dataImage" style="margin:25px; background-position-y: -420px; height: 200px; width: 200px;background-position-x: -1px; background-image: url(https://cdn.brandfull.com/Media/BrandFull/images.png?version=639260136446764345)"></span> 1727 <h6>ÙØ§ ØªÙØ¬Ø¯ Ø¨ÙØ§Ùات ÙÙ ÙØ°Ø§ اÙ٠جاÙ.</h6> 1728 <br /> 1729</div> 1730 1731 <!-- /ko --> 1732 </section> 1733 </div> 1734 </div> 1735</main> 1736 </div> 1737 </div> 1738 </div> 1739 <!-- START FOOTER --> 1740 1741<style> 1742 .codeInput { 1743 width: 32px; 1744 height: 32px; 1745 text-align: center; 1746 border: none; 1747 border-bottom: 1.5px solid #d2d2d2; 1748 margin: 0 10px; 1749 } 1750 1751 .codeInput:focus { 1752 border-bottom: 1.5px solid deepskyblue; 1753 outline: none; 1754 } 1755 1756 /* Shared content modal (#UI_slideModal): the body is Portal-authored HTML, so give the tags an 1757 admin actually types a sane default rather than leaving them at browser sizes. */ 1758 .slideModal-body { 1759 font-size: .9rem; 1760 line-height: 1.7; 1761 color: #374151; 1762 } 1763 1764 .slideModal-body ul, 1765 .slideModal-body ol { 1766 padding-inline-start: 18px; 1767 margin-bottom: 0; 1768 } 1769 1770 .slideModal-body p:last-child { 1771 margin-bottom: 0; 1772 } 1773</style> 1774 1775 1776
1777<!-- Sign in / sign up / forgot Password modal--> 1778<div id="UI_sessionModal" class="modal fade noPadding" tabindex="-1" role="dialog"> 1779 <div class="modal-dialog modal-dialog-centered" role="document"> 1780 <div class="modal-content"> 1781 <div class="modal-header bg-secondary"> 1782 <ul class="nav nav-tabs card-header-tabs" role="tablist"> 1783 <li class="nav-item"><a id="UI_signinTab" data-bind="click : doResetUserError" class="nav-link fw-medium active" href="#signin-tab" data-bs-toggle="tab" role="tab" aria-selected="true"><i class="ci-unlocked me-2-Auto mt-n1"></i>تسجÙÙ Ø§ÙØ¯Ø®ÙÙ</a></li> 1784 <li class="nav-item"><a id="UI_signupTab" data-bind="click : doResetUserError" class="nav-link fw-medium" href="#signup-tab" data-bs-toggle="tab" role="tab" aria-selected="false"><i class="ci-user me-2-Auto mt-n1"></i>Ø§ÙØªØ³Ø¬ÙÙ</a></li> 1785 </ul> 1786 <button class="btn-close adjustBtnClose" style="" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button> 1787 </div> 1788 <div class="modal-body tab-content py-4"> 1789 <div id="UI_socialAccount" class="py-2"> 1790 <h3 class="d-inline-block align-middle fs-base fw-medium mb-2">٠ع ØØ³Ø§Ø¨ اجت٠اعÙ</h3> 1791 <div class="row"> 1792 <div id="UI_buttonGoogle" class="col-md-6 my-1" style="height: 40px;"></div> 1793 <div id="appleid-signin" class="col-md-6 my-1" style="height: 40px;" data-color="black" data-border="true" data-type="sign in"></div> 1794 </div> 1795 </div> 1796 <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate id="signin-tab"> 1797 <div class="mb-3"> 1798 <label class="form-label" for="UI_emailModal">Ø§ÙØ¨Ø±Ùد Ø§ÙØ¥ÙÙØªØ±ÙÙÙ ÙØ§ÙÙØ§ØªÙ</label> 1799 <input autocomplete="username" id="UI_emailModal" data-bind="value : m_currentStructUser._email, css:{'is-invalid': !doCheckEmptyData(m_errorStructUser._email()) || !doCheckEmptyData(m_errorStructUser._phone())}" class="form-control" type="email" placeholder="[email protected]" required> 1800 <div data-bind="text: m_errorStructUser._email" class="invalid-feedback"></div> 1801 <div data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div> 1802 </div> 1803 <div class="mb-3"> 1804 <label class="form-label" for="UI_passwordModal">ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© بÙ</label> 1805 <div class="password-toggle"> 1806 <input data-bind="value : m_currentStructUser._password, css:{'is-invalid':!doCheckEmptyData(m_errorStructUser._password())}" class="form-control" type="password" id="UI_passwordModal" required autocomplete="current-password"> 1807 <label class="password-toggle-btn" aria-label="Show/hide password"> 1808 <input class="password-toggle-check" type="checkbox"><span class="password-toggle-indicator"></span> 1809 </label> 1810 </div> 1811 <div data-bind="style:{display:!doCheckEmptyData(m_errorStructUser._password())?'block':'none'} , text: m_errorStructUser._password" class="invalid-feedback"></div> 1812 </div> 1813 <div class="mb-3 d-flex flex-wrap justify-content-between"> 1814 <div class="mb-2" data-bind="class:'ar' == 'en'? 'form-check':'form-check-reverse'"> 1815 </div> 1816 <a class="fs-sm" href="#" onclick="doShowModal('UI_forgotModal');" data-bs-dismiss="modal" aria-label="Close">ÙÙ ÙØ³Ùت ÙÙÙ Ø© اÙÙ Ø±ÙØ±Ø</a> 1817 </div> 1818 <button data-bind="click : doSignUser" class="btn btn-primary btn-shadow d-block w-100" type="button">تسجÙÙ Ø§ÙØ¯Ø®ÙÙ</button> 1819 </form> 1820 1821 <form class="needs-validation tab-pane fade" autocomplete="off" novalidate id="signup-tab" novalidate> 1822 <p class="list-unstyled fs-md"> 1823 Ø£Ø¶Ù Ø¨Ø±ÙØ¯Ù Ø§ÙØ¥ÙÙØªØ±ÙÙÙ Ø£Ù ÙØ§ØªÙÙ Ø£Ø¯ÙØ§Ù Ø ÙØ³ÙØªÙ Ø¥Ø±Ø³Ø§Ù Ø±Ø³Ø§ÙØ© ÙÙØªØÙÙ. 1824 </p> 1825 <div class="mt-4 bg-white"> 1826 <div class="mb-3"> 1827 <div class="d-flex justify-content-between"> 1828 <div class="col-8"> 1829 <input autocomplete="tel" id="UI_quickPhoneInput" data-bind="value : m_currentStructUser._phone,valueUpdate: ['afterkeydown', 'input'], css:{'is-invalid': !doCheckEmptyData(m_errorStructUser._phone())}" class="form-control " type="tel" lang=ar dir=rtl placeholder="رÙ٠اÙÙØ§ØªÙ" required> 1830 1831 <!-- ko if: !doCheckEmptyData(m_errorStructUser._phone()) --> 1832 <div data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div> 1833 <!-- /ko --> 1834 </div> 1835 <div class="col-3"> 1836 <select class="form-select" id="UI_quickCountry" data-bind="css:{'is-invalid':!doCheckEmptyData(m_errorUser.m_errorCountryModel())}, options: m_listCountry, value: m_currentUser._countryModel._id,optionsText: '_code', optionsValue: '_id'"> 1837 </select> 1838 </div> 1839 </div> 1840 <div class="d-flex text-center my-4 align-items-center"> 1841 <hr class="w-25 mx-auto">
1842 <span class="h6">Ø£Ù</span> 1843 <hr class="w-25 mx-auto"> 1844 </div> 1845 <input autocomplete="email" data-bind="value : m_currentStructUser._email, css:{'is-invalid': !doCheckEmptyData(m_errorStructUser._email())}" class="form-control" type="email" placeholder="[email protected]" required> 1846 <!-- ko if: !doCheckEmptyData(m_errorStructUser._email()) --> 1847 <div id="UI_errorEmailModal" data-bind="text: m_errorStructUser._email" class="invalid-feedback"></div> 1848 <!-- /ko --> 1849 </div> 1850 <div class=" mb-3" data-bind="class:'ar' == 'en'? 'form-check':'form-check-reverse'"> 1851 <input class="form-check-input" type="checkbox" id="UI_agreePage" value="" data-bind="attr:{checked: m_isAgree()}, value: m_isAgree(),click: $root.doSetAgree.bind($root)"> 1852 <label class="form-check-label" for="UI_agreePage"> 1853 <span>Ø£ÙØ§Ù٠عÙÙ Ø§ÙØ´Ø±ÙØ· ÙØ§ÙØ³ÙØ§Ø³Ø©</span> 1854 </label> 1855 1856 <a href="/About/TermsandCondition" target="_blank" enable-href="true" class="readMore">Ø§ÙØ±Ø£</a> 1857 </div> 1858 <!-- ko if: m_isAgree() --> 1859 <button data-bind="click : $root.doForgetPassword.bind($root, true)" class="btn btn-primary w-100" type="button">Ø§Ø±Ø³Ù Ø§ÙØ±Ù ز</button> 1860 <!-- /ko --> 1861 1862 </div> 1863 </form> 1864 1865 1866 1867 </div> 1868 </div> 1869 </div> 1870</div> 1871 1872 1873<div id="UI_forgotModal" class="modal fade" tabindex="-1" role="dialog"> 1874 <div class="modal-dialog modal-dialog-centered" role="document"> 1875 <div class="modal-content"> 1876 <div class="modal-header bg-secondary"> 1877 <ul class="nav nav-tabs card-header-tabs" role="tablist"> 1878 <li class="nav-item"><a id="UI_signinTab" data-bind="click : doResetUserError" class="nav-link fw-medium active" data-bs-toggle="tab" role="tab" aria-selected="true"><i class="ci-help me-2-Auto mt-n1"></i>ÙØ³Ùت ÙÙÙ Ø© اÙÙ Ø±ÙØ±</a></li> 1879 </ul> 1880 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button> 1881 </div> 1882 <div class="modal-body tab-content py-4"> 1883 <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate> 1884 <p class="fs-md">Ù٠بتغÙÙØ± ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© ب٠ÙÙ Ø«ÙØ§Ø« Ø®Ø·ÙØ§Øª سÙÙØ©. ÙØ³Ø§Ø¹Ø¯ ÙØ°Ø§ ÙÙ Ø§ÙØÙØ§Ø¸ عÙ٠أ٠ا٠ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ¬Ø¯Ùدة.</p> 1885 <ol class="list-unstyled fs-md"> 1886 <li><span class="text-primary me-2-Auto">1.</span>Ø§Ù ÙØ£ عÙÙØ§Ù Ø¨Ø±ÙØ¯Ù Ø§ÙØ¥ÙÙØªØ±ÙÙÙ Ø£Ø¯ÙØ§Ù.</li> 1887 <li><span class="text-primary me-2-Auto">2.</span>Ø³ÙØ±Ø³Ù Ø¥ÙÙ٠ر٠زا Ù Ø¤ÙØªØ§ عبر Ø§ÙØ¨Ø±Ùد Ø§ÙØ¥ÙÙØªØ±ÙÙÙ.</li> 1888 <li><span class="text-primary me-2-Auto">3.</span>Ø§Ø³ØªØ®Ø¯Ù Ø§ÙØ±Ù ز ÙØªØºÙÙØ± ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© ب٠عÙÙ Ù ÙÙØ¹Ùا Ø§ÙØ¢Ù Ù.</li> 1889 </ol> 1890 <div class="py-2 mt-4"> 1891 <div class="mb-3"> 1892 <input autocomplete="email" id="UI_popuEmailInput" data-bind="value : m_currentStructUser._email, css:{'is-invalid': !doCheckEmptyData(m_errorStructUser._email()) || !doCheckEmptyData(m_errorStructUser._phone())}" class="form-control" type="email" placeholder="[email protected]" required> 1893 <!-- ko if: !doCheckEmptyData(m_errorStructUser._email()) --> 1894 <div data-bind="text: m_errorStructUser._email" class="invalid-feedback"></div> 1895 <!-- /ko --> 1896 <div class="d-flex text-center my-4 align-items-center"> 1897 <hr class="w-25 mx-auto">
1898 <span class="h6">Ø£Ù</span> 1899 <hr class="w-25 mx-auto"> 1900 </div> 1901 <div class="d-flex justify-content-between"> 1902 <div class="col-8"> 1903 <input autocomplete="tel" id="UI_popuPhoneInput" data-bind="value : m_currentStructUser._phone, css:{'is-invalid': !doCheckEmptyData(m_errorStructUser._phone()) || !doCheckEmptyData(m_errorStructUser._phone())}" class="form-control " type="number" placeholder="رÙ٠اÙÙØ§ØªÙ" required> 1904 1905 </div> 1906 <div class="col-3"> 1907 <select class="form-select" id="UI_popupCountry" data-bind="css:{'is-invalid':!doCheckEmptyData(m_errorUser.m_errorCountryModel())}, options: m_listCountry, value: m_currentUser._countryModel._id,optionsText: '_code', optionsValue: '_id'"> 1908 </select> 1909 </div> 1910 </div> 1911 <!-- ko if: !doCheckEmptyData(m_errorStructUser._phone()) --> 1912 <div data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div> 1913 <!-- /ko --> 1914 </div> 1915 <button data-bind="click : $root.doForgetPassword.bind($root, false)" class="btn btn-primary w-100" type="button" data-bs-dismiss="modal" aria-label="Close">Ø§Ø±Ø³Ù Ø§ÙØ±Ù ز</button> 1916 </div> 1917 </form> 1918 </div> 1919 </div> 1920 </div> 1921</div> 1922 1923 1924<div id="UI_validationModal" class="modal fade" tabindex="-1" role="dialog"> 1925 <div class="modal-dialog modal-dialog-centered" role="document"> 1926 <div class="modal-content"> 1927 <div class="modal-header bg-secondary"> 1928 <ul class="nav nav-tabs card-header-tabs" role="tablist"> 1929 <li class="nav-item"><a id="UI_validationTab" data-bind="click : doResetUserError" class="nav-link fw-medium active" data-bs-toggle="tab" role="tab" aria-selected="true"><i class="ci-key me-2-Auto mt-n1"></i>ÙÙÙ Ø© Ù Ø±ÙØ± Ø§ÙØªØÙÙ Ù Ù Ø§ÙØµØØ©</a></li> 1930 </ul> 1931 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button> 1932 </div> 1933 <div class="modal-body tab-content py-4"> 1934 <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate> 1935 <!-- ko if: !doCheckEmptyData(m_currentStructUser._email()) --> 1936 <p class="fs-md" data-bind="text: 'ÙØ±Ø¬Ù Ø§ÙØªØÙÙ Ù Ù Ø¨Ø±ÙØ¯Ù Ø§ÙØ¥ÙÙØªØ±ÙÙÙ' + ': (' + m_currentStructUser._email() + ')' "></p> 1937 <!-- /ko --> 1938 <!-- ko if: !doCheckEmptyData(m_currentStructUser._phone()) --> 1939 <p class="fs-md" data-bind="text: 'ÙØ±Ø¬Ù Ø§ÙØªØÙ٠٠٠رÙÙ ÙØ§ØªÙÙ' + ': (' + m_currentStructUser._phone() + ')' "></p> 1940 <!-- /ko --> 1941 <div class="mb-3"> 1942 <label class="form-label">Ø£Ø¯Ø®Ù Ø§ÙØ±Ù ز Ø§ÙØ®Ø§Øµ بÙ</label> 1943 <div class="form-control d-flex align-items-center justify-content-center" dir="ltr" id='UI_sessionCodeInputs' data-bind=" css:{'is-invalid': !m_isVerifyed()}"> 1944 <input class="codeInput" id="UI_sessionCode1" type="text" inputmode="numeric" maxlength="1" autocomplete="one-time-code" /> 1945 <input class="codeInput" id="UI_sessionCode2" type="text" inputmode="numeric" maxlength="1" /> 1946 <input class="codeInput" id="UI_sessionCode3" type="text" inputmode="numeric" maxlength="1" /> 1947 <input class="codeInput" id="UI_sessionCode4" type="text" inputmode="numeric" maxlength="1" /> 1948 </div> 1949 <!-- ko if: !doCheckEmptyData(m_errorStructUser._code()) --> 1950 <div id="UI_errorCodeModal" data-bind="text: m_errorStructUser._code" class="invalid-feedback"></div> 1951 <!-- /ko --> 1952 <!-- ko if: !doCheckEmptyData(m_errorStructUser._phone) --> 1953 <div id="UI_errorPhoneModal" data-bind="text: m_errorStructUser._phone" class="invalid-feedback"></div> 1954 <!-- /ko --> 1955 </div> 1956 <div class="text-center py-2 px-3" style=" display: flow-root;"> 1957 <button class="btn btn-sm btn-primary col-md-6" data-bind="click : $root.doSendCode.bind($root)" type="button">إرساÙ</button> 1958 </div> 1959 </form> 1960 </div> 1961 </div> 1962 </div> 1963</div> 1964 1965 1966<div id="UI_resetPasswordModal" class="modal fade" tabindex="-1" role="dialog"> 1967 <div class="modal-dialog modal-dialog-centered" role="document"> 1968 <div class="modal-content"> 1969 <div class="modal-header bg-secondary"> 1970 <ul class="nav nav-tabs card-header-tabs" role="tablist"> 1971 <li class="nav-item"><a id="UI_resetPasswordTab" data-bind="click : doResetUserError" class="nav-link fw-medium active" data-bs-toggle="tab" role="tab" aria-selected="true"><i class="ci-key me-2-Auto mt-n1"></i>إعادة تعÙÙÙ ÙÙÙ Ø© اÙÙ Ø±ÙØ±</a></li> 1972 </ul> 1973 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close" onclick="doRedirection()"></button> 1974 </div> 1975 <div class="modal-body tab-content py-4"> 1976 <form class="needs-validation tab-pane fade show active" autocomplete="off" novalidate> 1977 <p>ÙÙ ÙÙ٠تغÙÙØ± ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© Ø¨Ù ÙØ£Ø³Ø¨Ø§Ø¨ Ø£Ù ÙÙØ© أ٠إعادة تعÙÙÙÙØ§ إذا ÙØ³ÙØªÙØ§.</p> 1978 <!-- ko if: !doCheckEmptyData(m_errorStructUser._token()) --> 1979 <div id="UI_errorToken" data-bind="text: m_errorStructUser._token" class="invalid-feedback"></div> 1980 <!-- /ko --> 1981 <!-- ko if: m_isSuccess()--> 1982 <p>ØªÙ ØªØØ¯ÙØ« ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© بÙ</p> 1983 <!-- /ko --> 1984 <!-- ko if : !m_isSuccess() --> 1985 <input class="d-none" type="text" autocomplete="username" tabindex="-1" aria-hidden="true" data-bind="value: m_currentStructUser._email"> 1986 <div class="mb-3"> 1987 <label class="form-label" for="UI_resetPasswordH
1987ashModal">ÙÙÙ Ø© اÙÙ Ø±ÙØ± Ø§ÙØ®Ø§ØµØ© بÙ</label> 1988 <input class="form-control" type="password" data-bind="value : m_currentStructUser._password, css:{'is-invalid':!doCheckEmptyData(m_errorStructUser._password())}" id="UI_resetPasswordHashModal" required autocomplete="new-password"> 1989 <div id="UI_errorPasswordModal" data-bind="text: m_errorStructUser._password" class="invalid-feedback"></div> 1990 </div> 1991 <div class="mb-3"> 1992 <label class="form-label" for="UI_resetConfirmPasswordModal">تأÙÙØ¯ ÙÙÙ Ø© اÙÙ Ø±ÙØ±</label> 1993 <input data-bind="value : m_currentStructUser._confirmation, css:{'is-invalid':!doCheckEmptyData(m_errorStructUser._confirmation())}" id="UI_resetConfirmPasswordModal" class="form-control" type="password" required autocomplete="new-password"> 1994 <div id="UI_errorConfirmPasswordModal" data-bind="text: m_errorStructUser._confirmation" class="invalid-feedback"></div> 1995 </div> 1996 <!-- /ko --> 1997 <button data-bind="click: $root.doUpdatePassword.bind($root)" class="btn btn-primary btn-shadow d-block w-100" type="button">ØÙظ</button> 1998 </form> 1999 </div> 2000 </div> 2001 </div> 2002</div> 2003 2004 2005<div id="UI_successRegisterModalPopUp" class="modal fade" tabindex="-1"> 2006 <div class="modal-dialog modal-dialog-centered" role="document"> 2007 <div class="modal-content border-0 rounded-4 overflow-hidden shadow-lg"> 2008 <div class="modal-header border-0 pb-0 px-4 pt-4"> 2009 <h5 class="modal-title fw-bold text-primary mb-0">تسجÙÙ!</h5> 2010 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button> 2011 </div> 2012 <div class="modal-body text-center px-4 pt-3 pb-4"> 2013 <div class="mx-auto mb-3 d-inline-flex align-items-center justify-content-center rounded-circle" 2014 style="width:96px; height:96px; background: rgba(var(--cz-primary-rgb), .08);"> 2015 <div class="d-inline-flex align-items-center justify-content-center rounded-circle" 2016 style="width:68px; height:68px; background: rgba(var(--cz-primary-rgb), .16);"> 2017 <i class="ci-check" style="font-size: 32px; color: rgba(var(--cz-primary-rgb));"></i> 2018 </div> 2019 </div> 2020 <p class="fw-bold mb-0" style="font-size:1.05rem; color:#1f2937;">ت٠تأÙÙØ¯ Ø¨ÙØ§ÙاتÙ.</p> 2021 </div> 2022 </div> 2023 </div> 2024</div> 2025 2026<div id="UI_popUpNewsLetterSubmit" class="modal fade" tabindex="-1"> 2027 <div class="modal-dialog modal-dialog-centered" role="document"> 2028 <div class="modal-content border-0 rounded-4 overflow-hidden shadow-lg"> 2029 <div class="modal-header border-0 pb-0 px-4 pt-4"> 2030 <h5 class="modal-title fw-bold text-primary mb-0">Ø§ÙØ±Ø³Ø§ÙÙ Ø§ÙØ§Ø®Ø¨Ø§Ø±ÙÙ!</h5> 2031 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button> 2032 </div> 2033 <div class="modal-body text-center px-4 pt-3 pb-4"> 2034 <div class="mx-auto mb-3 d-inline-flex align-items-center justify-content-center rounded-circle" 2035 style="width:96px; height:96px; background: rgba(var(--cz-primary-rgb), .08);"> 2036 <div class="d-inline-flex align-items-center justify-content-center rounded-circle" 2037 style="width:68px; height:68px; background: rgba(var(--cz-primary-rgb), .16);"> 2038 <i class="ci-check" style="font-size: 32px; color: rgba(var(--cz-primary-rgb));"></i> 2039 </div> 2040 </div> 2041 <p class="fw-bold mb-0" style="font-size:1.05rem; color:#1f2937;">ت٠ØÙظ Ø¬ÙØ© Ø§ÙØ§ØªØµØ§Ù.</p> 2042 </div> 2043 </div> 2044 </div> 2045</div> 2046 2047 2048<div id="UI_slideModal" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true">
2049 <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable" role="document"> 2050 <div class="modal-content"> 2051 <div class="modal-header bg-secondary"> 2052 <ul class="nav nav-tabs card-header-tabs" role="tablist"> 2053 <li class="nav-item"><a class="nav-link fw-medium active" role="tab" aria-selected="true"><i class="ci-announcement me-2-Auto mt-n1"></i><span data-bind="text: m_currentSlideModal._title"></span></a></li> 2054 </ul> 2055 <button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button> 2056 </div> 2057 <div class="modal-body py-4"> 2058 <div class="slideModal-body textAlignAuto" data-bind="html: m_currentSlideModal._description"></div> 2059 2060 <!-- ko ifnot: doCheckEmptyData(m_currentSlideModal._link()) --> 2061 <a class="btn btn-primary d-block w-100 mt-3" href="#" enable-href="true" data-bind="attr:{href: m_currentSlideModal._link}"> 2062 <!-- ko if: doCheckEmptyData(m_currentSlideModal._button()) -->Ø£ÙØ«Ø±<!-- /ko --> 2063 <!-- ko ifnot: doCheckEmptyData(m_currentSlideModal._button()) --><span data-bind="text: m_currentSlideModal._button"></span><!-- /ko --> 2064 </a> 2065 <!-- /ko --> 2066 </div> 2067 </div> 2068 </div> 2069</div> 2070 2071 2072<!-- Cart Drawer Backdrop --> 2073<div id="UI_cartDrawerBackdrop" class="cart-drawer-backdrop" style="display:none" 2074 data-bind="visible: m_currentPopUpMessage._isVisible(), click: doCloseCartDrawer"></div> 2075 2076<!-- Cart Drawer --> 2077<div id="UI_cartDrawer" class="cart-drawer" 2078 data-bind="css: { 'cart-drawer-open': m_currentPopUpMessage._isVisible(), 'cart-drawer-short': m_drawerShortMode(), 'cart-drawer-alert-only': m_drawerShortMode() && m_currentCart._listCartDetailModel().length == 0 }"> 2079 2080 <!-- Drawer Header --> 2081 <!-- ko if: !(m_drawerShortMode() && m_currentCart._listCartDetailModel().length == 0) --> 2082 <div class="cart-drawer-header"> 2083 <h5 class="mb-0 fw-bold"> 2084 عربة Ø§ÙØªØ³ÙÙ 2085 </h5> 2086 <button class="btn-close" type="button" aria-label="Close" data-bind="click: doCloseCartDrawer"></button> 2087 </div> 2088 <!-- /ko --> 2089 2090 <!-- Added Item Notification --> 2091 <!-- ko if: m_currentPopUpMessage._popUpMessageType() >= 0 --> 2092 <div class="cart-drawer-alert" data-bind="css: doGetClassDrawerAlert()"> 2093 <div class="d-flex align-items-center gap-2"> 2094 <!-- ko if: m_currentPopUpMessage._pictureUrl() && !(m_drawerShortMode() && m_currentCart._listCartDetailModel().length > 0) --> 2095 <img alt="" loading="lazy" class="rounded flex-shrink-0" style="width:40px; height:40px; object-fit:cover;" data-bind="attr:{ src: m_currentPopUpMessage._pictureUrl() }"> 2096 <!-- /ko --> 2097 <div class="flex-grow-1 font-size-12" data-bind="html: doGetDrawerAlertMessage()"></div> 2098 <!-- ko if: m_drawerShortMode() && m_currentCart._listCartDetailModel().length == 0 --> 2099 <button class="btn-close flex-shrink-0" type="button" style="font-size: 10px;" aria-label="Close" data-bind="click: doCloseCartDrawer"></button> 2100 <!-- /ko --> 2101 </div> 2102 <!-- ko if: m_currentPopUpMessage._hasCouponShipment() --> 2103 <div class="shipteaser shipteaser-sm mt-2" data-bind="css: { 'shipteaser-done': !m_currentPopUpMessage._hasPartialShipmentDiscount() && m_currentPopUpMessage._drawLine() == 100 }" > 2104 <span class="shipteaser-icon"><i class="ci-delivery flipAuto"></i></span> 2105 <div class="shipteaser-body"> 2106 <!-- ko if: m_currentPopUpMessage._hasPartialShipmentDiscount() --> 2107 <p class="shipteaser-text" data-bind="html: doGetShipmentTeaserMessage()"></p> 2108 <!-- /ko --> 2109 2110 <!-- ko if: !m_currentPopUpMessage._hasPartialShipmentDiscount() && m_currentPopUpMessage._drawLine() != 100 --> 2111 <p class="shipteaser-text">شراء <span class="shipteaser-value" data-bind="text: m_currentPopUpMessage._couponAmount()"></span> <span class="shipteaser-value" data-bind="text: doGetCurrentCurrency()"></span> اÙÙ Ø²ÙØ¯ ÙÙØØµÙ٠عÙÙÙ <strong>Ø´ØÙ ٠جاÙÙ</strong></p> 2112 <!-- /ko --> 2113 2114 <!-- ko if: !m_currentPopUpMessage._hasPartialShipmentDiscount() && m_currentPopUpMessage._drawLine() == 100 --> 2115 <p class="shipteaser-text">خد٠ة Ø§ÙØ´ØÙ اÙ٠جاÙÙ</p> 2116 <!-- /ko --> 2117 2118 <!-- ko if: m_currentPopUpMessage._drawLine() != 100 --> 2119 <div class="shipteaser-track" role="progressbar" aria-label="Free shipping progress"> 2120 <div class="shipteaser-fill" data-bind="style:{'width': m_currentPopUpMessage._drawLine()+'%'}"></div> 2121 </div> 2122 <!-- /ko --> 2123 </div> 2124 </div> 2125 <!-- /ko --> 2126 </div> 2127 <!-- /ko --> 2128 2129 <!-- Drawer Body - Cart Items --> 2130 <div class="cart-drawer-body"> 2131 <!-- ko if: m_currentCart._listCartDetailModel().length != 0 --> 2132 <div data-bind="foreach: { data: m_showCartDrawer() ? doGetFilterCart() : [] }"> 2133 <div class="cart-drawer-item"> 2134 <div class="d-flex gap-2 align-items-start"> 2135 <div class="flex-shrink-0 position-relative"> 2136 <a class="cart-drawer-item-img d-block" enable-href="false" data-bind="attr:{href: doGetLinkObject($data._objectModel)}"> 2137 <img loading="lazy" data-bind="attr:{ src: doGetDefaultPictureByObject($data._objectModel, true), alt: $data._objectModel._name }"> 2138 </a> 2139 <button class="cart-drawer-item-remove" 2140 data-bind="click: $root.doRemoveCartDetail.bind($root, $data)" 2141 type="button" aria-label="Remove"> 2142 <i class="ci-trash"></i> 2143 </button> 2144 </div> 2145 <div class="flex-grow-1" style="min-width:0;"> 2146 <a enable-href="true" class="cart-drawer-item-title" data-bind="text: $data._objectModel._name, attr:{href: doGetLinkObject($data._objectModel)}"></a> 2147 <div class="d-flex justify-content-between align-items-center mt-1"> 2148 <div class="text-accent fw-bold" data-bind="html: $root.doGetHtmlCartDetailPrice($data, true, true)"></div> 2149 <!-- ko if: $data._cartDetailType() != CartDetailTypeEnum.FromBundle --> 2150 <!-- ko if: $data._objectModel._objectSection() != ObjectSectionEnum.GiftCard && $data._objectModel._objectSection() != ObjectSectionEnum.Service --> 2151 <div class="count-input count-input-xs rounded-pill flex-shrink-0"> 2152 <button type="button" class="btn btn-icon" data-bind="click: $root.doSetQuantity.bind($root, $data, QuantityActionEnum.Remove)">
2153 <span class="fw-bold">â</span> 2154 </button> 2155 <input autocomplete="off" type="number" class="form-control text-center" readonly="true" data-bind="value: $data._quantity"> 2156 <button type="button" class="btn btn-icon" data-bind="click: $root.doSetQuantity.bind($root, $data, QuantityActionEnum.Add)"> 2157 <span class="fw-bold">+</span> 2158 </button> 2159 </div> 2160 <!-- /ko --> 2161 <!-- /ko --> 2162 </div> 2163 <!-- ko if: $data._objectModel._objectStockModel._objectStockStatus() == ObjectStockStatusEnum.Preserved --> 2164 <div class="cart-drawer-item-preorder d-flex align-items-center mt-1"> 2165 <i class="ci-truck flipAuto me-1-Auto" data-bind="css:{'icon-flip-horizontal': doGetCulture() =='en'}"></i> 2166 <!-- ko if: doGetCountryShortNameByCurrentCompany() == 'sa' --> 2167 <span data-bind="text: doFormatPreserved($data._objectModel._objectStockModel._datePreserved(), 15, doGetCulture())"></span> 2168 <!-- /ko --> 2169 <!-- ko if: doGetCountryShortNameByCurrentCompany() == 'ae' --> 2170 <span data-bind="text: doFormatPreserved($data._objectModel._objectStockModel._datePreserved(), 7, doGetCulture())"></span> 2171 <!-- /ko --> 2172 </div> 2173 <!-- /ko --> 2174 </div> 2175 </div> 2176 </div> 2177 </div> 2178 <!-- ko if: m_drawerShortMode() && m_currentCart._listCartDetailModel().length > 1 --> 2179 <div class="text-center py-2 border-top"> 2180 <button type="button" class="btn btn-link p-0 text-decoration-none fw-semibold font-size-12" 2181 style="color: rgba(var(--cz-primary-rgb));" 2182 data-bind="click: function(){ m_drawerShortMode(false); }, text: 'عرض Ø§ÙØ¬Ù ÙØ¹ ' + doGetCartCount() + ' اÙÙ ÙØªØ¬Ø§Øª'"> 2183 </button> 2184 </div> 2185 <!-- /ko --> 2186 <!-- ko if: m_drawerShortMode() && m_currentCart._listCartDetailModel().length > 0 --> 2187 <div class="px-3 pb-2"> 2188 <a class="btn btn-sm d-block w-100 cart-drawer-checkout" 2189 href="/Checkout" enable-href="false" 2190 onclick="m_handlerSession.doCloseCartDrawer()" 2191 style="font-size: 12px; padding: 6px 12px;"> 2192 <i class="ci-card me-2-Auto fs-sm align-middle flipAuto"></i>Ø§ÙØ¯Ùع 2193 </a> 2194 </div> 2195 <!-- /ko --> 2196 <!-- /ko --> 2197 2198 <!-- ko if: m_currentCart._listCartDetailModel().length == 0 && !m_drawerShortMode() --> 2199 <div class="text-center py-5 px-3"> 2200 <i class="ci-card-bag" style="font-size:48px; color:#ccc;"></i> 2201 <h6 class="mt-3 text-muted">ÙØ§ ØªÙØ¬Ø¯ Ù ÙØªØ¬Ø§Øª ÙÙ Ø³ÙØ© Ø§ÙØªØ³ÙÙ Ø§ÙØ®Ø§ØµØ© بÙ.</h6> 2202 </div> 2203 <!-- /ko --> 2204 </div> 2205 2206 <!-- Drawer Footer --> 2207 <!-- ko if: m_currentCart._listCartDetailModel().length != 0 && !m_drawerShortMode() --> 2208 <div class="cart-drawer-footer pb-sm-5 pb-md-4"> 2209 <div class="d-flex justify-content-between align-items-start mb-3"> 2210 <div class="textAlignAuto"> 2211 <span class="text-accent fw-semibold">Ù Ø¬Ù ÙØ¹</span> 2212 <span class="text-muted font-size-10">(ØªØ´Ù Ù Ø¶Ø±ÙØ¨Ø© اÙÙÙÙ Ø© اÙÙ Ø¶Ø§ÙØ©)</span> 2213 <div class="fs-lg fw-bold" style="color: var(--cz-heading-color, #222);" data-bind="html: $root.doCalcPriceDynamic(m_currentCart._total(), true)"></div> 2214 </div> 2215 <!-- ko if: doGetCartTotalSaved() > 0 --> 2216 <div class="font-size-11 text-success fw-semibold textAlignAuto" style="margin-top: 4px;"> 2217 <i class="ci-star font-size-10"></i> ÙÙØ¯ Ø£ÙÙØ°Øª 2218 <div class="fs-sm fw-bold" data-bind="html: $root.doCalcPriceDynamic(doGetCartTotalSaved(), true)"></div> 2219 </div> 2220 <!-- /ko --> 2221 </div>
2222 <a class="btn d-block w-100 cart-drawer-checkout mb-2" href="/Checkout" enable-href="false" onclick="m_handlerSession.doCloseCartDrawer()"> 2223 <i class="ci-card me-2-Auto fs-base align-middle flipAuto"></i>Ø§ÙØ¯Ùع 2224 </a> 2225 </div> 2226 <!-- /ko --> 2227</div> 2228 2229 2230 2231 2232
2233<script type="application/javascript"> 2234 window.doRedirection = function () { 2235 if (window.location.pathname.indexOf("CreateSell") != -1) 2236 window.location = window.location.origin; 2237 } 2238 2239 // The notification dropdown renders a row per advertisement, and it is in the header of every 2240 // page â so the whole list was bound on every page load for a panel most visitors never open. 2241 // The markup only foreaches once this says so; the flag stays true afterwards, since a second 2242 // open should cost nothing. 2243 // 2244 // Filling it is deliberately separate from opening it. On desktop the panel is opened by CSS 2245 // alone (.dropdown:hover > .dropdown-menu in StyleCartzilla-Menu.css), which no click handler 2246 // ever sees â so hovering showed the panel with nothing in it. The wrapper calls this on 2247 // pointer enter, which is the earliest moment either path can start. 2248 window.doPrepareAdvertisement = function () { 2249 if (typeof m_handlerSession != "undefined") 2250 m_handlerSession.m_showAdvertisement(true); 2251 } 2252 2253 window.doOpenAdvertisement = function () { 2254 doPrepareAdvertisement(); 2255 doJsShowMenu('UI_menuWebAdvertisement'); 2256 } 2257 2258 // Mobile renders its own copy of the same list, inside a modal opened from the footer 2259 // toolbar. Same gate, same flag: the rows exist once either surface is asked for. 2260 window.doOpenAdvertisementModal = function () { 2261 doPrepareAdvertisement(); 2262 doShowModal('UI_userModalAdvertisement'); 2263 } 2264 2265 window.doOpenProfile = function () { 2266 if (doCheckUUID(m_handlerSession.m_currentUser._id())){ 2267 if(window.innerWidth <= 992) 2268 doShowModal('UI_menuUserMobile'); 2269 else { 2270 var el = document.querySelector('#UI_userSession .dropdown-menu'); 2271 if (el) el.classList.toggle('show'); 2272 } 2273 } 2274 else { 2275 doShowModal('UI_sessionModal'); 2276 } 2277 } 2278 2279 2280 doLoadScript(function () { 2281 doJsPasswordVisibilityToggle(); // wire modal password eye toggles (login/register/reset) 2282 const sessionInputs = ["UI_sessionCode1", "UI_sessionCode2", "UI_sessionCode3", "UI_sessionCode4"]; 2283 doInitCodeInput(sessionInputs, m_handlerSession.m_currentStructUser._code, m_handlerSession, m_handlerSession.doEventSendCode); 2284 2285 var googleClientID = '316328785783-gk72dnq33tchhr0kdrtidg7enq1arami.apps.googleusercontent.com'; 2286 var googleBtn = document.getElementById("UI_buttonGoogle"); 2287 if (googleClientID != "" && googleBtn) { 2288 if (window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth) 2289 { 2290 googleBtn.innerHTML = 2291 '<button class="btn btn-outline-dark w-100">Sign in with Google</button>'; 2292 googleBtn.onclick = async function () { 2293 try { 2294 // Native plugin reads serverClientId from google-services.json / 2295 // GoogleService-Info.plist; web doesn't need to pass it. 2296 var res = await window.Capacitor.Plugins.NativeAuth.signInWithGoogle({}); 2297 m_handlerSession.doGoogleCredentialResponse({ credential: res.idToken }); 2298 } catch (error) { 2299 console.log(error); 2300 } 2301 }; 2302 } 2303 // Web (browser) Google Sign-In client is heavy (~69 KiB). Don't load it at 2304 // page load â defer to the first time the session modal opens. See 2305 // window.doInitGoogleSignIn + the shown.bs.modal listener below. 2306 } 2307 2308 var m_gsiLoaded = false; 2309 window.doInitGoogleSignIn = function () { 2310 if (m_gsiLoaded) 2311 return; 2312 2313 var googleClientID = '316328785783-gk72dnq33tchhr0kdrtidg7enq1arami.apps.googleusercontent.com'; 2314 var googleBtn = document.getElementById("UI_buttonGoogle"); 2315 var isNative = window.Capacitor && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth; 2316 2317 // Native wires googleBtn.onclick at page load and loads no web script â skip here. 2318 if (googleClientID == "" || !googleBtn || isNative) 2319 return; 2320 2321 m_gsiLoaded = true; 2322 doLoadScript(function () { 2323 try{ 2324 google.accounts.id.initialize({ 2325 client_id: googleClientID, 2326 callback: m_handlerSession.doGoogleCredentialResponse 2327 }); 2328 google.accounts.id.renderButton( 2329 googleBtn, 2330 { theme: "outline", size: "large" } // customization attributes 2331 ); 2332 } 2333 catch(error){ 2334 console.log(error); 2335 } 2336 2337 }, "https://accounts.google.com/gsi/client"); 2338 }; 2339 2340 // The Google and Apple origins used to be preconnected from the head of every page, where 2341 // they were two handshakes nobody spent on a visit that never opens this modal. Warm them 2342 // here instead, on `show` rather than `shown`: the two doInit* handlers below fetch the SDKs 2343 // on `shown`, so this puts the connection one modal fade (~150-300 ms) ahead of the request 2344 // instead of in the same tick, which is the whole point of a preconnect.
2345 var m_signInWarmed = false; 2346 function doWarmSignInOrigins() { 2347 if (m_signInWarmed) 2348 return; 2349 m_signInWarmed = true; 2350 2351 var origins = ["https://accounts.google.com", "https://appleid.cdn-apple.com"]; 2352 for (var w = 0; w < origins.length; w++) { 2353 var hint = document.createElement("link"); 2354 hint.rel = "preconnect"; 2355 hint.href = origins[w]; 2356 hint.crossOrigin = "anonymous"; 2357 document.head.appendChild(hint); 2358 } 2359 } 2360 2361 var sessionModalEl = document.getElementById("UI_sessionModal"); 2362 if (sessionModalEl) 2363 sessionModalEl.addEventListener("show.bs.modal", doWarmSignInOrigins); 2364 if (sessionModalEl) 2365 sessionModalEl.addEventListener("shown.bs.modal", window.doInitGoogleSignIn); 2366 2367 var appleClientID = 'com.root.login.brandfull'; 2368 var appleBtn = document.getElementById("appleid-signin"); 2369 if (appleClientID != "" && appleBtn) { 2370 var capPlatform = (window.Capacitor && window.Capacitor.getPlatform) ? window.Capacitor.getPlatform() : ""; 2371 var isNative = (capPlatform === "ios" || capPlatform === "android") 2372 && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth; 2373 2374 if (isNative) { 2375 // iOS: ASAuthorization (bundle ID is the audience â pass {}). 2376 // Android: Custom Tab to appleid.apple.com, deep-link back via the 2377 // intent-filter on blendshome.com/auth/android. 2378 appleBtn.innerHTML = 2379 '<button class="btn btn-dark w-100">Sign in with Apple</button>'; 2380 appleBtn.onclick = async function () { 2381 try { 2382 var args = (capPlatform === "android") 2383 ? { clientId: appleClientID, redirectUri: 'https://brandfull.com/auth/android' } 2384 : {}; 2385 var res = await window.Capacitor.Plugins.NativeAuth.signInWithApple(args); 2386 m_handlerSession.doAppleCredentialResponse(res.idToken); 2387 } catch (error) { 2388 console.log(error); 2389 } 2390 }; 2391 } 2392 // Web Apple Sign-In JS deferred to first modal open â see window.doInitAppleSignIn. 2393 } 2394 2395 var m_appleLoaded = false; 2396 window.doInitAppleSignIn = function () { 2397 if (m_appleLoaded) 2398 return; 2399 2400 var appleClientID = 'com.root.login.brandfull'; 2401 var appleBtn = document.getElementById("appleid-signin"); 2402 var capPlatform = (window.Capacitor && window.Capacitor.getPlatform) ? window.Capacitor.getPlatform() : ""; 2403 var isNative = (capPlatform === "ios" || capPlatform === "android") 2404 && window.Capacitor.Plugins && window.Capacitor.Plugins.NativeAuth; 2405 2406 // Native wires appleBtn.onclick at page load and loads no web script â skip here. 2407 if (appleClientID == "" || !appleBtn || isNative) 2408 return; 2409 2410 m_appleLoaded = true; 2411 doLoadScript(function () { 2412 2413 AppleID.auth.init({ 2414 clientId: appleClientID, 2415 redirectURI: 'https://brandfull.com', 2416 scope: 'name email', 2417 usePopup: true, 2418 onSuccess: (response) => console.log('responseApple - response', response), 2419 onError: (error) => console.log('responseApple - error', error), 2420 }); 2421 2422 document.addEventListener('AppleIDSignInOnSuccess', (event) => { 2423 // Handle successful response. 2424 console.log('AppleIDSignInOnSuccess', event.detail.authorization.id_token); 2425 m_handlerSession.doAppleCredentialResponse(event.detail.authorization.id_token) 2426 }); 2427 2428 2429 // Listen for authorization failures. 2430 document.addEventListener('AppleIDSignInOnFailure', (event) => { 2431 // Handle error. 2432 console.log('AppleIDSignInOnFailure', event); 2433 }); 2434 }, "https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js"); 2435 }; 2436 2437 if (sessionModalEl) 2438 sessionModalEl.addEventListener("shown.bs.modal", window.doInitAppleSign
2438In); 2439 }) 2440</script>
2440 2441 2442 2443 2444<input autocomplete="off" style="visibility: hidden;display: none;" type="file" id="UI_addPicture" multiple accept="image/x-png,image/jpeg" /> 2445<div id="UI_uploadImageModal" class="modal" tabindex="-1" role="dialog" style="z-index: 100000;"> 2446 <div class="modal-dialog" style=" width: auto;"> 2447 <div class="modal-content"> 2448 <div class="modal-header"> 2449 <div class="modal-title h4"> تØÙ ÙÙ Ø§ÙØµÙرة </div> 2450 <button type="button" class="btn border-0 bg-transparent p-0" data-bs-dismiss="modal" aria-label="غÙÙ" style="position: inherit; " data-bind="style:{'float': doGetCulture() == 'en'? 'right':'left'}"> 2451 <i class="ci-close"></i> 2452 </button> 2453 </div> 2454 <div class="modal-body pt-1 px-0 pb-0" id="UI_bodyImageModal"> 2455 <div id="image_demo"></div> 2456 </div> 2457 <div class="modal-footer py-1"> 2458 <div class="w-100" style="text-align: center;"> 2459 <button class="btn btn-primary crop_image py-1" id="crop_image"> 2460 <i class="ci-reduce"></i> 2461 Ø§Ø¶Ù ØµÙØ±Ø© 2462 </button> 2463 <button class="btn btn-secondary RotateRight py-1"> 2464 <i class="ci-compare"></i> 2465 Ø¯ÙØ±Ø§Ù 2466 </button> 2467 </div> 2468 </div> 2469 </div> 2470 </div> 2471</div> 2472 2473<style> 2474 /* Cropper look & feel â id-scoped so these win over micro-cropper.js's injected global rules */ 2475 #UI_uploadImageModal .modal-dialog { max-width: 480px; } 2476 #UI_uploadImageModal .modal-content { 2477 border: 0; 2478 border-radius: 18px; 2479 overflow: hidden; 2480 box-shadow: 0 24px 60px -14px rgba(17, 20, 28, .38); 2481 } 2482 #UI_uploadImageModal .modal-body { 2483 background: linear-gradient(180deg, #f6f7f9 0%, #eef0f3 100%); 2484 } 2485 #UI_uploadImageModal .croppie-container { padding: 16px 0 6px; } 2486 2487 /* darkened surround + rounded stage */ 2488 #UI_uploadImageModal .cr-boundary { 2489 border-radius: 14px; 2490 box-shadow: inset 0 0 0 1px rgba(0, 0, 0, .06); 2491 } 2492 /* crop window: soft white frame + subtle ring, keep Croppie's giant darken shadow */ 2493 #UI_uploadImageModal .cr-viewport { 2494 border: 3px solid #fff; 2495 border-radius: 16px; 2496 box-shadow: 0 0 0 1px rgba(0, 0, 0, .18), 0 0 2000px 2000px rgba(17, 20, 28, .55); 2497 } 2498 2499 /* zoom slider */ 2500 #UI_uploadImageModal .cr-slider-wrap { width: 82%; margin: 8px auto 18px; } 2501 #UI_uploadImageModal .cr-slider { padding: 10px 0; } 2502 #UI_uploadImageModal .cr-slider::-webkit-slider-runnable-track { 2503 height: 6px; border-radius: 6px; background: rgba(17, 20, 28, .14); 2504 } 2505 #UI_uploadImageModal .cr-slider::-webkit-slider-thumb { 2506 height: 20px; width: 20px; margin-top: -7px; border-radius: 50%; 2507 background: var(--theme-color, #fd5631); border: 2px solid #fff; 2508 box-shadow: 0 2px 6px rgba(0, 0, 0, .3); transition: transform .15s ease; 2509 } 2510 #UI_uploadImageModal .cr-slider:active::-webkit-slider-thumb { transform: scale(1.15); } 2511 #UI_uploadImageModal .cr-slider::-moz-range-track { 2512 height: 6px; border-radius: 6px; background: rgba(17, 20, 28, .14); 2513 } 2514 #UI_uploadImageModal .cr-slider::-moz-range-thumb { 2515 height: 20px; width: 20px; border-radius: 50%; 2516 background: var(--theme-color, #fd5631); border: 2px solid #fff; 2517 box-shadow: 0 2px 6px rgba(0, 0, 0, .3); 2518 } 2519 2520 /* footer actions */ 2521 #UI_uploadImageModal .modal-footer { 2522 background: #fff; border-top: 1px solid rgba(0, 0, 0, .06); padding: 14px; 2523 } 2524 #UI_uploadImageModal .modal-footer .w-100 { 2525 display: flex; justify-content: center; gap: 10px; 2526 } 2527 #UI_uploadImageModal .modal-footer .btn { 2528 border-radius: 12px; padding: .55rem 1.15rem; font-weight: 600; 2529 display: inline-flex; align-items: center; gap: .4rem; 2530 } 2531 #UI_uploadImageModal .modal-footer .btn i { font-size: 1.05rem; } 2532</style> 2533 2534
2535<script type="application/javascript"> 2536 2537 var image_crop = null; 2538 var image_handler = null; 2539 var image_id = null; 2540 var image_name = null; 2541 var image_param = null; 2542 var image_input = null; 2543 var image_object = null; 2544 var image_folder = null; 2545 var image_index = 0; 2546 var _cropperLoaded = false; 2547 2548 // Lazy-load micro-cropper.js on first use 2549 function doLoadCropper() { 2550 return new Promise(function (resolve) { 2551 if (_cropperLoaded || typeof Croppie !== 'undefined') { _cropperLoaded = true; resolve(); return; } 2552 var s = document.createElement('script'); 2553 // Versioned like every other asset. This one builds its own
2553<script> instead of 2554 // going through doLoadScript, so it does not inherit the cache-busting there and 2555 // a deploy would keep serving the previously cached copy. 2556 s.src = 'https://cdn.brandfull.com/_Js/micro-cropper.js?v=639260136226636726'; 2557 s.onload = function () { _cropperLoaded = true; resolve(); }; 2558 document.head.appendChild(s); 2559 }); 2560 } 2561 2562 document.getElementById("UI_addPicture").addEventListener('change', function () { 2563 doShowModal('UI_uploadImageModal'); 2564 2565 image_input = document.getElementById("UI_addPicture"); 2566 image_index = image_input.files.length - 1; 2567 doLoadCropper().then(function () { 2568 doInitImageTool(image_input, image_object._dimension(), null, image_object._order(), null); 2569 }); 2570 }); 2571 2572 document.getElementById("UI_uploadImageModal").addEventListener('hidden.bs.modal', function() { 2573 document.getElementById("UI_addPicture").value = ''; 2574 }); 2575 2576 var m_currentPicture = null; 2577 window.doOpenCropper = function (handler, folder, item) { 2578 image_handler = handler; 2579 image_folder = folder; 2580 image_object = item; 2581 doLoadCropper().then(function () { 2582 if (item._binary()) { 2583 doShowModal('UI_uploadImageModal'); 2584 doInitImageTool(document.getElementById("UI_addPicture"), item._dimension(), item._binary(), item._order(), item._name()); 2585 } 2586 else if (item._name()) { 2587 doShowModal('UI_uploadImageModal'); 2588 doInitImageTool(document.getElementById("UI_addPicture"), item._dimension(), image_folder + '/' + item._name(), item._order(), item._name()); 2589 } 2590 else 2591 document.getElementById("UI_addPicture").click(); 2592 }); 2593 } 2594 2595 function doInitImageTool(input, dimension, imagepath = null, entityId = null, entityName = null) { 2596 var image_demo = document.querySelector('#image_demo'); 2597 image_id = entityId; 2598 image_name = entityName; 2599 image_input = input; 2600 image_param = doGetParamPicture(dimension); 2601 if (image_crop != null) 2602 image_crop.destroy(); 2603 2604 var xW = image_param.size.width / Math.max(image_param.size.height, image_param.size.width); 2605 image_param.viewport.width = image_param.viewport.width * xW; 2606 var xH = image_param.size.height / Math.max(image_param.size.height, image_param.size.width); 2607 image_param.viewport.height = image_param.viewport.height * xH; 2608 image_crop = new Croppie(image_demo, { 2609 showZoomer: true, 2610 enableResize: false, 2611 enableOrientation: true, 2612 enforceBoundary: true, 2613 mouseWheelZoom: true, 2614 enableExif: true, 2615 viewport: image_param.viewport, 2616 boundary: image_param.boundary 2617 }); 2618 2619 var reader = new FileReader(); 2620 reader.onload = function (event) { 2621 image_crop.bind({ 2622 url: event.target.result, 2623 }).then(function () { 2624 image_crop.setZoom(0); 2625 }); 2626 }; 2627 2628 if (imagepath != null) { 2629 var base64Rejex = /^(?:[A-Z0-9+\/]{4})*(?:[A-Z0-9+\/]{2}==|[A-Z0-9+\/]{3}=|[A-Z0-9+\/]{4})$/i; 2630 var isBase64Valid = base64Rejex.test(imagepath); 2631 if (isBase64Valid) { 2632 var url = "data:image/png;base64," + imagepath; 2633 var byteString = atob(url.split(',')[1]); 2634 var ab = new ArrayBuffer(byteString.length); 2635 var ia = new Uint8Array(ab); 2636 for (var i = 0; i < byteString.length; i++) { 2637 ia[i] = byteString.charCodeAt(i); 2638 } 2639 var blob = new Blob([ab], { type: image_param.format ? 'image/' + image_param.format : 'image/jpeg' }); 2640 reader.readAsDataURL(blob); 2641 } 2642 else { 2643 var request = new XMLHttpRequest(); 2644 request.open("POST", '/ConvertBinary?imageUrl=' + imagepath, true); 2645 request.onreadystatechange = function () { 2646 if (request.readyState == 4) 2647 { 2648 if (request.status == 200) { 2649 try { 2650 response = JSON.parse(request.responseText); 2651 var url = "data:image/png;base64," + response.imageData; 2652 var byteString = atob(url.split(',')[1]); 2653 var ab = new ArrayBuffer(byteString.length); 2654 var ia = new Uint8Array(ab); 2655 for (var i = 0; i < byteString.length; i++) { 2656 ia[i] = byteString.charCodeAt(i); 2657 } 2658 var blob = new Blob([ab], { type: image_param.format ? 'image/' + image_param.format : 'image/jpeg' });
2659 reader.readAsDataURL(blob); 2660 } 2661 catch (error) { response = request.responseText; } 2662 } 2663 } 2664 }; 2665 request.send(); 2666 } 2667 } 2668 else if (input.files.length != 0) { 2669 reader.readAsDataURL(input.files[image_index]); 2670 } 2671 } 2672 2673 2674 function doGetParamPicture(dimension) { 2675 var pSize = document.getElementById('UI_bodyImageModal').clientWidth; 2676 2677 var dimensions = dimension.split("x"); 2678 if (dimensions.length != 2) 2679 dimensions = dimension.split("X"); 2680 if (dimensions.length != 2) 2681 dimensions = dimension.split("*"); 2682 return { 2683 size: { width: dimensions[0], height: dimensions[1] }, 2684 viewport: { width: pSize * 0.75, height: pSize * 0.75, type: 'square' }, 2685 boundary: { width: pSize - 30, height: pSize - 30 } 2686 }; 2687 } 2688 function doClickCrop() { 2689 if (image_crop == null) 2690 return; 2691 2692 image_crop.result({ 2693 type: 'canvas', 2694 size: image_param.size, 2695 format: image_param.format ? image_param.format : "jpeg", 2696 quality: image_param.quality ? image_param.quality.value : 0.5 2697 }).then(function (response) { 2698 var size = response.length / (1024 * 1024); 2699 if (response && size < 4) 2700 { 2701 image_object = image_handler.doAddImage(image_input ? image_input.id : null, image_id, image_name, response.split(";base64,")[1], response.split(";base64,")[0].split("/")[1]); 2702 if (image_index != 0 && image_object != null && image_object != undefined) { 2703 image_index = image_index - 1; 2704 setTimeout(doInitImageTool.bind(null, image_input, image_object._dimension(), null, image_object._order(), null), 250); 2705 } 2706 else 2707 doHideModal('UI_uploadImageModal'); 2708 } 2709 }); 2710 } 2711 function doClickRotateRight() { 2712 if (image_crop != null) 2713 image_crop.rotate(90); 2714 } 2715 2716 document.querySelector("#crop_image").removeEventListener('click', doClickCrop); 2717 document.querySelector('#crop_image').addEventListener('click', doClickCrop); 2718 2719 document.querySelector(".RotateRight").removeEventListener('click', doClickRotateRight); 2720 document.querySelector('.RotateRight').addEventListener('click', doClickRotateRight); 2721 2722</script>
2722 2723 2724 2725 2726 2727 2728 2729 2730 2731
2732<script type="application/javascript"> 2733 // Body lives in Tools/Cartzilla/Footer.ts -- the three app footers each carried their own 2734 // near-identical copy of it. 2735 // 2736 // Must go through doLoadScript: Footer.ts is compiled into script.min.js, which is fetched 2737 // asynchronously, so doInitLayoutFooter does not exist yet when this inline script parses. 2738 // Calling it bare threw "doInitLayoutFooter is not defined" on every page. doLoadScript is 2739 // defined by _LayoutScript, which _Layout renders well before this partial, and it is 2740 // idempotent -- the bundle is requested once and later callbacks fire immediately. 2741 doLoadScript(function () { doInitLayoutFooter(); }); 2742</script>
2742 2743 2744<!-- Footer--> 2745 2746 2747<footer id="UI_LayoutFooter" class="footer bg-secondary" style="visibility: hidden;"> 2748 2749 2750 2751 <div id="UI_social" class="bf-surfaceBand px-lg-3"> 2752 <div class="container d-flex flex-md-row flex-sm-column py-sm-3 py-md-2 py-lg-3"> 2753 <div class="col-md-6 col-12 text-center mx-auto"> 2754 <h3 class="pb-1 text-accent mb-2">Ø§ÙØ¶Ù Ø¥ÙÙ ÙØ´Ø±ØªÙا Ø§ÙØ¥Ø®Ø¨Ø§Ø±ÙØ© Ø§ÙØ¢Ù</h3> 2755 <p class="fs-sm d-sm-none text-white">تÙÙ٠آخر Ø§ÙØªØØ¯Ùثات ØÙÙ Ø§ÙØ¹Ø±Ùض Ø§ÙØªØ±ÙÙØ¬ÙØ© ÙÙ ÙØªØ¬Ø§ØªÙا</p> 2756 2757 </div> 2758 <div class="d-flex flex-wrap align-items-center col-md-6 col-12"> 2759 <div class="input-group flex-nowrap"> 2760 <i class="ci-mail position-absolute top-50 translate-middle-y text-muted fs-base ms-3-Auto zindex-10"></i> 2761 <input autocomplete="email" class="form-floating form-control rounded-start-Auto" type="email" data-bind="value : m_emailNewsletter" placeholder="Ø§ÙØ¨Ø±Ùد Ø§ÙØ¥ÙÙØªØ±ÙÙÙ"> 2762 <button class=" btn btn-primary" type="button" data-bind="click : doSaveNewsletter"> 2763 ارس٠2764 </button> 2765 </div> 2766 <!-- ko if: !doCheckEmptyData(m_errorNewsletter()) --> 2767 <small class="text-danger" data-bind="text: m_errorNewsletter"></small> 2768 <!-- /ko --> 2769 <div class="subscription-status"></div> 2770 </div> 2771 </div> 2772 2773 </div> 2774 2775 <div class="p-lg-3 p-md-2 mb-2"> 2776 <div class="mx-auto px-1 row" style="max-width: 80rem;"> 2777 2778 <div id="UI_companyContact" class="col-md-4 col-12 order-sm-first"> 2779 2780 <div class="form-text text-black"> 2781 <div class="widget widget-light pb-2 mb-md-4"> 2782 <!-- ko if: !doCheckEmptyData(m_currentCompany._whatsappLink()) --> 2783 <a name="supportwhatsapp" class="btn-social bs-light bs-whatsapp me-1-Auto mb-1" href="#" aria-label="whatsapp" data-bind="attr:{href:m_currentCompany._whatsappLink}" target="_blank" enable-href="true" rel="noreferrer"> 2784 <i class="ci-whatsapp font-size-20"></i> 2785 </a> 2786 <!-- /ko --> 2787 <!-- ko if: !doCheckEmptyData(m_currentCompany._facebookLink()) --> 2788 <a name="supportfacebook" class="btn-social bs-light bs-facebook me-1-Auto mb-1" href="#" aria-label="facebook" data-bind="attr:{href:m_currentCompany._facebookLink}" target="_blank" enable-href="true" rel="noreferrer"> 2789 <i class="ci-facebook font-size-20"></i> 2790 </a> 2791 <!-- /ko --> 2792 <!-- ko if: !doCheckEmptyData(m_currentCompany._twitterLink()) --> 2793 <a name="supporttwitter" class="btn-social bs-light bs-twitter me-1-Auto mb-1" href="#" aria-label="twitter" data-bind="attr:{href:m_currentCompany._twitterLink}" target="_blank" enable-href="true" rel="noreferrer"> 2794 <i class="ci-twitter font-size-20"></i> 2795 </a> 2796 <!-- /ko --> 2797 <!-- ko if: !doCheckEmptyData(m_currentCompany._instagramLink()) --> 2798 <a name="supportinstagram" class="btn-social bs-light bs-instagram me-1-Auto mb-1" href="#" aria-label="instagram" data-bind="attr:{href:m_currentCompany._instagramLink}" target="_blank" enable-href="true" rel="noreferrer"> 2799 <i class="ci-instagram font-size-20"></i> 2800 </a> 2801 <!-- /ko --> 2802 <!-- ko if: !doCheckEmptyData(m_currentCompany._snapchatLink()) --> 2803 <a name="supportsnapchat" class="btn-social bs-light bs-facebook me-1-Auto mb-1" href="#" aria-label="snapchat" data-bind="attr:{href:m_currentCompany._snapchatLink}" target="_blank" enable-href="true" rel="noreferrer"> 2804 <i class="ci-snapchat font-size-20"></i> 2805 </a> 2806 <!-- /ko --> 2807 <!-- ko if: !doCheckEmptyData(m_currentCompany._tiktokLink()) --> 2808 <a name="supporttiktok" class="btn-social bs-light bs-facebook me-1-Auto mb
2808-1" href="#" aria-label="tiktok" data-bind="attr:{href:m_currentCompany._tiktokLink}" target="_blank" enable-href="true" rel="noreferrer"> 2809 <i class="ci-tiktok font-size-20"></i> 2810 </a> 2811 <!-- /ko --> 2812 </div> 2813 </div> 2814 2815 2816 <div class="d-grid col-12"> 2817 <div class="form-text text-white me-2-Auto"> 2818 <i class="ci-location"></i> 2819 <span data-bind="html: doGetAddress(m_currentCompany._addressModel, '</br>')"> 2820 </span> 2821 </div> 2822 <div class="d-flex flex-wrap text-white"> 2823 <div class="me-2-Auto widget-light"> 2824 <i class="ci-mail"></i> 2825 <a href="#" class="widget-list-link d-inline " data-bind="attr:{href: 'mailto:'+ m_currentCompany._addressModel._email()}" target="_blank" enable-href="true" rel="noreferrer"> 2826 <b data-bind="text:m_currentCompany._addressModel._email"></b> 2827 </a> 2828 </div> 2829 <div class="me-2-Auto widget-light widget-list-item"> 2830 <i class="ci-phone"></i> 2831 <a href="#" class="widget-list-link d-inline" data-bind="attr:{href: 'tel:'+ m_currentCompany._addressModel._phone()}" target="_blank" enable-href="true" rel="noreferrer"> 2832 <b data-bind="text:m_currentCompany._addressModel._phone"></b> 2833 </a> 2834 </div> 2835 </div> 2836 2837 </div> 2838 2839 </div> 2840 2841 2842 <div id="UI_companyInfo" class="col-md-4 col-12 px-md-0 mb-2 m-sm-3"> 2843 <div class=" row mt-n1 form-text text-black mb-1"> 2844 <div class="col-3 "> 2845 <a class="d-inline-block align-middle" href="#"> 2846 <!-- ko if: !doCheckEmptyData(m_currentCompany._pictureModel._name()) --> 2847 <img loading="lazy" width="72" height="40" class="d-block" data-bind="attr:{src: doGetWebpLink('https://cdn.brandfull.com/Content/company/'+ m_currentCompany._pictureModel._name()), title: m_currentCompany._name, alt: m_currentCompany._name}" alt="company"> 2848 <!-- /ko --> 2849 </a> 2850 </div> 2851 <div class="col-9"> 2852 <div class="form-text text-accent"> 2853 <strong class="font-size-16" data-bind="text: m_currentCompany._name()"></strong> 2854 </div> 2855 <div class="form-text text-white pb-2 mt-3"> 2856 <span class="" data-bind="text: m_currentCompany._description()"></span> 2857 2858 <div class="d-flex mt-sm-2" data-bind="foreach: { data: m_handlerLayout.m_listCategoryMenuDepartmentFooter, as: 'subCategory' }"> 2859 <a class="col-2" href="#" enable-href="false" data-bind="attr:{ href: doGetLinkLoadMenu (subCategory, 'About')}"> 2860 <!-- ko if: !doCheckEmptyData(subCategory._pictureName()) --> 2861 <img loading="lazy" class="p-1" data-bind="attr:{src: doGetWebpLink('https://cdn.brandfull.com/Content/category/'+subCategory._pictureName()), title:subCategory._name, alt:subCategory._name}" width="100%" height="100%" alt="category" /> 2862 <!-- /ko --> 2863 </a> 2864 </div> 2865 </div> 2866 </div> 2867 2868 </div> 2869 </div> 2870 2871 <div id="UI_companyLinks" class="col-md-4 col-12 mb-sm-5" style="display:flex; flex-wrap: wrap"> 2872 <!-- ko foreach: m_listCategoryMenuFooter --> 2873 <div class=" col-12 active footer-links " data-bind=" class: $root.m_listCategoryMenuFooter().length == 2? 'col-sm-6' : 'col-sm-4' ,attr:{'id': 'footing_'+ $index() }"> 2874 <div class="widget textAlignAuto"> 2875 <div class="widget widget-links widget-light mb-4"> 2876 <div class="h6 widget-title text-accent pb-1" data-bind="text: $data._name()"></div> 2877 <!-- ko if: $data._list().length!=0 --> 2878 <ul class="widget-list" data-bind="foreach: { data: $data._list(), as: 'subCategory' }"> 2879 <li class="widget-list-item"> 2880 <a class="widget-list-link" href="#" enable-href="false" data-bind="attr:{ href: doGetLinkLoadMenu (subCategory, 'About')}"> 2881 <!-- ko if: !doCheckEmptyData(subCategory._pictureName()) --> 2882 <i><img alt="" loading="lazy" data-bind="attr:{src: doGetWebpLink('https://cdn.brandfull.com/Content/category/'+subCategory._pictureName()), title:subCategory._name}" width="18" height="18" /></i> 2883 <!-- /ko -->
2884 <span data-bind="text: subCategory._name"></span> 2885 </a> 2886 </li> 2887 </ul> 2888 <!-- /ko --> 2889 </div> 2890 </div> 2891 </div> 2892 <!-- /ko --> 2893 </div> 2894 2895 </div> 2896 </div> 2897</footer> 2898 2899<!-- Back To Top Button--> 2900<a id="UI_topArraw" class="btn-scroll-top" onclick="doScrollToTop()"> 2901 <span class="btn-scroll-top-tooltip text-muted fs-sm me-2">أعÙÙ</span> 2902 <i class="btn-scroll-top-icon ci-arrow-up"></i> 2903</a> 2904 2905 2906<div id="UI_menuUserMobile" class="modal fade slide-up" tabindex="-1" role="dialog" aria-labelledby="UI_menuUserMobileLabel" aria-modal="true"> 2907 <div class="modal-dialog" role="document"> 2908 <div class="modal-content"> 2909 <div class="modal-header border-bottom"> 2910 <h5 class="modal-title fw-bold" id="UI_menuUserMobileLabel">ÙØ§Ø¦Ù Ø© اÙÙ ÙÙ Ø§ÙØ´Ø®ØµÙ</h5> 2911 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 2912 </div> 2913 <div class="modal-body p-4"> 2914 <div class="widget widget-cart px-3 pt-2 pb-3 textAlignAuto"> 2915 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Profile" data-bs-dismiss="modal" aria-label="Close"> 2916 <i class="ci-user opacity-60 me-2-Auto"></i>اÙÙ ÙÙ Ø§ÙØ´Ø®ØµÙ 2917 </a> 2918 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Invoices" data-bs-dismiss="modal" aria-label="Close"> 2919 <i class="ci-basket opacity-60 me-2-Auto"></i>اÙÙÙØ§ØªÙر 2920 </a> 2921 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Supports" data-bs-dismiss="modal" aria-label="Close"> 2922 <i class="ci-help opacity-60 me-2-Auto"></i>ØªØ°Ø§ÙØ± 2923 </a> 2924 <a class="dropdown-item d-flex align-items-center py-1" enable-href="false" href="/Account/Messages" data-bs-dismiss="modal" aria-label="Close"> 2925 <i class="ci-message opacity-60 me-2-Auto"></i>رسائ٠2926 </a> 2927 2928 <div class="dropdown-divider"></div> 2929 <a class="dropdown-item d-flex align-items-center py-1" href="#" enable-href="false" data-bind="click: $root.doLogOut.bind($root, '/Account/LogOff?Value=https%3A%2F%2Fbrandfull.com%2FAccount%2FFavorites')" data-bs-dismiss="modal" aria-label="Close"> 2930 <i class="ci-sign-out opacity-60 me-2-Auto"></i>تسجÙÙ Ø§ÙØ®Ø±Ùج 2931 </a> 2932 </div> 2933 </div> 2934 </div> 2935 </div> 2936</div> 2937 2938 2939<div id="UI_userModalAdvertisement" class="modal fade slide-up" tabindex="-1" role="dialog" aria-labelledby="UI_userModalAdvertisementLabel" aria-modal="true"> 2940 <div class="modal-dialog" role="document"> 2941 <div class="modal-content overflow-hidden"> 2942 <div class="modal-header border-bottom"> 2943 <h5 class="modal-title fw-bold" id="UI_userModalAdvertisementLabel">إشعار</h5> 2944 <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> 2945 </div> 2946 <div class="modal-body"> 2947 <div class="widget widget-cart pt-2 pb-0"> 2948 <div class="d-flex align-items-center justify-content-between"> 2949 <div class="col-md-10"> 2950 2951 <!-- ko if: m_handlerLayout.m_isViewMobile() --> 2952 <!-- ko if: m_enableNotifGrant() --> 2953 <button id="UI_notifGrant" class="btn d-flex align-content-between align-items-center font-size-10 p-1 " onclick="doGetPermissionNotification()"> 2954 <i class="ci-settings me-2-Auto font-size-14 "></i>
2955 <span class="form-check-label elide text-black fw-bolder heartbeat" for="UI_agreeWebPush"> 2956 ابÙÙ٠عÙÙ Ø§Ø·ÙØ§Ø¹ 2957 </span> 2958 </button> 2959 <!-- /ko --> 2960 <!-- ko if: m_enableNotifDenied() --> 2961 <div id="UI_notifDenied" class="d-flex align-content-between align-items-center font-size-10 p-1 "> 2962 <i class="ci-announcement me-2-Auto font-size-14 fw-bolder"></i> 2963 <span class="form-check-label elide text-danger fw-bolder heartbeat"> 2964 Ø§ÙØ¥Ø´Ø¹Ø§Ø±Ø§Øª Ù ØØ¬Ùبة. شغÙÙØ§ Ù٠إعدادات اÙÙ ØªØµÙØ ÙØªØØµÙ عÙÙ ØªÙØ¨ÙÙØ§Øª. 2965 </span> 2966 </div> 2967 <!-- /ko --> 2968 <!-- /ko --> 2969 </div> 2970 </div> 2971 2972 <div id="UI_notificationList" data-simplebar data-simplebar-auto-hide="false" style="overflow-x: hidden;max-height: 21rem;" data-bind="visible: m_listAdvertisement().length!=0, foreach: { data: m_showAdvertisement() ? m_listAdvertisement() : [] }"> 2973 <div class="border-bottom py-1 me-3-Auto d-flex justify-content-between border-danger" style=" border-bottom-style: dotted !important;" data-bs-dismiss="modal"> 2974 <label class="form-text elide w-75 pointer" data-bind="click: $root.doSetTaged.bind($root, $data, true), text:$data._subject()"></label> 2975 <b class="form-check-label textAlignReverse font-size-10 d-inline-block mb-n2 fw-light" data-bind="click: $root.doSetTaged.bind($root, $data, true), text: doCalcDateDifference(doCastFromUTC($data._dateCreate()))"></b> 2976 </div> 2977</div> 2978 2979 </div> 2980 2981 </div> 2982 </div> 2983 </div> 2984</div> 2985<div id="UI_footerMenu" class="handheld-toolbar position-fixed show" style="height: 3.5rem;"> 2986 <div class="d-table table-layout-fixed w-100 pt-1" style="height: 100%"> 2987 2988 <a name="footer-home" class="d-table-cell handheld-toolbar-item" href="/" rel="nofollow" enable-href="false" aria-label="go to home"> 2989 <span class="handheld-toolbar-icon"><i class="ci-home"></i></span> 2990 </a> 2991 <a name="footer-user" class="d-table-cell handheld-toolbar-item" aria-label="ÙØ§Ø¦Ù Ø© اÙÙ ÙÙ Ø§ÙØ´Ø®ØµÙ" href="javascript:void(0)" enable-href="false" rel="nofollow" listener="false" onclick="doOpenProfile()"> 2992 <span class="handheld-toolbar-icon"><i class="ci-user"></i></span> 2993 </a> 2994 2995 2996 <!-- ko if: doCheckUUID(m_currentUser._id()) --> 2997 <a name="footer-favorites" class="d-table-cell handheld-toolbar-item" aria-label="اÙÙ ÙØ¶ÙÙ" href="/Account/Favorites" rel="nofollow" enable-href="false"> 2998 <span class="handheld-toolbar-icon"><i class="ci-heart"></i></span> 2999 </a> 3000 3001 <a name="footer-notes" class="d-table-cell handheld-toolbar-item" aria-label="إشعار" href="javascript:void(0)" rel="nofollow" enable-href="false" listener="false" onclick="doOpenAdvertisementModal()"> 3002 <span class="handheld-toolbar-icon"> 3003 <!-- ko if: m_countAdvertisement() != 0 --> 3004 <span class="bg-danger font-size-10 text-white counterAdv" data-bind="text: m_countAdvertisement() > 99 ? '99+' : m_countAdvertisement()"></span> 3005 <!-- /ko --> 3006 <i class="ci-bell"></i> 3007 </span> 3008 </a> 3009 <!-- /ko --> 3010 3011 </div> 3012</div> 3013 3014 3015 3016 <!-- END FOOTER --> 3017 <div id="UI_preLoader" class="nav-progress" role="progressbar" aria-live="polite" 3018 style="display: none;" 3019 data-bind="visible: m_handlerLayout.m_customLoader()"> 3020 <span class="nav-progress-bar"></span> 3021 <span class="seo-hidden">تØÙ ÙÙ</span> 3022 </div> 3023 <!-- Google Tag Manager -->
3024<script> 3025 //we need it for GTMManager 3026 doLoadScript(function() { 3027 doSetThirdParty(window.dataLayer); 3028 }); 3029</script>
3029 3030<!-- End Google Tag Manager --> 3031<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 3031-3032
3031 3032<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
3032GTM-PTJJCWLL
vendor: 83 bytes, line 3032
3032" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
3033<!-- End Google Tag Manager (noscript) --> 3034 3035 3036 3037<noscript> 3038 <img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=602667531455664&ev=PageView&noscript=1" /> 3039</noscript> 3040<!-- End Meta Pixel Code --> 3041 <svg id="8dfd9ecb-4c59-4082-9d62-10717474add2.svg" style="display: none;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1124.14 1256.39"> 3042 <path class="cls-1" d="M699.62,1113.02h0c-20.06,44.48-33.32,92.75-38.4,143.37l424.51-90.24c20.06-44.47,33.31-92.75,38.4-143.37l-424.51,90.24Z"></path> 3043 <path class="cls-1" d="M1085.73,895.8c20.06-44.47,33.32-92.75,38.4-143.37l-330.68,70.33v-135.2l292.27-62.11c20.06-44.47,33.32-92.75,38.4-143.37l-330.68,70.27V66.13c-50.67,28.45-95.67,66.32-132.25,110.99v403.35l-132.25,28.11V0c-50.67,28.44-95.67,66.32-132.25,110.99v525.69l-295.91,62.88c-20.06,44.47-33.33,92.75-38.42,143.37l334.33-71.05v170.26l-358.3,76.14c-20.06,44.47-33.32,92.75-38.4,143.37l375.04-79.7c30.53-6.35,56.77-24.4,73.83-49.24l68.78-101.97v-.02c7.14-10.55,11.3-23.27,11.3-36.97v-149.98l132.25-28.11v270.4l424.53-90.28Z"></path> 3044</svg> 3045 3046 3047
3048<script type="application/javascript"> 3049 // What is left here is what is genuinely PER-REQUEST. m_jsonTranslate, jsonListCategory, 3050 // jsonListCompany and jsonListCountry have all moved to /InitData.js (HostController), because 3051 // none of them varies by anything but language: inlining them meant re-sending ~280 KB, the 3052 // category tree alone 270 KB of a 784 KB document, on every navigation and cached by nothing. 3053 // _LayoutScript requests that file first, ahead of the bundle, and the ready queue will not run a 3054 // callback until it has landed. 3055 // 3056 // Property writes onto GlobalSettingTranslateEnum. This one stays: it is resolved from the 3057 // request's companyID header, so it is not the same answer for two visitors on one deployment. 3058 // The body has to stay unevaluated until doSetEnumManager calls it -- GlobalSettingTranslateEnum 3059 // comes from /InitData.js along with the other 110 enums, and does not exist at this point in 3060 // the parse. (It was a script.min.js symbol until the enums moved; same answer either way.) 3061 function doApplySettingByCompany() { 3062 GlobalSettingTranslateEnum.PathCategoryPicture = "https://cdn.brandfull.com/Content/category/"; 3063GlobalSettingTranslateEnum.PathObjectTypePicture = "https://cdn.brandfull.com/Content/objecttype/"; 3064GlobalSettingTranslateEnum.PathObjectPicture = "https://cdn.brandfull.com/Content/object/"; 3065GlobalSettingTranslateEnum.PathPaymentMethodPicture = "https://cdn.brandfull.com/Content/paymentMethod/"; 3066GlobalSettingTranslateEnum.PathTrackerPicture = "https://cdn.brandfull.com/Content/tracker/"; 3067GlobalSettingTranslateEnum.PathShipmentMethodPicture = "https://cdn.brandfull.com/Content/shipmentMethod/"; 3068GlobalSettingTranslateEnum.PathCountryPicture = "https://cdn.brandfull.com/Content/country/"; 3069GlobalSettingTranslateEnum.BaseUrlAPI = "https://brandfullsapi.azurewebsites.net"; 3070GlobalSettingTranslateEnum.BaseUrl = "https://brandfull.com"; 3071GlobalSettingTranslateEnum.Take = "8"; 3072GlobalSettingTranslateEnum.CdnUrl = "https://cdn.brandfull.com"; 3073GlobalSettingTranslateEnum.RedirectUrlPaymentWeb = "https://brandfull.com/Invoice/Edit"; 3074GlobalSettingTranslateEnum.PathCompanyPicture = "https://cdn.brandfull.com/Content/company/"; 3075GlobalSettingTranslateEnum.TicketLifeTime = ""; 3076GlobalSettingTranslateEnum.AppName = "Brandfull"; 3077GlobalSettingTranslateEnum.PathSlidePicture = "https://cdn.brandfull.com/Content/slide/"; 3078GlobalSettingTranslateEnum.TakeObjectShop = "20"; 3079GlobalSettingTranslateEnum.PathReplayPicture = "https://cdn.brandfull.com/Content/replay/"; 3080GlobalSettingTranslateEnum.MessageServiceStatus = "true"; 3081GlobalSettingTranslateEnum.SmartPricingServiceStatus = ""; 3082GlobalSettingTranslateEnum.PathChatPicture = "https://cdn.brandfull.com/Content/chat/"; 3083GlobalSettingTranslateEnum.PathDetailPicture = "https://cdn.brandfull.com/Content/detail/"; 3084GlobalSettingTranslateEnum.PathColorPicture = "https://cdn.brandfull.com/Content/color/"; 3085GlobalSettingTranslateEnum.LimitAddCartQuantity = ""; 3086GlobalSettingTranslateEnum.MaketPlaceServiceStatus = "true"; 3087GlobalSettingTranslateEnum.PathDivPicture = "https://cdn.brandfull.com/Content/divTemplate/"; 3088GlobalSettingTranslateEnum.PathProfilePicture = "https://cdn.brandfull.com/Content/profile/"; 3089GlobalSettingTranslateEnum.PathMessagePicture = "https://cdn.brandfull.com/Content/message/"; 3090GlobalSettingTranslateEnum.PathSurveyPicture = "https://cdn.brandfull.com/Content/survey/"; 3091GlobalSettingTranslateEnum.PathInvoiceDetailStatusPicture = "https://cdn.brandfull.com/Content/invoiceDetailStatus/"; 3092 3093 } 3094</script>
3094 3095 3096 3097
3098<script id="Template_Empty" type="text/html"></script>
3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111
3112<script id="Template_ItemComponent_ObjectDefault" type="text/html"><div class="card product-card shadow-none" data-bind="class: $data.mode"><!--ko if : $data._listCategoryTop().length != 0 --><div class="badge p-0 d-flex flex-column gap-1"><!-- ko foreach: $data._listCategoryTop --><a class="bg-danger rounded-2 px-1 font-size-10" href="#" enable-href="false" data-bind=" 3113 html: doGenerateLabel($data._label()), 3114 style:{'background-color': doCheckIsLink($data._label())? 'transparent' : $data._colorBackgroundHex(), 'color': $data._colorLabelHex()}, 3115 attr:{href: doGetLinkCategory($data), 'data-divID': $parent.divID }"></a><!-- /ko --></div><!-- /ko --><!--ko if : $data._deliveryType() == DeliveryTypeEnum.Wanted --><div class="position-sticky overflow-hidden " ><a class="card-img-top d-block h-100 overflow-hidden" href="javascript: void(0)" aria-label="product" enable-href="false" data-bind="css:{'card-img-bottom': $data.mode != ''}"><img loading="lazy" class="rounded" style="max-height: 100%; height: 100%; object-fit: cover;" data-bind="attr:{ title: $data._name, src: doGetDefaultPictureByObject($data, $data.pictureSize), loading: $data.isAboveFold ? 'eager' : 'lazy', fetchpriority: $data.isLcp ? 'high' : null}" alt="Product"></a></div><div class="card-body p-0" data-bind="css:{'mb-4': ($data.mode =='OnePicture' && m_handlerLayout.m_isViewMobile() == true)}"><a class="elide mb-1" href="javascript: void(0)" aria-label="stock" name="stock" enable-href="false" data-bind="text: $data._name"></a><p data-bind="text: $data._description"></p><!--ko if : $data._listCategoryBottom().length != 0 --><div class="d-flex flex-column"><!-- ko foreach: $data._listCategoryBottom --><a class="font-size-10 elide w-100" href="#" aria-label="category" name="category" enable-href="false" data-bind=" 3116 html: doGenerateLabel($data._label()), 3117 style:{'background-color': doCheckIsLink($data._label())? 'transparent' : $data._colorBackgroundHex(), 'color': $data._colorLabelHex()}, 3118 attr:{href: doGetLinkCategory($data) , 'data-divID': $parent.divID}"></a><!-- /ko --></div><!-- /ko --></div><!-- /ko --><!--ko if : $data._deliveryType() != DeliveryTypeEnum.Wanted --><button class="btn-wishlist btn-sm " type="button" title="Ø£ÙØ§ Ø£ØØ¨" data-bind="style: { color: $data._likeCount()!=0 ? 'red' : '' }, click: m_handlerLayout.doSaveLike.bind(m_handlerLayout, $data)"><i class="fs-6" data-bind="class: $data._hasLike() ? 'ci-heart-filled ':'ci-heart', css:{'hasLike':$data._hasLike()==true}, "></i></button><div class="position-sticky overflow-hidden" ><a class="card-img-top d-block h-100 overflow-hidden" href="#" aria-label="product" enable-href="false" data-bind="css:{'card-img-bottom': $data.mode != ''}, attr:{href: doGetLinkObject($data), 'data-divID':$data.divID}"><img loading="lazy" class="h-100" data-bind="attr:{ title: $data._name, src: doGetDefaultPictureByObject($data, $data.pictureSize), loading: $data.isAboveFold ? 'eager' : 'lazy', fetchpriority: $data.isLcp ? 'high' : null}" alt="Product"></a><div class="d-flex w-100 mb-n3 zindex-10" style=" position: absolute; bottom: 42px;"><!--ko if : $data._objectStockModel._enableBidding() && $data._objectStockModel._enableTimerBidding() --><div class="countdown w-100 mb-0 rounded-bottom px-1 justify-content-start align-items-baseline" style="height:32px;" data-bind="attr:{id: doGetTimerID($data._objectStockModel, 'UI_timerBidding')}, childrenComplete : doJsCountDown(doGetTimerID($data._objectStockModel, 'UI_timerBidding'), true, $data._objectStockModel)"><div class="countdown-label w-100 text-light m-0 font-size-10" style="height:10px" ></div><div class="countdown-days w-25 countdown-value text-light bold m-0 font-size-16" ></div><div class="countdown-hours w-25 countdown-value text-light bold m-0 font-size-16"></div><div class="countdown-minutes w-25 countdown-value text-light bold m-0 font-size-16"></div><div class="countdown-seconds w-25 countdown-value text-light bold m-0 font-size-16"></div><div class="hide countdown-time w-100 countdown-value text-light m-0 font-size-16"></div></div><!-- /ko --></div><div class="fs-sm w-100 px-1 d-flex align-items-center justify-content-between" style="height: 26p
3118x"><div class="float-start mt-1" data-bind="foreach: $data._listColorSimiler"><a href="#" aria-label="color" name="color" class="colorSimiler" enable-href="false" data-bind="title: doGetDefaultNameColor($data), attr:{href: doGetLinkObject($data), 'data-divID':$parent.divID, 'id':'UI_sc_' +$parent._code()+'_'+$data._code()}"><label class="form-option-label rounded-circle" data-bind="attr:{'for':'UI_sc_' +$parent._code()+'_'+$data._code()}"><span class="form-option-color rounded-circle" data-bind="title: $data._objectName(), style:{'background': '-webkit-linear-gradient(45deg, ' + $data._hexName() + ' 60%, ' + doGetDefaultHexColor($data) + ' 40%)'}"></span></label></a></div><!--ko if : doCheckUUID($data._sizeModel._id()) --><a href="#" aria-label="size" name="size" class="float-end" enable-href="true" data-bind="text: $data._sizeModel._name(), attr:{href: doGetURL('Shop/search/') + $data._sizeModel._name(), 'data-divID':$data.divID}"></a><!-- /ko --></div></div><div class="card-body p-0" data-bind="css:{'mb-4': ($data.mode =='OnePicture' && m_handlerLayout.m_isViewMobile() == true)}"><div class="product-title fs-sm"><div class="brandRow"><!--ko with : doGetCategoryByType($data, CategoryTypeEnum.Brand) --><a class="brandRow-name fw-semibold text-decoration-none" href="#" aria-label="brand" name="brand" enable-href="false" 3119 data-bind="text: $data._name, attr:{ href: doGetLinkCategory($data), 'data-divID': $parent.divID }"></a><!-- /ko --><!--ko if : $data._sellMode() != SellModeEnum.SellWithOtherOnly && $data._objectStockModel._priceSale() != 0 && $data._objectStockModel._objectStockStatus() != ObjectStockStatusEnum.OutStock && $data._objectStockModel._objectStockStatus() != ObjectStockStatusEnum.Solded --><a class="btn-cart-inline pointer" href="#" name="addcart" aria-label="buy" title="buy" data-bind="click: m_handlerSession.doAddCart.bind(m_handlerSession, $data, 1, null, null, $data.divID)"><i class="ci-card-bag flipAuto"></i></a><!-- /ko --></div><a class="elide mb-1" href="#" aria-label="product" name="product" enable-href="false" data-bind="attr:{href: doGetLinkObject($data), 'data-divID':$data.divID}"><h2 class="font-size-14" data-bind="text: $data._name"></h2></a><div class="d-flex justify-content-between text-accent rounded-1" style="min-height: 2.5rem;"><!--ko if : $data._objectStockModel._priceSale() !=0 --><div class="text-accent sale w-100" style="display: flex;flex-wrap: wrap; align-items: baseline; column-gap: .4rem;" data-bind="html: m_handlerLayout.doHtmlPriceByCurrency($data, false, 0, true)"></div><!-- /ko --><!--ko if : $data._objectStockModel._objectStockStatus() == ObjectStockStatusEnum.Solded --><a href="#" aria-label="Solded" name="Solded" class="btn btn-sm px-2 py-1 pointer bg-black text-white font-size-10" style="height: fit-content;" title="Re-Buy" data-bind="attr:{href: doGetLinkObject($data), 'data-divID':$data.divID}"> 3120 ٠باع 3121 </a><!-- /ko --><!--ko if : $data._objectStockModel._objectStockStatus() == ObjectStockStatusEnum.OutStock --><a href="#" aria-label="OutStock" name="OutStock" class="btn btn-sm px-2 py-1 pointer bg-danger text-white font-size-10" style="height: fit-content;" title="Re-Buy" data-bind="attr:{href: doGetLinkObject($data), 'data-divID':$data.divID}"> 3122 ÙØ§ ÙÙØ¬Ø¯ ٠خزÙÙ 3123 </a><!-- /ko --></div></div><!--ko if : $data._listCategoryBottom().length != 0 --><div class="d-flex flex-column"><!-- ko foreach: $data._listCategoryBottom --><a class="font-size-10 elide w-100" href="#" aria-label="category" name="category" enable-href="false" data-bind=" 3124 html: doGenerateLabel($data._label()), 3125 style:{'background-color': doCheckIsLink($data._label())? 'transparent' : $data._colorBackgroundHex(), 'color': $data._colorLabelHex()}, 3126 attr:{href: doGetLinkCategory($data), 'data-divID':$parent.divID }"></a><!-- /ko --></div><!-- /ko --></div><!-- /ko --></div></script>
3126<script id="Template_ItemComponent_AdvanceAuto" type="text/html"><!--ko if : doGetSlideTitleVisible($data) || doGetSlideDescriptionVisible($data) || doGetSlideButtonVisible($data)--><div class="AdvanceAuto" data-bind="class: doGetSlideDescriptionVisible($data) ? '':'mb-3'"><div class="AdvanceAuto_lead"><div class="bf-sectionHead"><span class="h4" data-bind="visible: doGetSlideTitleVisible($data), text: $data._title"></span></div><p class="AdvanceAuto_note text-muted font-size-12" data-bind="visible: doGetSlideDescriptionVisible($data), html: $data._description, style:{color: $data._descriptionHex}"></p></div><!--ko if : doGetSlideButtonVisible($data)--><a class="bf-viewAll" href="#" aria-label="subdiv" name="subdiv" enable-href="true" data-bind="attr:{ href: doGetURL($data._link()), 'aria-label':$data._title}"><span data-bind="text: $data._button"></span><i data-bind="class: doGetCulture() =='en'? 'ci-arrow-right':'ci-arrow-left' "></i></a><!-- /ko --></div><!-- /ko --></script>
3126 3127<style> 3128 .product-card.shadow-none { 3129 box-shadow: unset !important; 3130 background-color: transparent; 3131 } 3132 3133 [lang="en"] .magicFlex a:last-of-type { 3134 margin-left: auto !important; 3135 } 3136 3137 [lang="ar"] .magicFlex a:last-of-type { 3138 margin-right: auto !important; 3139 } 3140 3141 .BigPicture , .BigPicture .position-sticky{ 3142 height: 100%; 3143 } 3144 3145.brandRow { 3146 display: flex; 3147 align-items: center; 3148 gap: .35rem; 3149 margin-bottom: .25rem; 3150 min-height: 1.75rem; 3151 } 3152 3153 .brandRow-name { 3154 font-size: 11px; 3155 color: #444; 3156 letter-spacing: .3px; 3157 flex: 0 1 auto; 3158 min-width: 0; 3159 overflow: hidden; 3160 text-overflow: ellipsis; 3161 white-space: nowrap; 3162 } 3163 3164 @media screen and (max-width:992px) { 3165 3166 .BigPicture , .OnePicture{ 3167 flex-direction: row !important; 3168 align-items: flex-end !important; 3169 padding-bottom: 0px !important; 3170 } 3171 3172 .BigPicture .position-sticky, .OnePicture .position-sticky { 3173 width: 45% !important; 3174 height: 100% !important; 3175 padding-right: 10px !important; 3176 padding-left: 10px !important; 3177 } 3178 3179 .BigPicture .position-sticky .bg-opacity-75, .OnePicture .position-sticky .bg-opacity-75 { 3180 width: calc(100% - 20px) !important; 3181 } 3182 3183 .BigPicture .card-body, .OnePicture .card-body { 3184 width: 50% !important; 3185 } 3186 } 3187</style> 3188<style> 3189 .AdvanceAuto { 3190 position: relative; 3191 margin-top: .5rem; 3192 } 3193 3194 .AdvanceAuto .AdvanceAuto_lead { 3195 width: 100%; 3196 } 3197 3198 .AdvanceAuto .AdvanceAuto_note { 3199 margin: -.75rem 0 0; 3200 text-align: center; 3201 } 3202 3203@media screen and (min-width: 768px) { 3204 .AdvanceAuto .bf-viewAll { 3205 position: absolute; 3206 top: 0; 3207 inset-inline-end: 0; 3208 } 3209 } 3210 3211 @media screen and (max-width: 767px) { 3212 .AdvanceAuto { 3213 display: flex; 3214 flex-direction: column; 3215 align-items: center; 3216 } 3217 } 3218</style> 3219 3220 3221 3222 3223</body> 3224</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.