1<!doctype html> 2<!--[if lt IE 7]><html class="no-js lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]--> 3<!--[if IE 7]><html class="no-js lt-ie9 lt-ie8" lang="en"> <![endif]--> 4<!--[if IE 8]><html class="no-js lt-ie9" lang="en"> <![endif]--> 5<!--[if IE 9 ]><html class="ie9 no-js"> <![endif]--> 6<!--[if (gt IE 9)|!(IE)]><!--> <html class="no-js"> <!--<![endif]--> 7<head> 8 9 <!-- Basic page needs ================================================== --> 10 <meta charset="utf-8"> 11 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 12 13 14 <link rel="icon" href="https://cdn.store-assets.com/s/385982/f/17617488.png" /> 15 16 17 <!-- Title and description ================================================== --> 18 <title> 19 Store Locator – SAUQAH 20 </title> 21 22 23 <meta name="description" content="Store Locator"> 24 25 26 <!-- Social meta ================================================== --> 27 28 29 <meta property="og:type" content="website"> 30 <meta property="og:title" content="Store Locator"> 31 <meta property="og:url" content="https://snhijabs.com/store-locator"> 32 33 <meta property="og:image" content="https://cdn.store-assets.com/s/385982/f/17617488.png"> 34 <meta property="og:image:secure_url" content="https://cdn.store-assets.com/s/385982/f/17617488.png"> 35 36 37 38<meta property="og:description" content="Store Locator"> 39<meta property="og:site_name" content="SAUQAH "> 40 41 42 43 <meta name="twitter:card" content="summary"> 44 45 46 47 <meta name="twitter:site" content="@"> 48 49 50 51 52 53 <!-- Helpers ================================================== --> 54 <link rel="canonical" href="https://snhijabs.com/store-locator"> 55 <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1"> 56 <meta name="theme-color" content="#000000"> 57 58
58<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" type="text/javascript" ></script>
58 59 60 <!-- Header hook for plugins ================================================== --> 61 62<!-- ScriptTags -->
63<script>window.__st={p: "store-locator",cid: null,cem: null,cph: null,cfn: null,cln: null,cge: null,cdb: null,ccc: null};</script>
63<script src='/assets/events.js'></script>
63<script>(function(){function asyncLoad(){var urls=['/assets/traffic.js?v=1','https://apps.easystore.co/facebook-login/script.js?shop=snhijabs.easy.co&t=1760869989','https://apps.easystore.co/sales-pop/script.js?shop=snhijabs.easy.co&t=1760872678'];for(var i=0;i<urls.length;i++){var s=document.createElement('script');s.type='text/javascript';s.async=true;s.src=urls[i];var x=document.getElementsByTagName('script')[0];x.parentNode.insertBefore(s, x);}}window.attachEvent ? window.attachEvent('onload', asyncLoad) : window.addEventListener('load', asyncLoad, false);})();</script>
63 64<!-- /ScriptTags --> 65 66 67 68
68<script src="https://store-themes.easystore.co/385982/themes/295436/assets/global.js?t=1787123890" defer="defer"></script>
68 69 70 71 72
72<script> 73 (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ 74 (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), 75 m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) 76 })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); 77 78 ga('create', '', 'auto','myTracker'); 79 ga('myTracker.send', 'pageview'); 80 81 </script>
81 82 83
83<script src="/assets/storefront.js?id=1d419de2011a5572c98b" type="text/javascript" ></script>
83 84 85 86 <!-- CSS ================================================== --> 87 <style> 88 @font-face { 89 font-family: 'Playfair Display SC'; 90 font-style: normal; 91 font-weight: regular; 92 src: local('Playfair Display SC regular'), local('Playfair Display SC-regular'), url(https://fonts.gstatic.com/s/playfairdisplaysc/v10/ke85OhoaMkR6-hSn7kbHVoFf7ZfgMPr_pb4GEcM2M4s.ttf) format('truetype'); 93 } 94 95 @font-face { 96 font-family: 'Playfair Display SC'; 97 font-style: normal; 98 font-weight: regular; 99 src: local('Playfair Display SC regular'), local('Playfair Display SC-regular'), url(https://fonts.gstatic.com/s/playfairdisplaysc/v10/ke85OhoaMkR6-hSn7kbHVoFf7ZfgMPr_pb4GEcM2M4s.ttf) format('truetype'); 100 } 101 102 :root { 103 --font-body-family: 'Playfair Display SC', serif; 104 --font-body-style: normal; 105 --font-body-weight: 500; 106 107 --font-heading-family: 'Playfair Display SC', serif; 108 --font-heading-style: normal; 109 --font-heading-weight: 400; 110 111 --color-heading-text: 6,6,6; 112 --color-base-text: 6,6,6; 113 --color-base-background-1: 237,214,182; 114 --color-base-background-2: 237,214,182; 115 116 --color-base-solid-button-labels: 255,255,255; 117 --color-base-outline-button-labels: 0,0,0; 118 119 --color-base-accent-1: 0,0,0; 120 --color-base-accent-2: 0,0,0; 121 --payment-terms-background-color: 237,214,182; 122 123 --gradient-base-background-1: 237,214,182; 124 --gradient-base-background-2: 237,214,182; 125 --gradient-base-accent-1: 0,0,0; 126 --gradient-base-accent-2: 0,0,0; 127 128 --page-width: 145rem; 129 } 130 131 *, 132 *::before, 133 *::after { 134 box-sizing: inherit; 135 } 136 137 html { 138 box-sizing: border-box; 139 font-size: 62.5%; 140 height: 100%; 141 } 142 143 body { 144 display: grid; 145 grid-template-rows: auto auto 1fr auto; 146 grid-template-columns: 100%; 147 min-height: 100%; 148 margin: 0; 149 font-size: 1.5rem; 150 letter-spacing: 0.06rem; 151 line-height: 1.8; 152 font-family: var(--font-body-family); 153 font-style: var(--font-body-style); 154 font-weight: var(--font-body-weight); 155 156 } 157 158 @media screen and (min-width: 750px) { 159 body { 160 font-size: 1.6rem; 161 } 162 } 163 </style> 164 165 <link href="https://store-themes.easystore.co/385982/themes/295436/assets/base.css?t=1787123890" rel="stylesheet" type="text/css" media="screen" /> 166 167 168 169 170
170<script>document.documentElement.className = document.documentElement.className.replace('no-js', 'js');</script>
170 171
171<script type="application/ld+json"> 172 {"@context":"https://schema.org/","@graph":[{"@type":"WebSite","@id":"https://snhijabs.com#website","name":"SAUQAH","url":"https://snhijabs.com","potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://snhijabs.com/search?q={search_term_string}"},"query-input":"required name=search_term_string"},"publisher":{"@id":"https://snhijabs.com#organization"}},{"@type":"Organization","@id":"https://snhijabs.com#organization","name":"SAUQAH","url":"https://snhijabs.com","logo":{"@type":"ImageObject","url":"https://cdn.store-assets.com/s/385982/f/17617488.png?width=350\u0026format=webp"}}]} 173 </script>
173 174</head> 175 176<body id="store-locator" class="template-store-locator" > 177 178 179<!-- Snippet:global/body_start: Announcement Bar --> 180<link rel="stylesheet" href="https://apps.easystore.co/assets/css/annoucement-bar/marquee.css?v1.04"> 181 182<div id="announcement-bar" name="announcement-bar" style=" 183 border: unset; 184 padding: 6px 0px; 185 margin: 0px; 186 z-index:2999; 187 background:rgb(224, 9, 10); 188 color:rgb(255, 255, 255); 189 position: -webkit-sticky; position: sticky; top: 0; 190"> 191 192 <input type="hidden" id="total_announcement_left" name="total_announcement_left" value="1"> 193 <input type="hidden" id="locale" name="locale" value="en_US"> 194 195 <div class="app_marquee-wrapper" style=" 196 padding: 4px 0px; 197 border-top: 1px dashed; 198 border-bottom: 1px dashed; 199 border-color: rgb(255, 255, 255); 200 "> 201 <div class="app_marquee-container"> 202 <div id="announcement_bar_0" class="announcement_bar_0 announcement_bar-content"> 203 <span class="marquee-msg">POTONGAN % UNTUK PEMBELIAN PERTAMA</span> 204 <input type="hidden" id="expired_at_0" name="expired_at_0" value="2025-09-10 00:00"> 205 </div> 206 </div> 207 208 <span id="announcement-close-button" name="announcement-close-button" class="announcement-close-button" style="color: rgb(31, 15, 15); background: rgb(230, 10, 10);"> 209 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" width="20" height="20" stroke-width="2"> 210 <path d="M18 6l-12 12"></path> 211 <path d="M6 6l12 12"></path> 212 </svg> 213 </span> 214 </div> 215</div> 216 217 218
219<script> 220 var is_top_enabled = 1; 221 if (is_top_enabled) { 222 // Prevent announcement bar block header 223 setTimeout(() => { 224 let header = document.querySelector('#easystore-section-header'); 225 let topbar = document.querySelector('.sticky-topbar'); 226 let announcementBar = document.querySelector('#announcement-bar'); 227 228 if (announcementBar) { 229 let height = announcementBar.offsetHeight + 'px'; 230 if (header) header.style.top = height; 231 if (topbar) topbar.style.top = height; 232 } 233 }, 2000); 234 } 235 236 setInterval(function () { 237 let total_announcement = parseInt("1", 10); 238 let total_announcement_left = parseInt(document.querySelector("#total_announcement_left").value, 10); 239 240 for (let i = 0; i <= total_announcement; i++) { 241 let startDate = new Date(); 242 let endDateStr = document.querySelector(`#expired_at_${i}`)?.value; 243 let endDate = endDateStr ? new Date(endDateStr.replace(/-/g, "/")) : new Date(); 244 let seconds = (endDate.getTime() - startDate.getTime()) / 1000; 245 246 let days = Math.floor(seconds / 86400); 247 let hours = Math.floor((seconds % 86400) / 3600); 248 let mins = Math.floor((seconds % 3600) / 60); 249 let secs = Math.floor(seconds % 60); 250 251 function translate(key, locale, values = 1) { 252 if (locale === "zh_TW") { 253 let translations = { 254 day: "天", 255 hour: "å°æ", 256 min: "åé", 257 sec: "ç§" 258 }; 259 return translations[key] || key; 260 } else { 261 let singularPlural = { day: "Day", hour: "Hour", min: "Min", sec: "Sec" }; 262 let plural = { day: "Days", hour: "Hours", min: "Mins", sec: "Secs" }; 263 if (key in singularPlural) { 264 return values > 1 ? plural[key] : singularPlural[key]; 265 } 266 return key; 267 } 268 } 269 270 271 let countdownElement = document.querySelector(`#announcementBar_countdown_${i}`); 272 if (countdownElement && seconds > 0) { 273 let locale = document.querySelector("#locale")?.value || "en"; 274 let countdownItems = document.querySelectorAll(`.announcementBar_countdown_${i}`); 275 countdownItems.forEach(item => { 276 item.style.display = ''; 277 item.innerHTML = ` 278 <div> 279 <span>${days}</span> <small>${translate('day', locale, days)}</small> 280 </div> 281 <div> 282 <span>${hours}</span> <small>${translate('hour', locale, hours)}</small> 283 </div> 284 <div> 285 <span>${mins}</span> <small>${translate('min', locale, mins)}</small> 286 </div> 287 <div> 288 <span>${secs}</span> <small>${translate('sec', locale, secs)}</small> 289 </div> 290 `; 291 }); 292 } else if (countdownElement && seconds <= 0) { 293 let bar = document.querySelector(`#announcement_bar_${i}`); 294 if (bar) bar.remove(); 295 total_announcement_left -= 1; 296 document.querySelector("#total_announcement_left").value = total_announcement_left; 297 } 298 } 299 300 showOrHide(total_announcement_left); 301 }, 1000); 302 303 function showOrHide(total_announcement_left) { 304 let prevButton = document.querySelector("#previous-announcement-bar-button"); 305 let nextButton = document.querySelector("#next-announcement-bar-button"); 306 let closeButton = document.querySelector("#announcement-close-button"); 307 let announcementBar = document.querySelector("#announcement-bar"); 308 let announcementBarTop = document.querySelector("#announcement-bar-top"); 309 let header = document.querySelector("#easystore-section-header"); 310 let topbar = document.querySelector(".sticky-topbar"); 311 312 if (total_announcement_left <= 1) { 313 if (prevButton) prevButton.style.display = 'none'; 314 if (nextButton) nextButton.style.display = 'none'; 315 } else { 316 if (prevButton) prevButton.style.display = 'block'; 317 if (nextButton) nextButton.style.display = 'block'; 318 } 319 320 if (total_announcement_left === 0) { 321 if (closeButton) closeButton.style.display = 'none'; 322 if (announcementBar) announcementBar.style.display = 'none'; 323 if (announcementBarTop) announcementBarTop.style.display = 'none'; 324 if (header) header.style.top = '0px'; 325 if (topbar) topbar.style.top = '0px'; 326 } 327 } 328 329 let closeButton = document.querySelector("#announcement-close-button"); 330 if (closeButton) { 331 closeButton.addEventListener('click', () => { 332 let announcementBar = document.querySelector("#announcement-bar"); 333 let announcementBarTop = document.querySelector("#announcement-bar-top"); 334 let header = document.querySelector("#easystore-section-header"); 335 let topbar = document.querySelector(".sticky-topbar"); 336 337 if (announcementBar) announcementBar.style.display = 'none'; 338 if (announcementBarTop) announcementBarTop.style.display = 'none'; 339 if (header) header.style.top = ''; 340 if (topbar) topbar.style.top = ''; 341 }); 342 } 343 344</script>
344 345 346
347<script> 348 (function initializeMarquee() { 349 const marqueeWrapper = document.querySelector(`#announcement-bar .app_marquee-wrapper`); 350 const marqueeContainer = document.querySelector(`#announcement-bar .app_marquee-container`); 351 352 if (!marqueeWrapper || !marqueeContainer) return; 353 354 const children = Array.from(marqueeContainer.children); 355 356 // Calculate the total width of children 357 let totalWidth = children.reduce((acc, child) => acc + child.offsetWidth, 0); 358 const screenWidth = window.innerWidth; 359 360 // Clone children until the total width exceeds the screen width 361 if(totalWidth > 5){ 362 while (totalWidth < screenWidth * 3) { 363 children.forEach(child => { 364 const clone = child.cloneNode(true); 365 marqueeContainer.appendChild(clone); 366 totalWidth += clone.offsetWidth; 367 }); 368 } 369 } 370 371 // Clone the marquee container 372 const clonedContainer = marqueeContainer.cloneNode(true); 373 marqueeWrapper.appendChild(clonedContainer); 374 })(); 375</script>
375 376 377<!-- /Snippet --> 378 379<!-- Snippet:global/body_start: Console Extension --> 380<div id='es_console' style='display: none;'>385982</div> 381<!-- /Snippet --> 382 383 384 <style> 385 header { 386 --logo-width: 120px; 387 } 388 .header-wrapper, 389 .header-wrapper .list-menu--disclosure, 390 .header-wrapper .search-modal{ 391 background-color: #EDD6B6; 392 } 393 .header-wrapper .search-modal .field__input{ 394 background-color: rgb(var(--color-background)); 395 } 396 .header-wrapper summary .icon-caret, 397 .header-wrapper .header__menu-item a, 398 .header-wrapper .list-menu__item, 399 .header-wrapper .link--text{ 400 color: #0e0d0d; 401 } 402 403 .search-modal__form{ 404 position: relative; 405 } 406 407 .dropdown { 408 display: none; 409 position: absolute; 410 top: 100%; 411 left: 0; 412 width: 100%; 413 padding: 5px 0; 414 background-color: #fff; 415 color:#000; 416 z-index: 1000; 417 border-bottom-left-radius: 15px; 418 border-bottom-right-radius: 15px; 419 border: 1px solid rgba(var(--color-foreground), 1); 420 border-top: none; 421 overflow-x: hidden; 422 overflow-y: auto; 423 max-height: 350px; 424 } 425 426 .dropdown-item { 427 padding: 0.4rem 2rem; 428 cursor: pointer; 429 line-height: 1.4; 430 overflow: hidden; 431 text-overflow: ellipsis; 432 white-space: nowrap; 433 } 434 435 .dropdown-item:hover{ 436 background-color: #f3f3f3; 437 } 438 439 .search__input.is-focus{ 440 border-radius: 15px; 441 border-bottom-left-radius: 0; 442 border-bottom-right-radius: 0; 443 border: 1px solid rgba(var(--color-foreground), 1); 444 border-bottom: none; 445 box-shadow: none; 446 } 447 448 .clear-all { 449 text-align: right; 450 padding: 0 2rem 0.2rem; 451 line-height: 1; 452 font-size: 70%; 453 margin-bottom: -2px; 454 } 455 456 .clear-all:hover{ 457 background-color: #fff; 458 } 459 460 .search-input-focus .easystore-section-header-hidden{ 461 transform: none; 462 } 463 .referral-notification { 464 position: absolute; 465 top: 100%; 466 right: 0; 467 background: white; 468 border: 1px solid #e0e0e0; 469 border-radius: 8px; 470 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 471 width: 280px; 472 z-index: 1000; 473 padding: 16px; 474 margin-top: 8px; 475 font-size: 14px; 476 line-height: 1.4; 477 } 478 479 .referral-notification::before { 480 content: ''; 481 position: absolute; 482 top: -8px; 483 right: 20px; 484 width: 0; 485 height: 0; 486 border-left: 8px solid transparent; 487 border-right: 8px solid transparent; 488 border-bottom: 8px solid white; 489 } 490 491 .referral-notification::after { 492 content: ''; 493 position: absolute; 494 top: -9px; 495 right: 20px; 496 width: 0; 497 height: 0; 498 border-left: 8px solid transparent; 499 border-right: 8px solid transparent; 500 border-bottom: 8px solid #e0e0e0; 501 } 502 503 .referral-notification h4 { 504 margin: 0 0 8px 0; 505 color: #2196F3; 506 font-size: 16px; 507 font-weight: 600; 508 } 509 510 .referral-notification p { 511 margin: 0 0 12px 0; 512 color: #666; 513 } 514 515 .referral-notification .referral-code { 516 background: #f5f5f5; 517 padding: 8px; 518 border-radius: 4px; 519 font-family: monospace; 520 font-size: 13px; 521 text-align: center; 522 margin: 8px 0; 523 border: 1px solid #ddd; 524 } 525 526 .referral-notification .close-btn { 527 position: absolute; 528 top: 8px; 529 right: 8px; 530 background: none; 531 border: none; 532 font-size: 18px; 533 color: #999; 534 cursor: pointer; 535 padding: 0; 536 width: 20px; 537 height: 20px; 538 line-height: 1; 539 } 540 541 .referral-notification .close-btn:hover { 542 color: #333; 543 } 544 545 .referral-notification .action-btn { 546 background: #2196F3; 547 color: white; 548 border: none; 549 padding: 8px 16px; 550 border-radius: 4px; 551 cursor: pointer; 552 font-size: 12px; 553 margin-right: 8px; 554 margin-top: 8px; 555 } 556 557 .referral-notification .action-btn:hover { 558 background: #1976D2; 559 } 560 561 .referral-notification .dismiss-btn { 562 background: transparent; 563 color: #666; 564 border: 1px solid #ddd; 565 padding: 8px 16px; 566 border-radius: 4px; 567 cursor: pointer; 568 font-size: 12px; 569 margin-top: 8px; 570 } 571 572 .referral-notification .dismiss-btn:hover { 573 background: #f5f5f5; 574 } 575 .referral-modal__dialog { 576 transform: translate(-50%, 0); 577 transition: transform var(--duration-default) ease, visibility 0s; 578 z-index: 10000; 579 position: fixed; 580 top: 20vh; 581 left: 50%; 582 width: 100%; 583 max-width: 350px; 584 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); 585 border-radius: 12px; 586 background-color: #fff; 587 color: #000; 588 padding: 20px; 589 text-align: center; 590 } 591 592 .modal-overlay.referral-modal-overlay { 593 position: fixed; 594 top: 0; 595 left: 0; 596 width: 100%; 597 height: 100%; 598 background-color: rgba(0, 0, 0, 0.7); 599 z-index: 2001; 600 display: block; 601 opacity: 1; 602 transition: opacity var(--duration-default) ease, visibility 0s; 603 } 604 .header__search-input .field__label, 605 .header__search-input .field__button, 606 .header__search-input .field__input{ 607 color: #0e0d0d; 608 } 609 .header__search-input .field__input { 610 color: #0e0d0d; 611 box-shadow: 0 0 0 0.1rem #0e0d0d, inset 0 2px 3px rgba(0, 0, 0, 0.05); 612 } 613</style> 614 615<link href="https://store-themes.easystore.co/385982/themes/295436/assets/section-header.css?t=1787123890" rel="stylesheet" type="text/css" media="screen" /> 616<link href="https://store-themes.easystore.co/385982/themes/295436/assets/component-list-menu.css?t=1787123890" rel="stylesheet" type="text/css" media="screen" /> 617<link href="https://store-themes.easystore.co/385982/themes/295436/assets/component-menu-drawer.css?t=1787123890" rel="stylesheet" type="text/css" media="screen" /> 618<link href="https://store-themes.easystore.co/385982/themes/295436/assets/component-cart-notification.css?v1.1?t=1787123890" rel="stylesheet" type="text/css" media="screen" /> 619
620<script src="https://store-themes.easystore.co/385982/themes/295436/assets/cart-notification.js?t=1787123890" defer="defer"></script>
vendor: 1 bytes, line 620
620
621<script src="https://store-themes.easystore.co/385982/themes/295436/assets/details-modal.js?t=1787123890" defer="defer"></script>
621 622 623<svg xmlns="http://www.w3.org/2000/svg" class="hidden"> 624 <symbol id="icon-search" viewbox="0 0 18 19" fill="none"> 625 <path fill-rule="evenodd" clip-rule="evenodd" d="M11.03 11.68A5.784 5.784 0 112.85 3.5a5.784 5.784 0 018.18 8.18zm.26 1.12a6.78 6.78 0 11.72-.7l5.4 5.4a.5.5 0 11-.71.7l-5.41-5.4z" fill="currentColor"/> 626 </symbol> 627 628 <symbol id="icon-close" class="icon icon-close" fill="none" viewBox="0 0 18 17"> 629 <path d="M.865 15.978a.5.5 0 00.707.707l7.433-7.431 7.579 7.282a.501.501 0 00.846-.37.5.5 0 00-.153-.351L9.712 8.546l7.417-7.416a.5.5 0 10-.707-.708L8.991 7.853 1.413.573a.5.5 0 10-.693.72l7.563 7.268-7.418 7.417z" fill="currentColor"> 630 </symbol> 631</svg> 632 633 634<div id="easystore-section-header"> 635 <sticky-header class="header-wrapper header-wrapper--border-bottom"> 636 <header class="header header--middle-left page-width header--has-menu" itemscope itemtype="http://schema.org/Organization"> 637 <header-drawer data-breakpoint="tablet"> 638 <details class="menu-drawer-container menu-opening"> 639 <summary class="header__icon header__icon--menu header__icon--summary link link--text focus-inset" aria-label="Menu" role="button" aria-expanded="true" aria-controls="menu-drawer"> 640 <span> 641 642 643 644 <svg class="icon icon-hamburger " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M32.5,65h535a25,25,0,0,0,0-50H32.5a25,25,0,0,0,0,50Z" fill="currentColor"/><path d="M567.5,275H32.5a25,25,0,0,0,0,50h535a25,25,0,0,0,0-50Z" fill="currentColor"/><path d="M567.5,535H32.5a25,25,0,0,0,0,50h535a25,25,0,0,0,0-50Z" fill="currentColor"/></svg> 645 646 647 648 649 650 651 <svg class="icon icon-close " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M335.36,300,581.87,53.48a25,25,0,0,0-35.35-35.35L300,264.64,53.48,18.13A25,25,0,0,0,18.13,53.48L264.64,300,18.13,546.52a25,25,0,0,0,35.35,35.35L300,335.36,546.52,581.87a25,25,0,0,0,35.35-35.35Z" fill="currentColor"/></svg> 652 653 654 655 </span> 656 </summary> 657 <div id="menu-drawer" class="menu-drawer motion-reduce" tabindex="-1"> 658 <div class="menu-drawer__inner-container"> 659 <div class="menu-drawer__navigation-container"> 660 <nav class="menu-drawer__navigation"> 661 <ul class="menu-drawer__menu list-menu" role="list"> 662 663 664 665 <li> 666 <a href="/" class="menu-drawer__menu-item list-menu__item link link--text focus-inset"> 667 Home 668 </a> 669 </li> 670 671 672 673 674 675 <li> 676 <details> 677 <summary class="menu-drawer__menu-item list-menu__item link link--text focus-inset" role="button" aria-expanded="false" aria-controls="link-Bags"> 678 <a href="/collections/all" class="link--text list-menu__item menu-drawer__menu-item"> 679 Catalog 680 </a> 681 682 683 684 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 685 686 687 688 689 690 691 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 692 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 693 </svg> 694 695 696 697 </summary> 698 <div class="menu-drawer__submenu motion-reduce" tabindex="-1"> 699 <div class="menu-drawer__inner-submenu"> 700 <button class="menu-drawer__close-button link link--text focus-inset" aria-expanded="true"> 701 702 703 704 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 705 706 707 708 Catalog 709 </button> 710 <ul class="menu-drawer__menu list-menu" role="list" tabindex="-1"> 711 712 713 714 <li> 715 <a href="/collections/tudung-sarung-plain" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 716 TUDUNG SARUNG PLAIN 717 </a> 718 </li> 719 720 721 722 723 <li> 724 <a href="/collections/syria-tali-size-m" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 725 SYRIA TALI SIZE M 726 </a> 727 </li> 728 729 730 731 732 <li> 733 <a href="/collections/cute-hijabs-ch-coming-soon" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 734 CUTE HIJABS ( CH ) 735 </a> 736 </li> 737 738 739 740 741 <li> 742 <a href="/collections/inner-basic" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 743 INNER BASIC 744 </a> 745 </li> 746 747 748 749 750 751 <li> 752 <details> 753 <summary class="menu-drawer__menu-item list-menu__item link link--text focus-inset" role="button" aria-expanded="false" aria-controls="link-Bags"> 754 <a href="/collections/snowcap-ninja" class="link--text list-menu__item menu-drawer__menu-item"> 755 SNOWCAP / NINJA 756 </a> 757 758 759 760 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 761 762 763 764 765 766 767 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 768 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 769 </svg> 770 771 772 773 </summary> 774 <div class="menu-drawer__submenu motion-reduce" tabindex="-1"> 775 <div class="menu-drawer__inner-submenu"> 776 <button class="menu-drawer__close-button link link--text focus-inset" aria-expanded="true"> 777 778 779 780 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 781 782 783 784 SNOWCAP / NINJA 785 </button> 786 <ul class="menu-drawer__menu list-menu" role="list" tabindex="-1"> 787 788 789 790 <li> 791 <a href="/collections/inner-syria" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 792 INNER
792SYRIA 793 </a> 794 </li> 795 796 797 798 799 <li> 800 <a href="/collections/inner-budak" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 801 INNER BUDAK 802 </a> 803 </li> 804 805 806 807 808 <li> 809 <a href="/collections/inner-neck" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 810 INNER NECK 811 </a> 812 </li> 813 814 815 816 </ul> 817 </div> 818 </div> 819 </details> 820 </li> 821 822 823 824 825 <li> 826 <a href="/collections/ts-bawal-baby" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 827 TS BAWAL BABY 828 </a> 829 </li> 830 831 832 833 834 <li> 835 <a href="/collections/tsp-loose-curve" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 836 LCP LOOSE CURVE SIZE M 837 </a> 838 </li> 839 840 841 842 843 <li> 844 <a href="/collections/tsp-loose-curve-size-xxl" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 845 LCP LOOSE CURVE SIZE XXL 846 </a> 847 </li> 848 849 850 851 852 <li> 853 <a href="/collections/tsp-syria-cey" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 854 SYRIA CEY SIZE M 855 </a> 856 </li> 857 858 859 860 861 <li> 862 <a href="/collections/tsp-bawal-basic" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 863 TSP BAWAL SIZE M 864 </a> 865 </li> 866 867 868 869 870 <li> 871 <a href="/collections/tsp-slim-1" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 872 TUDUNG SARUNG SLIM SIZE L 873 </a> 874 </li> 875 876 877 878 879 <li> 880 <a href="/collections/tsp-corak" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 881 TSP CORAK DEWASA (S/M) 882 </a> 883 </li> 884 885 886 887 888 <li> 889 <a href="/collections/tsp-budak-corak" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 890 TSP BUDAK CORAK 6 -10 TAHUN 891 </a> 892 </li> 893 894 895 896 897 <li> 898 <a href="/collections/sarung-shifa-size-m-by-sn-hijabs" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 899 SARUNG SHIFA SIZE M 900 </a> 901 </li> 902 903 904 905 906 <li> 907 <a href="/collections/tsp-ayra-crepe-size-m-by-sn-hijabs" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 908 TSP AYRA CREPE SIZE M 909 </a> 910 </li> 911 912 913 914 915 <li> 916 <a href="/collections/anaqah-hijabs-budak-6-10-tahun" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 917 ANAQAH HIJABS BUDAK 6-10 TAHUN 918 </a> 919 </li> 920 921 922 923 924 <li> 925 <a href="/collections/anaqah-hijabs-1" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 926 ANAQAH HIJABS SIZE L 927 </a> 928 </li> 929 930 931 932 933 <li> 934 <a href="/collections/khimar" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 935 KHIMAR BERTALI 936 </a> 937 </li> 938 939 940 941 942 <li> 943 <a href="/collections/tudung-reject-2" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 944 TUDUNG REJECT 945 </a> 946 </li> 947 948 949 950 951 <li> 952 <a href="/collections/tudung-sekolah" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 953 TUDUNG SEKOLAH 954 </a> 955 </li> 956 957 958 959 960 <li> 961 <a href="/collections/bawal-corak-bidang-45" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 962 BAWAL CORAK BIDANG 45 963 </a> 964 </li> 965 966 967 968 969 <li> 970 <a href="/collections/tudung-nurse" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 971 TUDUNG NURSE 972 </a> 973 </li> 974 975 976 977 978 <li> 979 <a href="/collections/purdah-niqab" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 980 PURDAH / NIQAB 981 </a> 982 </li> 983 984 985 986 987 <li> 988 <a href="/collections/handsock-dewasa-ruffle" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 989 HANDSOCK DEWASA (RUFFLE) 990 </a> 991 </li> 992 993 994 995 996 <li> 997 <a href="/collections/handsock-cuff" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 998 HANDSOCK CUFF 999 </a> 1000 </li> 1001 1002 1003 1004 1005 <li> 1006 <a href="/collections/handsock-dewasa" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1007 HANDSOCK DEWASA 1008 </a> 1009 </li> 1010 1011 1012 1013 1014 <li> 1015 <a href="/collections/handsock-budak" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1016 HANDSOCK BUDAK 1017 </a> 1018 </li> 1019 1020 1021 1022 1023 <li> 1024 <a href="/collections/handsock-aisyah" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1025 HANDSOCK AISYAH 1026 </a> 1027 </li> 1028 1029 1030 1031 1032 1033 <li> 1034 <details> 1035 <summary class="menu-drawer__menu-item list-menu__item link link--text focus-inset" role="button" aria-expanded="false" aria-controls="link-Bags"> 1036 <a href="/collections/jubah-kanak2" class="link--text list-menu__item menu-drawer__menu-item"> 1037 JUBAH KANAK-KANAK 1038 </a> 1039 1040 1041 1042 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 1043 1044 1045 1046 1047 1048 1049 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 1050 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 1051 </svg> 1052 1053 1054 1055 </summary> 1056 <div class="menu-drawer__submenu motion-reduce" tabindex="-1"> 1057 <div class="menu-drawer__inner-submenu"> 1058 <button class="menu-drawer__close-button link link--text focus-inset" aria-expanded="true"> 1059 1060 1061 1062 <svg class="icon icon-arrow " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 339.56"><path d="M31.06,196.67H504l-88.56,88.56a26.89,26
1062.89,0,1,0,38,38L588,188.79a26.89,26.89,0,0,0,0-38L453.49,16.29a26.89,26.89,0,0,0-38,38L504,142.88H31.06a26.9,26.9,0,0,0,0,53.79Z" fill="currentColor"/></svg> 1063 1064 1065 1066 JUBAH KANAK-KANAK 1067 </button> 1068 <ul class="menu-drawer__menu list-menu" role="list" tabindex="-1"> 1069 1070 1071 1072 <li> 1073 <a href="/collections/jubah-cey-3-4-tahun" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1074 JUBAH CEY 3-4 TAHUN 1075 </a> 1076 </li> 1077 1078 1079 1080 1081 <li> 1082 <a href="/collections/jubah-cey-6-10-tahun" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1083 JUBAH CEY 6-10 TAHUN 1084 </a> 1085 </li> 1086 1087 1088 1089 </ul> 1090 </div> 1091 </div> 1092 </details> 1093 </li> 1094 1095 1096 1097 1098 <li> 1099 <a href="/collections/blouse-zehra" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1100 BLOUSE ZEHRA 1101 </a> 1102 </li> 1103 1104 1105 1106 1107 <li> 1108 <a href="/collections/baggy-stripe-freesize-by-snhijabs" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1109 BAGGY STRIPE FREESIZE BY SNHIJABS 1110 </a> 1111 </li> 1112 1113 1114 1115 1116 <li> 1117 <a href="/collections/tunik-zara-square" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1118 TUNIK ZARA SQUARE 1119 </a> 1120 </li> 1121 1122 1123 1124 1125 <li> 1126 <a href="/collections/abaya" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1127 ABAYA 1128 </a> 1129 </li> 1130 1131 1132 1133 1134 <li> 1135 <a href="/collections/minyak-wangi" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1136 MINYAK WANGI 1137 </a> 1138 </li> 1139 1140 1141 1142 1143 <li> 1144 <a href="/collections/add-on" class="menu-drawer__menu-item link link--text list-menu__item focus-inset"> 1145 ADD ON 1146 </a> 1147 </li> 1148 1149 1150 1151 </ul> 1152 </div> 1153 </div> 1154 </details> 1155 </li> 1156 1157 1158 1159 1160 <li> 1161 <a href="/store-locator" class="menu-drawer__menu-item list-menu__item link link--text focus-inset"> 1162 Lokasi 1163 </a> 1164 </li> 1165 1166 1167 1168 1169 <li> 1170 <a href="https://wa.link/4fj3vc" target="_blank" class="menu-drawer__menu-item list-menu__item link link--text focus-inset"> 1171 Daftar MEMBER 1172 </a> 1173 </li> 1174 1175 1176 </ul> 1177 </nav> 1178 1179 <div class="menu-drawer__utility-links"> 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 <a href="/account/login" class="menu-drawer__account link link--text focus-inset h5"> 1191 1192 1193 1194 <svg class="icon icon-account " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M300,296.19c-70.7,0-137.11,28.74-187,80.93-49.59,51.87-76.9,120.77-76.9,194v25H563.89v-25c0-73.22-27.31-142.12-76.9-194C437.11,324.93,370.7,296.19,300,296.19ZM87.42,546.11C99.29,433.81,190.1,346.19,300,346.19s200.71,87.62,212.58,199.92Z" fill="currentColor"/><path d="M300,285.34c77.6,0,140.73-63.13,140.73-140.73S377.6,3.89,300,3.89,159.27,67,159.27,144.61,222.4,285.34,300,285.34Zm0-231.45a90.73,90.73,0,1,1-90.73,90.72A90.82,90.82,0,0,1,300,53.89Z" fill="currentColor"/></svg> 1195 1196 1197 1198 1199 SN HIJABS HQ 1200 </a> 1201 1202 <a href="/account/register" class="menu-drawer__account link link--text focus-inset h5"> 1203 1204 1205 1206 1207 <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" role="presentation" class="icon icon-plus " fill="none" viewBox="0 0 10 10"> 1208 <path fill-rule="evenodd" clip-rule="evenodd" d="M1 4.51a.5.5 0 000 1h3.5l.01 3.5a.5.5 0 001-.01V5.5l3.5-.01a.5.5 0 00-.01-1H5.5L5.49.99a.5.5 0 00-1 .01v3.5l-3.5.01H1z" fill="currentColor"></path> 1209 </svg> 1210 1211 1212 1213 SEJATI WALK SANDAKAN 1214 </a> 1215 1216 1217 1218 </div> 1219 </div> 1220 </div> 1221 </div> 1222 </details> 1223 </header-drawer> 1224 1225 1226 <a href="/" class="header__heading-link link link--text focus-inset" itemprop="url"> 1227 <img src="https://cdn.store-assets.com/s/385982/f/17617488.png" class="header__heading-logo" alt="SAUQAH " loading="lazy" itemprop="logo"> 1228 </a> 1229 1230 1231 1232 <div class="header__search-input" tabindex="-1"> 1233 <form action="/search" method="get" role="search" class="search search-modal__form"> 1234 <div class="field"> 1235 <input class="search__input field__input" 1236 id="Search-In-Modal" 1237 type="search" 1238 name="q" 1239 value="" 1240 placeholder="Cari" 1241 autocomplete="off" 1242 > 1243 <label class="field__label" for="Search-In-Modal">Cari</label> 1244 <div class="dropdown" id="searchDropdown"></div> 1245 <input type="hidden" name="search_history" class="hidden_search_history"> 1246 <input type="hidden" name="options[prefix]" value="last"> 1247 <button class="search__button field__button" aria-label="Cari"> 1248 <svg class="icon icon-search" aria-hidden="true" focusable="false" role="presentation"> 1249 <use href="#icon-search"> 1250 </svg> 1251 </button> 1252 </div> 1253 </form> 1254 </div> 1255 1256 1257 <nav class="header__inline-menu"> 1258 <ul class="list-menu list-menu--inline" role="list"> 1259 1260 1261 1262 <li> 1263 <a href="/" class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 1264 Home 1265 </a> 1266 </li> 1267 1268 1269 1270 1271 1272 <li> 1273 <details-disclosure> 1274 <details> 1275 <summary class="header__menu-item list-menu__item link focus-inset"> 1276 <a href="/collections/all" >Catalog</a> 1277 1278 1279 1280 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret " viewBox="0 0 10 6"> 1281 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 1282 </svg> 1283 1284 1285 1286 </summary> 1287 <ul class="header__submenu list-menu list-menu--disclosure caption-large motion-reduce" role="list" tabindex="-1"> 1288 1289 1290 1291 1292 1293 <li> 1294 <a href="/collections/tudung-sarung-plain" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1295 TUDUNG SARUNG PLAIN 1296 </a> 1297 </li> 1298 1299 1300 1301 1302 1303 <li> 1304 <a href="/collections/syria-tali-size-m" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1305 SYRIA TALI SIZE M 1306 </a> 1307 </li> 1308 1309 1310 1311 1312 1313 <li> 1314 <a href="/collections/cute-hijabs-ch-coming-soon" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1315 CUTE HIJABS ( CH ) 1316 </a> 1317 </li> 1318 1319 1320 1321 1322 1323 <li> 1324 <a href="/collections/inner-basic" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1325 INNER BASIC 1326 </a> 1327 </li> 1328 1329 1330 1331 1332 1333 <li> 1334 <details-disclosure> 1335 <details> 1336 <summary class="header__menu-item link link--text list-menu__item focus-inset caption-large"> 1337 <a href="/collections/snowcap-ninja" >SNOWCAP / NINJA</a> 1338 1339 1340 1341 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret rotate-90" viewBox="0 0 10 6"> 1342 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 1343 </svg> 1344 1345 1346 1347 </summary> 1348 <ul class="header__submenu list-menu list-menu--disclosure motion-reduce"> 1349 1350 1351 1352 <li> 1353 <a href="/collections/inner-syria" class="header__menu-item list-menu__item link link--text focus-inset caption-large">INNER SYRIA</a> 1354 </li> 1355 1356 1357 1358 1359 <li> 1360 <a href="/collections/inner-budak" class="header__menu-item list-menu__item link link--text focus-inset caption-large">INNER BUDAK</a> 1361 </li> 1362 1363 1364 1365 1366 <li> 1367 <a href="/collections/inner-neck" class="header__menu-item list-menu__item link link--text focus-inset caption-large">INNER NECK</a> 1368 </li> 1369 1370 1371 </ul> 1372 </details> 1373 </details-disclosure> 1374 </li> 1375 1376 1377 1378 1379 1380 1381 <li> 1382 <a href="/collections/ts-bawal-baby" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1383 TS BAWAL BABY 1384 </a> 1385 </li> 1386 1387 1388 1389 1390 1391 <li> 1392 <a href="/collections/tsp-loose-curve" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1393 LCP LOOSE CURVE SIZE M 1394 </a> 1395 </li> 1396 1397 1398 1399 1400 1401 <li> 1402 <a href="/collections/tsp-loose-curve-size-xxl" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1403 LCP LOOSE CURVE SIZE XXL 1404 </a> 1405 </li> 1406 1407
1407 1408 1409 1410 1411 <li> 1412 <a href="/collections/tsp-syria-cey" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1413 SYRIA CEY SIZE M 1414 </a> 1415 </li> 1416 1417 1418 1419 1420 1421 <li> 1422 <a href="/collections/tsp-bawal-basic" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1423 TSP BAWAL SIZE M 1424 </a> 1425 </li> 1426 1427 1428 1429 1430 1431 <li> 1432 <a href="/collections/tsp-slim-1" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1433 TUDUNG SARUNG SLIM SIZE L 1434 </a> 1435 </li> 1436 1437 1438 1439 1440 1441 <li> 1442 <a href="/collections/tsp-corak" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1443 TSP CORAK DEWASA (S/M) 1444 </a> 1445 </li> 1446 1447 1448 1449 1450 1451 <li> 1452 <a href="/collections/tsp-budak-corak" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1453 TSP BUDAK CORAK 6 -10 TAHUN 1454 </a> 1455 </li> 1456 1457 1458 1459 1460 1461 <li> 1462 <a href="/collections/sarung-shifa-size-m-by-sn-hijabs" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1463 SARUNG SHIFA SIZE M 1464 </a> 1465 </li> 1466 1467 1468 1469 1470 1471 <li> 1472 <a href="/collections/tsp-ayra-crepe-size-m-by-sn-hijabs" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1473 TSP AYRA CREPE SIZE M 1474 </a> 1475 </li> 1476 1477 1478 1479 1480 1481 <li> 1482 <a href="/collections/anaqah-hijabs-budak-6-10-tahun" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1483 ANAQAH HIJABS BUDAK 6-10 TAHUN 1484 </a> 1485 </li> 1486 1487 1488 1489 1490 1491 <li> 1492 <a href="/collections/anaqah-hijabs-1" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1493 ANAQAH HIJABS SIZE L 1494 </a> 1495 </li> 1496 1497 1498 1499 1500 1501 <li> 1502 <a href="/collections/khimar" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1503 KHIMAR BERTALI 1504 </a> 1505 </li> 1506 1507 1508 1509 1510 1511 <li> 1512 <a href="/collections/tudung-reject-2" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1513 TUDUNG REJECT 1514 </a> 1515 </li> 1516 1517 1518 1519 1520 1521 <li> 1522 <a href="/collections/tudung-sekolah" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1523 TUDUNG SEKOLAH 1524 </a> 1525 </li> 1526 1527 1528 1529 1530 1531 <li> 1532 <a href="/collections/bawal-corak-bidang-45" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1533 BAWAL CORAK BIDANG 45 1534 </a> 1535 </li> 1536 1537 1538 1539 1540 1541 <li> 1542 <a href="/collections/tudung-nurse" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1543 TUDUNG NURSE 1544 </a> 1545 </li> 1546 1547 1548 1549 1550 1551 <li> 1552 <a href="/collections/purdah-niqab" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1553 PURDAH / NIQAB 1554 </a> 1555 </li> 1556 1557 1558 1559 1560 1561 <li> 1562 <a href="/collections/handsock-dewasa-ruffle" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1563 HANDSOCK DEWASA (RUFFLE) 1564 </a> 1565 </li> 1566 1567 1568 1569 1570 1571 <li> 1572 <a href="/collections/handsock-cuff" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1573 HANDSOCK CUFF 1574 </a> 1575 </li> 1576 1577 1578 1579 1580 1581 <li> 1582 <a href="/collections/handsock-dewasa" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1583 HANDSOCK DEWASA 1584 </a> 1585 </li> 1586 1587 1588 1589 1590 1591 <li> 1592 <a href="/collections/handsock-budak" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1593 HANDSOCK BUDAK 1594 </a> 1595 </li> 1596 1597 1598 1599 1600 1601 <li> 1602 <a href="/collections/handsock-aisyah" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1603 HANDSOCK AISYAH 1604 </a> 1605 </li> 1606 1607 1608 1609 1610 1611 <li> 1612 <details-disclosure> 1613 <details> 1614 <summary class="header__menu-item link link--text list-menu__item focus-inset caption-large"> 1615 <a href="/collections/jubah-kanak2" >JUBAH KANAK-KANAK</a> 1616 1617 1618 1619 <svg aria-hidden="true" focusable="false" role="presentation" class="icon icon-caret rotate-90" viewBox="0 0 10 6"> 1620 <path fill-rule="evenodd" clip-rule="evenodd" d="M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z" fill="currentColor"></path> 1621 </svg> 1622 1623 1624 1625 </summary> 1626 <ul class="header__submenu list-menu list-menu--disclosure motion-reduce"> 1627 1628 1629 1630 <li> 1631 <a href="/collections/jubah-cey-3-4-tahun" class="header__menu-item list-menu__item link link--text focus-inset caption-large">JUBAH CEY 3-4 TAHUN</a> 1632 </li> 1633 1634 1635 1636 1637 <li> 1638 <a href="/collections/jubah-cey-6-10-tahun" class="header__menu-item list-menu__item link link--text focus-inset caption-large">JUBAH CEY 6-10 TAHUN </a> 1639 </li> 1640 1641 1642 </ul> 1643 </details> 1644 </details-disclosure> 1645 </li> 1646 1647 1648 1649 1650 1651 1652 <li> 1653 <a href="/collections/blouse-zehra" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1654 BLOUSE ZEHRA 1655 </a> 1656 </li> 1657 1658 1659 1660 1661 1662 <li> 1663 <a href="/collections/baggy-stripe-freesize-by-snhijabs" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1664 BAGGY STRIPE FREESIZE BY SNHIJABS 1665 </a> 1666 </li> 1667 1668 1669 1670 1671 1672 <li> 1673 <a href="/collections/tunik-zara-square" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1674 TUNIK ZARA SQUARE 1675 </a> 1676 </li> 1677 1678 1679 1680 1681 1682 <li> 1683 <a href="/collections/abaya" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1684 ABAYA 1685 </a> 1686 </li> 1687 1688 1689 1690 1691 1692 <li> 1693 <a href="/collections/minyak-wangi" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1694 MINYAK WANGI 1695 </a> 1696 </li> 1697 1698 1699 1700 1701 1702 <li> 1703 <a href="/collections/add-on" class="header__menu-item list-menu__item link link--text focus-inset caption-large"> 1704 ADD ON 1705 </a> 1706 </li> 1707 1708 1709 </ul> 1710 </details> 1711 </details-disclosure> 1712 </li> 1713 1714 1715 1716 1717 <li> 1718 <a href="/store-locator" class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 1719 Lokasi 1720 </a> 1721 </li> 1722 1723 1724 1725 1726 <li> 1727 <a href="https://wa.link/4fj3vc" target="_blank" class="header__menu-item header__menu-item list-menu__item link link--text focus-inset"> 1728 Daftar MEMBER 1729 </a> 1730 </li> 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 </ul> 1744 </nav> 1745 <div class="header__icons"> 1746 1747 1748 1749 <div class="header__icon header__icon--account link link--text focus-inset small-hide medium-hide" style="position: relative;"> 1750 <a href="/account/login" class="header__icon link link--text focus-inset p-2"> 1751 1752 1753 1754 <svg class="icon icon-account " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M300,296.19c-70.7,0-137.11,28.74-187,80.93-49.59,51.87-76.9,120.77-76.9,194v25H563.89v-25c0-73.22-27.31-142.12-76.9-194C437.11,324.93,370.7,296.19,300,296.19ZM87.42,546.11C99.29,433.81,190.1,346.19,300,346.19s200.71,87.62,212.58,199.92Z" fill="currentColor"/><path d="M300,285.34c77.6,0,140.73-63.13,140.73-140.73S377.6,3.89,300,3.89,159.27,67,159.27,144.61,222.4,285.34,300,285.34Zm0-231.45a90.73,90.73,0,1,1-90.73,90.72A90.82,90.82,0,0,1,300,53.89Z" fill="currentColor"/></svg> 1755 1756 1757
1758 <span id="my-account" class="header__link-label">Daftar masuk</span> 1759 </a> 1760 1761 <!-- Referral Notification Popup for Desktop --> 1762 <div id="referralNotification" class="referral-notification" style="display: none;"> 1763 <button class="close-btn" onclick="dismissReferralNotification()">×</button> 1764 <div style="text-align: center; margin-bottom: 16px;"> 1765 <div style="width: 100px; height: 100px; margin: 0 auto;"> 1766 <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg"> 1767 </div> 1768 </div> 1769 <p id="referralSignupMessage" style="text-align: center; font-size: 14px; color: #666; margin: 0 0 20px 0;"> 1770 Rakan anda menghadiahkan anda kredit ! Daftar sekarang untuk menebus. 1771 </p> 1772 <div style="text-align: center;"> 1773 <button class="btn" onclick="goToSignupPage()" style="width: 100%;"> 1774 Daftar Sekarang 1775 </button> 1776 </div> 1777 </div> 1778 </div> 1779 1780 1781 1782 <a href="/cart" class="header__icon link link--text focus-inset" id="cart-icon-bubble"> 1783 <span class="header__icon--cart"> 1784 1785 1786 1787 <svg class="icon icon-cart-empty " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496.56 600"><path d="M453.52,128.63a25,25,0,0,0-24.91-22.8H364.72a117.48,117.48,0,0,0-232.89,0H67.94A25,25,0,0,0,43,128.63L8.8,515.21a72.11,72.11,0,0,0,19.05,55.6,79,79,0,0,0,58.22,25.3H410.49a79,79,0,0,0,58.22-25.3,72.11,72.11,0,0,0,19.05-55.6ZM248.28,53.89a67.58,67.58,0,0,1,65.65,51.94H182.63A67.57,67.57,0,0,1,248.28,53.89ZM431.83,537.05a28.85,28.85,0,0,1-21.34,9.06H86.07a28.85,28.85,0,0,1-21.34-9.06,22.69,22.69,0,0,1-6.13-17.43L90.82,155.83h40v51.23a25,25,0,0,0,50,0V155.83h135v51.23a25,25,0,0,0,50,0V155.83h40L438,519.62A22.68,22.68,0,0,1,431.83,537.05Z" fill="currentColor"/></svg> 1788 1789 1790 1791 <div class="cart-count-bubble hidden"> 1792 <span aria-hidden="true" class="js-content-cart-count">0</span> 1793 </div> 1794 </span> 1795 <span class="header__link-label medium-hide small-hide"> 1796 Bakul 1797 </span> 1798 </a> 1799 1800 1801 1802 <!-- Referral Notification Modal for Mobile --> 1803 <details-modal class="referral-modal" id="referralMobileModal"> 1804 <details> 1805 <summary class="referral-modal__toggle" aria-haspopup="dialog" aria-label="Open referral modal" style="display: none;"> 1806 </summary> 1807 <div class="modal-overlay referral-modal-overlay"></div> 1808 <div class="referral-modal__dialog" role="dialog" aria-modal="true" aria-label="Referral notification"> 1809 <div class="referral-modal__content"> 1810 <button type="button" class="modal__close-button" aria-label="Close" onclick="closeMobileReferralModal()" style="position: absolute; top: 16px; right: 16px; background: none; border: none; font-size: 24px; cursor: pointer;"> 1811 × 1812 </button> 1813 1814 <div style="margin-bottom: 24px;"> 1815 <div style="width: 120px; height: 120px; margin: 0 auto 20px;"> 1816 <img src="https://resources.easystore.co/storefront/icons/channels/vector_referral_program.svg" style="width: 100%; height: 100%;"> 1817 </div> 1818 </div> 1819 1820 <p id="referralSignupMessageMobile" style="font-size: 16px; color: #333; margin: 0 0 30px 0; line-height: 1.5;"> 1821 Rakan anda menghadiahkan anda kredit ! Daftar sekarang untuk menebus. 1822 </p> 1823 1824 <button type="button" class="btn" onclick="goToSignupPageFromMobile()" style="width: 100%;"> 1825 Daftar Sekarang 1826 </button> 1827 </div> 1828 </div> 1829 </details> 1830 </details-modal> 1831 1832 1833 1834 </div> 1835 </header> 1836 </sticky-header> 1837 1838<cart-notification> 1839 <div class="cart-notification-wrapper page-width color-background-1"> 1840 <div id="cart-notification" class="cart-notification focus-inset" aria-modal="true" aria-label="Ditambah ke troli" role="dialog" tabindex="-1"> 1841 <div class="cart-notification__header"> 1842 <h2 class="cart-notification__heading caption-large"> 1843 1844 1845 <svg class="icon icon-checkmark color-foreground-text " aria-hidden="true" focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 9" fill="none"> 1846 <path fill-rule="evenodd" clip-rule="evenodd" d="M11.35.643a.5.5 0 01.006.707l-6.77 6.886a.5.5 0 01-.719-.006L.638 4.845a.5.5 0 11.724-.69l2.872 3.011 6.41-6.517a.5.5 0 01.707-.006h-.001z" fill="currentColor"></path> 1847 </svg> 1848 1849 1850 Ditambah ke troli</h2> 1851 <button type="button" class="cart-notification__close modal__close-button link link--text focus-inset" aria-label="accessibility.close"> 1852 1853 1854 1855 <svg class="icon icon-close " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M335.36,300,581.87,53.48a25,25,0,0,0-35.35-35.35L300,264.64,53.48,18.13A25,25,0,0,0,18.13,53.48L264.64,300,18.13,546.52a25,25,0,0,0,35.35,35.35L300,335.36,546.52,581.87a25,25,0,0,0,35.35-35.35Z" fill="currentColor"/></svg> 1856 1857 1858 1859 </button> 1860 </div> 1861 <div id="cart-notification-product" class="cart-notification-product"></div> 1862 <div class="cart-notification__links"> 1863 <a href="/cart" id="cart-notification-button" class="button button--secondary button--full-width">Bakul saya (<span class="js-content-cart-count">0</span>)</a> 1864 <form action="/cart" method="post" id="cart-notification-form"> 1865 <input type="hidden" name="_token" value="QjkuaKFhMM9UIqEw7FCb0yX9h1bAJAHWeFlj0JYq"> 1866 <input type="hidden" name="current_currency" value=""> 1867 <button class="button button--primary button--full-width" name="checkout" value="true">Checkout</button> 1868 </form> 1869 <button type="button" class="link button-label">Terus membeli-belah</button> 1870 </div> 1871 </div> 1872 </div> 1873</cart-notification> 1874<style> 1875 .cart-notification { 1876 display: none; 1877 } 1878</style>
1879<script> 1880document.getElementById('cart-notification-form').addEventListener('submit',(event)=>{ 1881 if(event.submitter) event.submitter.classList.add('loading'); 1882}) 1883 1884</script>
1884 1885 1886</div> 1887 1888
1889<script> 1890 1891 class StickyHeader extends HTMLElement { 1892 constructor() { 1893 super(); 1894 } 1895 1896 connectedCallback() { 1897 this.header = document.getElementById('easystore-section-header'); 1898 this.headerBounds = {}; 1899 this.currentScrollTop = 0; 1900 this.preventReveal = false; 1901 1902 this.onScrollHandler = this.onScroll.bind(this); 1903 this.hideHeaderOnScrollUp = () => this.preventReveal = true; 1904 1905 this.addEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp); 1906 window.addEventListener('scroll', this.onScrollHandler, false); 1907 1908 this.createObserver(); 1909 } 1910 1911 disconnectedCallback() { 1912 this.removeEventListener('preventHeaderReveal', this.hideHeaderOnScrollUp); 1913 window.removeEventListener('scroll', this.onScrollHandler); 1914 } 1915 1916 createObserver() { 1917 let observer = new IntersectionObserver((entries, observer) => { 1918 this.headerBounds = entries[0].intersectionRect; 1919 observer.disconnect(); 1920 }); 1921 1922 observer.observe(this.header); 1923 } 1924 1925 onScroll() { 1926 const scrollTop = window.pageYOffset || document.documentElement.scrollTop; 1927 1928 if (scrollTop > this.currentScrollTop && scrollTop > this.headerBounds.bottom) { 1929 requestAnimationFrame(this.hide.bind(this)); 1930 } else if (scrollTop < this.currentScrollTop && scrollTop > this.headerBounds.bottom) { 1931 if (!this.preventReveal) { 1932 requestAnimationFrame(this.reveal.bind(this)); 1933 } else { 1934 window.clearTimeout(this.isScrolling); 1935 1936 this.isScrolling = setTimeout(() => { 1937 this.preventReveal = false; 1938 }, 66); 1939 1940 requestAnimationFrame(this.hide.bind(this)); 1941 } 1942 } else if (scrollTop <= this.headerBounds.top) { 1943 requestAnimationFrame(this.reset.bind(this)); 1944 } 1945 1946 1947 this.currentScrollTop = scrollTop; 1948 } 1949 1950 hide() { 1951 this.header.classList.add('easystore-section-header-hidden', 'easystore-section-header-sticky'); 1952 this.closeMenuDisclosure(); 1953 // this.closeSearchModal(); 1954 } 1955 1956 reveal() { 1957 this.header.classList.add('easystore-section-header-sticky', 'animate'); 1958 this.header.classList.remove('easystore-section-header-hidden'); 1959 } 1960 1961 reset() { 1962 this.header.classList.remove('easystore-section-header-hidden', 'easystore-section-header-sticky', 'animate'); 1963 } 1964 1965 closeMenuDisclosure() { 1966 this.disclosures = this.disclosures || this.header.querySelectorAll('details-disclosure'); 1967 this.disclosures.forEach(disclosure => disclosure.close()); 1968 } 1969 1970 // closeSearchModal() { 1971 // this.searchModal = this.searchModal || this.header.querySelector('details-modal'); 1972 // this.searchModal.close(false); 1973 // } 1974 } 1975 1976 customElements.define('sticky-header', StickyHeader); 1977 1978 1979 class DetailsDisclosure extends HTMLElement{ 1980 constructor() { 1981 super(); 1982 this.mainDetailsToggle = this.querySelector('details'); 1983 // this.mainDetailsToggle.addEventListener('focusout', this.onFocusOut.bind(this)); 1984 this.mainDetailsToggle.addEventListener('mouseover', this.open.bind(this)); 1985 this.mainDetailsToggle.addEventListener('mouseleave', this.close.bind(this)); 1986 } 1987 1988 onFocusOut() { 1989 setTimeout(() => { 1990 if (!this.contains(document.activeElement)) this.close(); 1991 }) 1992 } 1993 1994 open() { 1995 this.mainDetailsToggle.setAttribute('open',1) 1996 } 1997 1998 close() { 1999 this.mainDetailsToggle.removeAttribute('open') 2000 } 2001 } 2002 2003 customElements.define('details-disclosure', DetailsDisclosure); 2004 2005 function clearAll() { 2006 localStorage.removeItem('searchHistory'); 2007 2008 var customer = ""; 2009 if(customer) { 2010 // Your logic to clear all data or call an endpoint 2011 fetch('/account/search_histories', { 2012 method: 'DELETE', 2013 headers: { 2014 "Content-Type": "application/json", 2015 "X-Requested-With": "XMLHttpRequest" 2016 }, 2017 body: JSON.stringify({ 2018 _token: "QjkuaKFhMM9UIqEw7FCb0yX9h1bAJAHWeFlj0JYq" 2019 }), 2020 }) 2021 .then(response => response.json()) 2022 } 2023 } 2024 // End - delete search history from local storage 2025 2026 // search history dropdown 2027 var searchInputs = document.querySelectorAll('.search__input'); 2028 2029 if(searchInputs.length > 0) { 2030
2031 searchInputs.forEach((searchInput)=> { 2032 2033 searchInput.addEventListener('focus', function() { 2034 var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown'); 2035 searchDropdown.innerHTML = ''; // Clear existing items 2036 2037 // retrieve data from local storage 2038 var searchHistoryData = JSON.parse(localStorage.getItem('searchHistory')) || []; 2039 2040 // Convert JSON to string 2041 var search_history_json = JSON.stringify(searchHistoryData); 2042 2043 // Set the value of the hidden input 2044 searchInput.closest('form').querySelector(".hidden_search_history").value = search_history_json; 2045 2046 // create dropdown items 2047 var clearAllItem = document.createElement('div'); 2048 clearAllItem.className = 'dropdown-item clear-all'; 2049 clearAllItem.textContent = 'Clear'; 2050 clearAllItem.addEventListener('click', function() { 2051 clearAll(); 2052 searchDropdown.style.display = 'none'; 2053 searchInput.classList.remove('is-focus'); 2054 }); 2055 searchDropdown.appendChild(clearAllItem); 2056 2057 // create dropdown items 2058 searchHistoryData.forEach(function(item) { 2059 var dropdownItem = document.createElement('div'); 2060 dropdownItem.className = 'dropdown-item'; 2061 dropdownItem.textContent = item.term; 2062 dropdownItem.addEventListener('click', function() { 2063 searchInput.value = item.term; 2064 searchInput.closest('form').submit(); 2065 searchDropdown.style.display = 'none'; 2066 }); 2067 searchDropdown.appendChild(dropdownItem); 2068 }); 2069 2070 if(searchHistoryData.length > 0){ 2071 // display the dropdown 2072 searchInput.classList.add('is-focus'); 2073 document.body.classList.add('search-input-focus'); 2074 searchDropdown.style.display = 'block'; 2075 } 2076 }); 2077 2078 searchInput.addEventListener("focusout", (event) => { 2079 var searchDropdown = searchInput.closest('form').querySelector('#searchDropdown'); 2080 searchInput.classList.remove('is-focus'); 2081 searchDropdown.classList.add('transparent'); 2082 setTimeout(()=>{ 2083 searchDropdown.style.display = 'none'; 2084 searchDropdown.classList.remove('transparent'); 2085 document.body.classList.remove('search-input-focus'); 2086 }, 400); 2087 }); 2088 }) 2089 } 2090 // End - search history dropdown 2091 2092 // referral notification popup 2093 const referralMessageTemplate = 'Rakan anda menghadiahkan anda kredit __CURRENCY_CODE__ __CREDIT_AMOUNT__! Daftar sekarang untuk menebus.'; 2094 const shopCurrency = 'RM'; 2095 2096 function getCookie(name) { 2097 const value = `; ${document.cookie}`; 2098 const parts = value.split(`; ${name}=`); 2099 if (parts.length === 2) return parts.pop().split(';').shift(); 2100 return null; 2101 } 2102 2103 function removeCookie(name) { 2104 document.cookie = `${name}=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;`; 2105 } 2106 2107 function showReferralNotification() { 2108 const referralCode = getCookie('customer_referral_code'); 2109 2110 2111 const customerReferralCode = null; 2112 2113 2114 const activeReferralCode = referralCode || customerReferralCode; 2115 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 2116 2117 if (referralData.timestamp && referralData.expirationDays) { 2118 const expirationTime = referralData.timestamp + (referralData.expirationDays * 24 * 60 * 60 * 1000); 2119 if (Date.now() > expirationTime) { 2120 localStorage.removeItem('referral_notification_data'); 2121 return; 2122 } 2123 } 2124 2125 if (referralData.dismissed) return; 2126 2127 if (activeReferralCode) { 2128 if (referralData.creditAmount) { 2129 displayReferralNotification(referralData.creditAmount); 2130 } else { 2131 fetchReferralCampaignData(activeReferralCode); 2132 } 2133 } 2134 } 2135 2136 function fetchReferralCampaignData(referralCode) { 2137 fetch(`/customer/referral_program/campaigns/${referralCode}`) 2138 .then(response => { 2139 if (!response.ok) { 2140 throw new Error('Network response was not ok'); 2141 } 2142 return response.json(); 2143 }) 2144 .then(data => { 2145 let refereeCreditAmount = null; 2146 if (data.data.campaign && data.data.campaign.referral_rules) { 2147 const refereeRule = data.data.campaign.referral_rules.find(rule => 2148 rule.target_type === 'referee' && 2149 rule.event_name === 'customer/create' && 2150 rule.entitlement && 2151 rule.entitlement.type === 'credit' 2152 ); 2153 2154 if (refereeRule) { 2155 refereeCreditAmount = refereeRule.entitlement.amount; 2156 } 2157 } 2158 2159 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 2160 referralData.creditAmount = refereeCreditAmount; 2161 referralData.dismissed = referralData.dismissed || false; 2162 referralData.timestamp = Date.now(); 2163 referralData.expirationDays = 3; 2164 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 2165 2166 displayReferralNotification(refereeCreditAmount); 2167 }) 2168 .catch(error => { 2169 removeCookie('customer_referral_code'); 2170 }); 2171 } 2172 2173 function displayReferralNotification(creditAmount = null) { 2174 const isMobile = innerWidth <= 749; 2175 2176 if (isMobile) { 2177 const mobileModal = document.querySelector('#referralMobileModal details'); 2178 const mobileMessageElement = document.getElementById('referralSignupMessageMobile'); 2179 2180 if (mobileModal && mobileMessageElement) { 2181 if (creditAmount) {
2182 const finalMessage = referralMessageTemplate 2183 .replace('__CREDIT_AMOUNT__', creditAmount) 2184 .replace('__CURRENCY_CODE__', shopCurrency); 2185 2186 mobileMessageElement.textContent = finalMessage; 2187 } 2188 2189 mobileModal.setAttribute('open', ''); 2190 } 2191 } else { 2192 const notification = document.getElementById('referralNotification'); 2193 2194 if (notification) { 2195 if (creditAmount) { 2196 const messageElement = document.getElementById('referralSignupMessage'); 2197 if (messageElement) { 2198 const finalMessage = referralMessageTemplate 2199 .replace('__CREDIT_AMOUNT__', creditAmount) 2200 .replace('__CURRENCY_CODE__', shopCurrency); 2201 2202 messageElement.textContent = finalMessage; 2203 } 2204 } 2205 2206 notification.style.display = 'block'; 2207 } 2208 } 2209 } 2210 2211 showReferralNotification(); 2212 2213 addEventListener('beforeunload', function() { 2214 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 2215 2216 if (referralData.creditAmount !== undefined) { 2217 referralData.creditAmount = null; 2218 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 2219 } 2220 }); 2221 2222 function closeReferralNotification() { 2223 const notification = document.getElementById('referralNotification'); 2224 if (notification) { 2225 notification.style.display = 'none'; 2226 } 2227 } 2228 2229 function dismissReferralNotification() { 2230 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 2231 2232 referralData.dismissed = true; 2233 referralData.timestamp = referralData.timestamp || Date.now(); 2234 referralData.expirationDays = referralData.expirationDays || 3; 2235 2236 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 2237 2238 closeReferralNotification(); 2239 } 2240 2241 function goToSignupPage() { 2242 location.href = '/account/register'; 2243 dismissReferralNotification(); 2244 } 2245 2246 function closeMobileReferralModal() { 2247 const mobileModal = document.querySelector('#referralMobileModal details'); 2248 if (mobileModal) { 2249 mobileModal.removeAttribute('open'); 2250 } 2251 2252 const referralData = JSON.parse(localStorage.getItem('referral_notification_data')) || {}; 2253 referralData.dismissed = true; 2254 referralData.timestamp = referralData.timestamp || Date.now(); 2255 referralData.expirationDays = referralData.expirationDays || 3; 2256 localStorage.setItem('referral_notification_data', JSON.stringify(referralData)); 2257 } 2258 2259 function goToSignupPageFromMobile() { 2260 location.href = '/account/register'; 2261 closeMobileReferralModal(); 2262 } 2263 // End - referral notification popup 2264</script>
2264 2265 2266 2267 2268 <main id="MainContent" class="content-for-layout focus-none" role="main" tabindex="-1"> 2269 2270 <link rel="stylesheet" href="/assets/css/store-locator.css?v3.1"> 2271 2272 2273 <div class="store-locator-heading page-width"> 2274 <h1 class="section-header__title">Alamat kedai</h1> 2275 <b>Pilih negeri di bawah ini untuk mencari kedai yang berhampiran anda</b> 2276 <div class="store-locator-search"> 2277 <div class="select"> 2278 <select id="province-select" class="select__select"> 2279 <option value="all">Semua</option> 2280 </select> 2281 </div> 2282 </div> 2283 </div> 2284 <div class='store-locator-section no-watermark page-width'> 2285 <div class="store-locator-grid"> 2286 2287 <div class="store-locator-grid_item" data-province="Sabah"> 2288 <div class="store-selector-item"> 2289 <div class="location-detail"> 2290 <strong> 2291 SAUQAH 2292 </strong> 2293 <a href="tel:[email protected]">0172394461</a> <br> 2294 <a href="mailto:[email protected]">[email protected]</a> <br> 2295 2296 <address> 2297 LOT 1-A-186 TINGKAT 1 BLOK A <br> 2298 SEJATIWALK BATU 7 <br> 2299 Sandakan, 90000<br> 2300 Sabah , Malaysia <br> 2301 2302 <div id="business-hour-0"></div> 2303 </address> 2304 2305 </div><br> 2306 <a class="button button--tertiary" href="https://www.google.com/maps?q=SAUQAH LOT 1-A-186 TINGKAT 1 BLOK A SEJATIWALK BATU 7 Sandakan 90000 MY" target="_blank">Navigasi</a> 2307 </div> 2308 </div> 2309 2310 </div> 2311 </div> 2312 2313 2314 2315 2316 2317
2318<script> 2319 2320 var locations = [{"id":294835,"store_id":385982,"code":"90000","name":"SAUQAH","company":null,"address1":"LOT 1-A-186 TINGKAT 1 BLOK A ","address2":"SEJATIWALK BATU 7","city":"Sandakan","zip":"90000","village":null,"sub_district":null,"sub_district_code":null,"district":null,"district_code":null,"province":"Sabah","province_code":"MY-12","country":"Malaysia","country_code":"MY","phone":"0172394461","email":"[email protected]","pickup_charge":"0.0","service_provider":null,"latitude":"5.904134","longitude":"118.053025","geocoded_at":null,"geocoding_status":null,"cod_type":0,"cod_min_amount":"0.0","cod_max_amount":"0.0","is_primary":true,"enable_pickup":false,"business_hour":"{\"mon\":[{\"start\":\"10:00\",\"end\":\"19:00\"}],\"tue\":[{\"start\":\"10:00\",\"end\":\"19:00\"}],\"wed\":\"closed\",\"thur\":[{\"start\":\"10:00\",\"end\":\"19:00\"}],\"fri\":[{\"start\":\"10:00\",\"end\":\"19:00\"}],\"sat\":[{\"start\":\"10:00\",\"end\":\"21:00\"}],\"sun\":[{\"start\":\"10:00\",\"end\":\"21:00\"}]}","disabled_date":"","cutoff_day":0,"cutoff_value":0,"cutoff_unit":"day","pickup_available_unit":"day","pickup_available_value":30,"track_inventory_enabled":true,"is_hidden":false,"online_fulfillment_enabled":true,"fulfillment_priority":null,"pickup_time_selection_enabled":false,"pickup_description":"oneHours","is_visitable":true,"is_enabled":true,"is_deleted":false,"deleted_at":null,"updated_at":"2026-09-11T09:53:24.000+08:00","created_at":"2022-05-13T03:20:50.000+08:00","formatted":"SAUQAH LOT 1-A-186 TINGKAT 1 BLOK A SEJATIWALK BATU 7 Sandakan 90000 MY"}]; 2321 2322 const ordering = { mon: 1, tue: 2, wed: 3, thur: 4, fri: 5, sat: 6, sun: 7 } 2323 2324 const formatDay = day => day.replace(day[0], day[0].toUpperCase()) 2325 2326 const convertTime = time => { 2327 2328 if(!time.includes(":")) time += ":00" 2329 2330 time = time.toString ().match (/^([01]\d|2[0-3])(:)([0-5]\d)(:[0-5]\d)?$/) || [time]; 2331 2332 if (time.length > 1) { 2333 time = time.slice (1); 2334 time[5] = +time[0] < 12 ? 'am' : 'pm'; 2335 time[0] = +time[0] % 12 || 12; 2336 } 2337 2338 return time.join (''); 2339 } 2340 2341 const checkTimeFormat = value => { 2342 2343 if(value.split(':').length == 3) { 2344 return value.slice(0, value.length - 3) 2345 } 2346 return value 2347 } 2348 2349 const formatTime = time => { 2350 2351 var start = convertTime(checkTimeFormat(time.start)) 2352 var end = convertTime(checkTimeFormat(time.end)) 2353 2354 return `${start} - ${end}` 2355 } 2356 2357 const getToday = businessHour => { 2358 2359 var today = new Date().getDay() 2360 2361 var today = Object.keys(businessHour).filter(key => ordering[key] === today)[0]; 2362 2363 return today 2364 2365 } 2366 2367 const checkOpen = businessHour => { 2368 2369 var today = getToday(businessHour) 2370 2371 var result = businessHour.everyday; 2372 2373 if(today !== undefined) result = businessHour[today] 2374 2375 if (result === 'closed') return false 2376 2377 var { start, end } = result 2378 2379 start = start.split(':') 2380 if(start.length > 2) start.pop() 2381 start = parseInt(start.join('')) 2382 2383 end = end.split(':') 2384 if(end.length > 2) end.pop() 2385 end = parseInt(end.join('')) 2386 2387 var now = new Date() 2388 now = parseInt(`${now.getHours()}${String(now.getMinutes()).padStart(2, "0")}`) 2389 2390 if(now < start || now >= end) { 2391 return false 2392 } 2393 2394 return true 2395 2396 } 2397 2398 2399 2400 var provinceSelect = document.getElementById('province-select'), 2401 locationItem = document.querySelectorAll("[data-province]") 2402 provinceSelect.addEventListener("change", function(){ 2403 locationItem.forEach(function(item){ 2404 if(item.getAttribute('data-province') != provinceSelect.value && provinceSelect.value != 'all'){ 2405 item.style.display = "none"; 2406 }else{ 2407 item.style.display = ""; 2408 } 2409 }); 2410 }); 2411 2412 2413 2414 for(var i = 0; i < locations.length; i++) { 2415 2416 // Update provinceSelect Option 2417 var provinceOptionExist = false 2418 for (x = 0; x < provinceSelect.length; ++x){ 2419 if (provinceSelect.options[x].value == locations[i].province){ 2420 provinceOptionExist = true 2421 } 2422 } 2423 if(!provinceOptionExist){ 2424 var opt = document.createElement('option'); 2425 opt.appendChild( document.createTextNode(locations[i].province) ); 2426 opt.value = locations[i].province; 2427 provinceSelect.appendChild(opt); 2428 } 2429 2430 var node = document.getElementById(`business-hour-${i}`) 2431 var businessHour = JSON.parse(locations[i].business_hour) 2432 2433 var dropdown = document.createElement("div") 2434 dropdown.className = "dropdown" 2435 dropdown.setAttribute("data-toggle","0") 2436 2437 var dropdownToggle = document.createElement("span") 2438 dropdownToggle.className = "dropdown-toggle" 2439 2440 var caret = document.createElement("span") 2441 caret.className = "caret" 2442 2443 var dropdownMenu = document.createElement("ul") 2444 dropdownMenu.className = "dropdown-menu list-unstyled" 2445 2446 if(Object.keys(businessHour).length <= 0) { 2447 2448 dropdownToggle.innerHTML = `<span style="color: green; font-weight: bold;">Open</span>` 2449 2450 var li = document.createElement("li") 2451 var a = document.createElement("a") 2452 a.innerHTML = "Open for 24 hours" 2453 li.appendChild(a) 2454 dropdownMenu.appendChild(li) 2455 2456 } 2457 2458 else if("everyday" in businessHour) { 2459 2460 dropdownToggle.innerHTML = `<span style="color: red; font-weight: bold;">Closed</span>` 2461 2462 if(checkOpen(businessHour)) { 2463 dropdownToggle.innerHTML = `<span style="color: green; font-weight: bold;">Open</span> â Closes ${convertTime(businessHour.everyday.end)}` 2464 } 2465 2466 var li = document.createElement("li") 2467 var a = document.createElement("a") 2468 a.innerHTML = `Everyday: ${formatTime(businessHour.everyday)}` 2469 li.appendChild(a) 2470 dropdownMenu.appendChild(li) 2471 } 2472 2473 else { 2474 2475 dropdownToggle.innerHTML = `<span style="color: red; font-weight: bold;">Closed</span>` 2476 2477 var today = getToday(businessHour) 2478 2479 if(checkOpen(businessHour)) { 2480 dropdownToggle.innerHTML = `<span style="color: green; font-weight: bold;">Open</span> â Closes ${convertTime(businessHour[today].end)}` 2481 } 2482 2483 var listItems = [] 2484 2485 for(var day in businessHour) { 2486 2487 var li = document.createElement("li") 2488 var a = document.createElement("a") 2489 a.innerHTML = `${formatDay(day)}: ${businessHour[day] === 'closed' ? 'Closed': formatTime(businessHour[day])}` 2490 li.appendChild(a) 2491 2492 listItems[ordering[day]] = li 2493 2494 } 2495
2496 listItems.forEach(el => el != undefined && dropdownMenu.appendChild(el)) 2497 2498 } 2499 2500 dropdown.appendChild(dropdownToggle) 2501 dropdown.appendChild(caret) 2502 dropdown.appendChild(dropdownMenu) 2503 2504 2505 2506 node.appendChild(dropdown) 2507 2508 2509 } 2510 2511 var dropdowns = document.querySelectorAll("[data-toggle]"); 2512 dropdowns.forEach(function(btn){ 2513 btn.addEventListener('click', function(el) { 2514 if(btn.getAttribute('data-toggle') != '0'){ 2515 btn.setAttribute("data-toggle", "0") 2516 }else{ 2517 btn.setAttribute("data-toggle", "1") 2518 } 2519 }); 2520 }); 2521 2522 window.addEventListener('click', function(e){ 2523 dropdowns.forEach(function(btn){ 2524 if (!btn.contains(e.target)){ 2525 btn.setAttribute("data-toggle", "0") 2526 } 2527 }); 2528 }); 2529 2530 2531</script>
2531 2532 2533 2534 2535 2536 2537 </main> 2538 <style> 2539 .footer{ 2540 background-color: #EDD6B6; 2541 color: #10100f; 2542 --color-foreground: 16,16,15; 2543 } 2544 .footer .link--text, 2545 .footer .list-menu__item--link, 2546 .footer .footer-block__details-content .list-menu__item--link{ 2547 color: #10100f; 2548 } 2549 .footer-block__heading{ 2550 color: #040403; 2551 } 2552 .rounded{ 2553 border-radius: 10px; 2554 } 2555 .object-contain{ 2556 object-fit: contain; 2557 } 2558 .shopping-app-border{ 2559 border: 1px #ECECEC solid; 2560 margin-right: 3px; 2561 } 2562 .app-download-badge{ 2563 display: inline-block; 2564 margin-right: 3px; 2565 } 2566</style> 2567 2568<link href="https://store-themes.easystore.co/385982/themes/295436/assets/section-footer.css?t=1787123890" rel="stylesheet" type="text/css" media="screen" /> 2569 2570<footer class="footer color-background-1"> 2571 <div class="footer__content-top page-width"> 2572 <div class="grid grid--1-col grid--4-col-tablet "> 2573 2574 2575 2576 <div class="grid__item"> 2577 2578 <h2 class="footer-block__heading">Our mission</h2> 2579 <div class="footer-block__details-content"> 2580 <p>Quality materials, good designs, craftsmanship and sustainability.</p> 2581 </div> 2582 2583 </div> 2584 2585 </div> 2586 </div> 2587 <div class="footer__content-bottom"> 2588 <div class="footer__content-bottom-wrapper page-width"> 2589 <div class="footer__column footer__column--info"> 2590 2591 2592 2593 2594 2595 2596 2597 <div class="footer__copyright caption"> 2598 <div class="copyright__content">Copyright © 2026 sauQah Hq. E-commerce Powered by <a href="http://www.easystore.co/?utm_source=storefront&utm_medium=sf_ref_footer&utm_campaign=sf_ref">EasyStore</a></div> 2599 </div> 2600 2601 <div class="footer__copyright caption"> 2602 2603 <div> 2604 2605 2606 2607 <a href="/legal/terms-of-service">Terms of Service</a> 2608 2609 2610 2611 2612 | <a href="/legal/privacy-policy">Privacy Policy</a> 2613 2614 2615 2616 2617 | <a href="/legal/refund-policy">Refund Policy</a> 2618 2619 2620 2621 2622 | <a href="/pages/mengenai-kami">Mengenai Kami</a> 2623 2624 2625 2626 </div> 2627 2628 </div> 2629 2630 </div> 2631 </div> 2632 </div> 2633</footer> 2634 2635 2636 2637 2638 2639 2640
2640<script> 2641 EasyStore.Currencies.init([{"name":"Malaysian Ringgit","code":"MYR","rate":"1.0","format_prefix":"RM","format_suffix":null,"format_decimals":2,"thousand_separator":",","is_primary":true}], 1) 2642</script>
2642 2643 2644 2645 2646
2646<script> 2647 let page_template = 'store-locator'; 2648 2649 if(document.querySelector('.currency-picker')) { 2650 EasyStore.Currencies.change(document.querySelector('.currency-picker').value) 2651 EasyStore.Currencies.convertAll() 2652 } 2653 2654 document.querySelectorAll('.currency-picker').forEach((el)=>{ 2655 el.addEventListener('change',(event)=>{ 2656 EasyStore.Currencies.change(event.target.value) 2657 2658 2659 if (page_template == 'cart') { 2660 const params = new URLSearchParams(window.location.search); 2661 params.set('delete_cache', 1); 2662 window.location.search = params; 2663 } else { 2664 window.location.reload(); 2665 } 2666 2667 return 2668 2669 2670 document.querySelectorAll('[name=currencies],[name=current_currency]').forEach((el)=>{ 2671 el.value = event.target.value 2672 }) 2673 2674 if(page_template == 'cart') location.reload(); 2675 }) 2676 }) 2677 </script>
2677 2678 2679 2680 2681 2682
2682<script> 2683 2684 window.variantStrings = { 2685 addToCart: `Tambah ke bakul`, 2686 updateCart: `Kemaskini bakul`, 2687 soldOut: `Habis`, 2688 unavailable: `Tiada`, 2689 } 2690 2691 window.accessibilityStrings = { 2692 shareSuccess: `Pautan disalin ke papan keratan`, 2693 } 2694 2695 window.promotionStrings = { 2696 title: `Promosi`, 2697 } 2698 2699 window.productSettings = { 2700 variantOptionsDisplay: `radio`, 2701 } 2702 </script>
2702 2703 2704 <link href="https://store-themes.easystore.co/385982/themes/295436/assets/section-main-product.css?t=1787123890" rel="stylesheet" type="text/css" media="screen" /> 2705<link href="https://store-themes.easystore.co/385982/themes/295436/assets/component-loading-overlay.css?t=1787123890" rel="stylesheet" type="text/css" media="screen" /> 2706<link href="https://store-themes.easystore.co/385982/themes/295436/assets/product-quickview.css?t=1787123890" rel="stylesheet" type="text/css" media="screen" /> 2707 2708<product-quickview-modal> 2709 <div id="product-quickview-modal" class="product-quickview-modal-wrapper focus-inset" aria-modal="true" role="dialog" tabindex="-1"> 2710 <button type="button" class="product-quickview-modal__close modal__close-button link link--text focus-inset" aria-label="accessibility.close"> 2711 2712 2713 2714 <svg class="icon icon-close " data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600"><path d="M335.36,300,581.87,53.48a25,25,0,0,0-35.35-35.35L300,264.64,53.48,18.13A25,25,0,0,0,18.13,53.48L264.64,300,18.13,546.52a25,25,0,0,0,35.35,35.35L300,335.36,546.52,581.87a25,25,0,0,0,35.35-35.35Z" fill="currentColor"/></svg> 2715 2716 2717 2718 </button> 2719 2720 <div class="loading-overlay"> 2721 <div class="loading-overlay__spinner"> 2722 <svg aria-hidden="true" focusable="false" role="presentation" class="spinner" viewBox="0 0 66 66" xmlns="http://www.w3.org/2000/svg"> 2723 <circle class="path" fill="none" stroke-width="6" cx="33" cy="33" r="30"></circle> 2724 </svg> 2725 </div> 2726 </div> 2727 2728 <div class="product-quickview-modal__body" style="display: none;"></div> 2729 </div> 2730 <div class="product-quickview-modal-backdrop"></div> 2731</product-quickview-modal> 2732
2733<script src="https://store-themes.easystore.co/385982/themes/295436/assets/product-form.js?t=1787123890" type="text/javascript" ></script>
vendor: 1 bytes, line 2733
2733
2734<script src="https://store-themes.easystore.co/385982/themes/295436/assets/product-quickview.js?t=1787123890" type="text/javascript" ></script>
2734 2735
2735<script> 2736 2737 /* 2738 2739 ------ 2740 Events 2741 ------ 2742 2743 pages/viewed 2744 2745 customers/signup 2746 2747 customers/login 2748 2749 products/searched 2750 2751 collections/viewed 2752 2753 products/viewed 2754 2755 products/shared 2756 2757 wishlists/item_added 2758 2759 carts/items_added 2760 2761 carts/viewed 2762 2763 carts/item_removed 2764 2765 checkouts/initiated 2766 2767 checkouts/shipping_info_added 2768 2769 checkouts/payment_info_added 2770 2771 checkouts/completed 2772 2773 orders/placed 2774 2775 orders/purchased 2776 2777 payments/captured 2778 2779 payments/failed 2780 2781 */ 2782 2783 window.__latest_cart = window.__latest_cart || null; 2784 2785 const _selector = document.querySelector.bind(document), 2786 _selectorAll = document.querySelectorAll.bind(document) 2787 2788 document.addEventListener('DOMContentLoaded', (event) => { 2789 2790 const default_currency = getCookie("currency") 2791 const customer_id = window.__st.cid 2792 const template = window.__st.p 2793 2794 onPageView() 2795 2796 //-----------------------// 2797 // Configs // 2798 //-----------------------// 2799 2800 window.dataLayer = window.dataLayer || [] 2801 2802 Array.prototype.last = Array.prototype.last || function() { 2803 return this[this.length - 1] || null 2804 } 2805 2806 Array.prototype.first = Array.prototype.first || function() { 2807 return this[0] || null 2808 } 2809 2810 //----------------------// 2811 // Triggers // 2812 //----------------------// 2813 2814 const XHR = window.XMLHttpRequest 2815 2816 function xhr() { 2817 2818 const xhr = new XHR() 2819 2820 xhr.addEventListener("readystatechange", function() { 2821 2822 if(xhr.readyState != 4) return 2823 2824 try { 2825 2826 const response_url = xhr.responseURL 2827 2828 if (response_url.includes("cart/add")) { 2829 2830 window.__latest_cart = JSON.parse(xhr.response) 2831 2832 onCartItemsAdded() // ok 2833 2834 } 2835 2836 if (response_url.includes("cart/remove_item_quantity")) { 2837 2838 window.__latest_cart = JSON.parse(xhr.response) 2839 2840 onCartItemRemoved() // ok 2841 2842 } 2843 2844 if (response_url.includes("new_cart?retrieve=true")) { 2845 2846 result = JSON.parse(xhr.response) 2847 2848 if (result.cart) { 2849 window.__latest_cart = result.cart 2850 } 2851 2852 } 2853 2854 } catch(e) { 2855 2856 console.error(e) 2857 2858 } 2859 2860 }, false); 2861 2862 return xhr 2863 2864 } 2865 2866 window.XMLHttpRequest = xhr 2867 2868 switch(template) { 2869 2870 case 'cart': onCartView() // ok 2871 break 2872 case 'product': onProductView() // ok 2873 break 2874 case 'collection': onCollectionView() // ok 2875 break 2876 case 'blog': onBlogView() 2877 break 2878 case 'article': onArticleView() 2879 break 2880 case 'payment_completed': onOrderPlace() 2881 break 2882 case 'payment_fail': onPaymentFail() 2883 break 2884 2885 } 2886 2887 // _selector('form[action="/checkout/payments"]').addEventListener("submit", onPaymentInfoAdded(_selector('form[action="/checkout/payments"]'))) 2888 if (_selector('form[action="/checkout/detail"]')) _selector('form[action="/checkout/detail"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/detail"]'))}) // ok 2889 if (_selector('form[action="/checkout/shipping"]')) _selector('form[action="/checkout/shipping"]').addEventListener("submit", ()=>{onShippingInfoAdded(_selector('form[action="/checkout/shipping"]'))}) // ok 2890 if (_selector('form[action="/account/register"]')) _selector('form[action="/account/register"]').addEventListener("submit", onSignUp) // ok 2891 if (_selector('form[action="/account/login"]')) _selector('form[action="/account/login"]').addEventListener("submit", onLogin) // ok 2892 if (_selector('form[action="/search"]')) _selector('form[action="/search"]').addEventListener("submit", onProductSearch()) // ok 2893 if (_selector('#line-login-btn')) _selector('#line-login-btn').addEventListener('click', onLineLogin) // ok 2894 if (_selector('#PlaceOrder')) _selector('#PlaceOrder').addEventListener("click", ()=>{onCheckoutComplete(_selector('form[action="/checkout/payments"]'))}); // ok 2895 if (_selector('#add_wishlist')) _selector('#add_wishlist').addEventListener("click", onWishlistItemAdded) // ok 2896 if (_selectorAll('a[href="/account/logout"]')) _selectorAll('a[href="/account/logout"]').forEach(logoutButton => logoutButton.addEventListener("click", onLogout)) // ok 2897 if (_selector('.CartDrawerTrigger.cart-page-link')) _selector('.CartDrawerTrigger.cart-page-link').addEventListener("click", onCartView) // ok 2898 if (_selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link')) _selector('.CartDrawerTrigger.cart-page-link.mobile-cart-page-link').addEventListener("click", onCartView) // ok 2899 if (_selectorAll('a[class^="share-"]')) _selectorAll('a[class^="share-"]').forEach(shareButton => shareButton.addEventListener("click", ()=>{onProductShare(shareButton)}) ) // ok 2900 if (_selectorAll('[name$="checkout"]')) _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate)) 2901 2902 // For append elements 2903 const bodyMutationObserver = new MutationObserver(() => { 2904 if (_selector('#form__spc #PlaceOrder')) _selector('#form__spc #PlaceOrder').addEventListener("click", onSinglePageCheckout) // ok 2905 if (_selectorAll('[name$="checkout"]')) _selectorAll('[name$="checkout"]').forEach(checkoutButton => checkoutButton.addEventListener("click", onCheckoutInitiate)) 2906 }); 2907 bodyMutationObserver.observe(_selector("body"), {subtree: true, childList: true}); 2908 2909 //------------------------------// 2910 // Event handlers // 2911 //------------------------------// 2912 2913 function onPageView() { 2914 2915 EasyStore.Event.dispatch('pages/viewed', { 2916 page: { 2917 type: template, 2918 title: document.title, 2919 description: _selector('meta[name=description]') ? _selector('meta[name=description]').getAttribute('content') : null, 2920 url: location.href, 2921 } 2922 }) 2923 2924 } 2925 2926 function onSignUp() { 2927 2928 const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/) 2929 const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/) 2930 2931 const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "") 2932 2933 let data = {} 2934 2935 if (email_regex.test(email_or_phone)) { 2936 data.method = 'email' 2937 data.email = email_or_phone 2938 } 2939 2940 if (phone_regex.test(email_or_phone)) { 2941 data.method = "phone" 2942 data.phone = email_or_phone 2943 } 2944 2945 if (!data.method) return 2946 2947 EasyStore.Event.dispatch('customers/signup', data) 2948 2949 } 2950 2951 function onLogin() { 2952 2953 const email_regex = new RegExp(/^[a-zA-Z0-9.!#$%&"*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/) 2954 const phone_regex = new RegExp(/^(\+?6?01)[0-46-9]-*[0-9]{7,8}$/) 2955 2956 const email_or_phone = _selector(`input[name="customer[email_or_phone]"]`).value.replace("+", "").replace(/\s+/, "") 2957 2958 let data = {} 2959 2960 if (email_regex.test(email_or_phone)) { 2961 data.method = 'email' 2962 data.email = email_or_phone 2963 } 2964 2965 if (phone_regex.test(email_or_phone)) { 2966 data.method = "phone" 2967 data.phone = email_or_phone 2968 } 2969 2970 if (!data.method) return 2971 2972 EasyStore.Event.dispatch('customers/login', data) 2973 2974 } 2975 2976 function onLineLogin() { 2977 2978 EasyStore.Event.dispatch('customers/login', { method: 'line' }) 2979 2980 } 2981 2982 function onLogout() { 2983 2984 EasyStore.Event.dispatch('customers/logout', { customer_id }) 2985 2986 } 2987 2988 function onBlogView() { 2989 2990 const blog = "" 2991 2992 EasyStore.Event.dispatch('blogs/viewed', { blog }) 2993 2994 } 2995 2996 function onArticleView() { 2997 2998 const article = "" 2999 3000 EasyStore.Event.dispatch('articles/viewed', { article }) 3001 3002 } 3003 3004 function onProductSearch() { 3005 3006 const query = _selector('input[name=q]').value 3007 3008 if (!query) return 3009 3010 EasyStore.Event.dispatch('products/searched', { query }) 3011 3012 } 3013 3014 function onCollectionView() { 3015 3016 const collection = "" 3017 3018 EasyStore.Event.dispatch('collections/viewed', { collection }) 3019 3020 } 3021 3022 function onProductView() { 3023 3024 const product = "" 3025 3026 EasyStore.Event.dispatch("products/viewed", { product }) 3027 3028 } 3029 3030 function onProductShare(el) { 3031 3032 const product = "" 3033 3034 const channel = el.getAttribute("class").split("-").last() 3035 3036 EasyStore.Event.dispatch('products/shared', { product, channel }) 3037 3038 } 3039 3040 function onWishlistItemAdded() { 3041 3042 let product = "" 3043 const quantity = _selector("#Quantity").value 3044 3045 EasyStore.Event.dispatch('wishlists/item_added', { product }) 3046 3047 } 3048 3049 async function onCartItemsAdded() { 3050 3051 const cart = await getCart() 3052 3053 if(cart && cart.items != undefined && cart.items.length > 0) { 3054 3055 EasyStore.Event.dispatch('carts/item_added', { cart }) 3056 3057 } 3058 3059 } 3060 3061 async function onCartView() { 3062 3063 const cart = await getCart() 3064 3065 EasyStore.Event.dispatch('carts/viewed', { cart }) 3066 3067 } 3068 3069 async function onCartItemRemoved() { 3070 3071 const cart = await getCart() 3072 3073 cart.items = [] 3074 3075 if(cart) { 3076 3077 EasyStore.Event.dispatch('carts/item_removed', { cart }) 3078 3079 } 3080 3081 } 3082 3083 async function onCheckoutInitiate() { 3084 3085 const cart = await getCart() 3086 3087 EasyStore.Event.dispatch('checkouts/initiated', { cart }) 3088 3089 } 3090 3091 async function onShippingInfoAdded(form) { 3092 let checkout = getCheckout() 3093 3094 let form_data = {} 3095 new FormData(form).forEach((value, key) => form_data[key] = value) 3096 3097 let shipping_tier = null 3098 3099 if (form_data.type && form_data.type.startsWith("r_pickup")) { 3100 shipping_tier = `Pickup - ${form_data.pick_location}` 3101 } 3102 3103 if (form_data.s_id) {
3104 shipping_tier = _selector(`input[id='`+form_data.s_id+`']`).getAttribute("data-shipping-name") 3105 } 3106 3107 if (!shipping_tier) return 3108 3109 EasyStore.Event.dispatch('checkouts/shipping_info_added', { checkout, shipping_tier }) 3110 3111 } 3112 3113 async function onPaymentInfoAdded(form) { 3114 3115 let checkout = getCheckout() 3116 3117 let payment_type = new FormData(form).get('payment_method') 3118 3119 EasyStore.Event.dispatch("checkouts/payment_info_added", { checkout, payment_type }) 3120 3121 } 3122 3123 async function onOrderPlace() { 3124 3125 let cart_token = getCookie("cart_js") 3126 let previous_cart_token = getCookie("previous_cart_ga4_js") 3127 3128 if (previous_cart_token && previous_cart_token == cart_token) { 3129 // Prevent duplicate purchase tracking 3130 return 3131 } 3132 3133 let order = getOrder() 3134 3135 EasyStore.Event.dispatch('orders/placed', { order }) 3136 3137 if(order.is_manual_payment) { 3138 3139 EasyStore.Event.dispatch('orders/purchased', { order }) 3140 3141 } 3142 3143 const last_transaction = order.transactions.last() 3144 3145 if (last_transaction.status) { 3146 3147 EasyStore.Event.dispatch('orders/purchased', { order }) 3148 EasyStore.Event.dispatch('payments/captured', { order }) 3149 3150 } 3151 3152 } 3153 3154 async function onPaymentFail() { 3155 3156 const order = getOrder() 3157 3158 EasyStore.Event.dispatch('payments/failed', { order }) 3159 3160 } 3161 3162 async function onCheckoutComplete(form) { 3163 3164 onPaymentInfoAdded(form) 3165 3166 const checkout = getCheckout() 3167 3168 EasyStore.Event.dispatch('checkouts/completed', { checkout }) 3169 3170 } 3171 3172 async function onSinglePageCheckout() { 3173 3174 // let checkout = $("[data-app-checkout]").data("app-checkout") 3175 3176 let checkout = getCheckout() 3177 3178 // const payment_type = _selector("#app_spc_payment_method").find(`[class*="label-content"]`).first().find("b").first().text() 3179 const payment_type = _selector("#app_spc_payment_method").getElementsByClassName('label-content')[0].getElementsByTagName('b')[0].innerHTML 3180 3181 const shipping_method = _selector("#delivery_method").value 3182 3183 let shipping_tier = null 3184 let app_spc_customer_info_label = _selector("#app_spc_customer_info").getElementsByClassName('label-content') 3185 if (shipping_method == "shipping") { 3186 shipping_tier = app_spc_customer_info_label[app_spc_customer_info_label.length - 1].getElementsByTagName('b')[0].innerHTML 3187 } 3188 3189 if (shipping_method == "pickup") { 3190 shipping_tier = app_spc_customer_info_label[0].innerHTML 3191 } 3192 3193 if (shipping_tier) { 3194 3195 EasyStore.Event.dispatch('checkouts/shipping_info_added', { 3196 checkout, 3197 shipping_tier, 3198 }) 3199 3200 } 3201 3202 if (payment_type) { 3203 3204 EasyStore.Event.dispatch('checkouts/payment_info_added', { 3205 checkout, 3206 payment_type, 3207 }) 3208 3209 } 3210 3211 EasyStore.Event.dispatch('checkouts/completed', { checkout }) 3212 3213 } 3214 3215 }) 3216 3217 3218 //-----------------------// 3219 // Functions // 3220 //-----------------------// 3221 3222 function getCookie(name) { 3223 3224 name += "=" 3225 3226 decodedCookie = decodeURIComponent(document.cookie) 3227 3228 ca = decodedCookie.split(";") 3229 3230 for(i = 0; i < ca.length; i++) { 3231 c = ca[i] 3232 while (c.charAt(0) == " ") { 3233 c = c.substring(1) 3234 } 3235 if (c.indexOf(name) == 0) { 3236 return c.substring(name.length, c.length) 3237 } 3238 } 3239 3240 return "" 3241 3242 } 3243 3244 const parsePrice = price => { 3245 if(typeof price === 'string') { 3246 return parseFloat(price.split(',').join('')) 3247 } 3248 3249 return price 3250 } 3251 3252 const requestCart = async (method, data) => { 3253 3254 let response = await fetch('/cart.json', {method: 'GET',headers: {'Content-Type': 'application/json'}}) 3255 result = await response.json() 3256 3257 return result.cart 3258 3259 } 3260 const getCart = async (latest = false) => { 3261 3262 let cart = window.__latest_cart 3263 3264 const cart_invalid = !cart || !cart.items || (cart.total_price > 0 && !cart.items.length) 3265 3266 if(latest || cart_invalid) { 3267 cart = await requestCart() 3268 } 3269 3270 cart.items = cart.items || [] 3271 3272 return mapCart(cart) 3273 3274 } 3275 3276 const getCheckout = async () => { 3277 mapCheckout(window.__latest_cart || await requestCart()) 3278 } 3279 3280 const getOrder = async () => { 3281 mapOrder(window.__latest_cart || await requestCart()) 3282 } 3283 3284 //-----------------------// 3285 // Mappers // 3286 //-----------------------// 3287 3288 const fallbackAttribute = (object, attribute) => { 3289 3290 if(!Array.isArray(attribute)) { 3291 attribute = [attribute] 3292 } 3293 3294 let final_value = null 3295 3296 do { 3297 3298 final_value = object[attribute.shift()] 3299 3300 } while(!final_value && attribute.length) 3301 3302 return final_value 3303 3304 } 3305 3306 const map = (object, mapper) => { 3307 3308 const newObject = {} 3309 3310 for(const key in mapper) { 3311 3312 // Handle different keys between new and old format
3313 newObject[key] = fallbackAttribute(object, mapper[key]) 3314 3315 // Cast price to float 3316 if(newObject[key] && ['price', 'amount', 'discount', 'discounts'].some(x => key.endsWith(x))) { 3317 newObject[key] = parsePrice(newObject[key]) 3318 } 3319 3320 if(newObject[key] === undefined) { 3321 delete newObject[key] 3322 } 3323 3324 } 3325 3326 return newObject 3327 3328 } 3329 3330 const mapCart = cart => { 3331 3332 const oldCart = cart 3333 3334 const mapper = { 3335 id: 'id', 3336 currency: 'currency', 3337 item_count: 'item_count', 3338 items: 'items', 3339 total_price: 'total_price', 3340 latest_items: 'latest_items' 3341 } 3342 3343 cart = map(cart, mapper) 3344 3345 const discounts = (oldCart.storewide_discounts || []).concat((oldCart.voucher_discounts || [])) 3346 3347 cart.discount_applications = discounts.map(discount => ({ 3348 title: discount.voucher_code || null, 3349 value: parsePrice(discount.amount), 3350 })) 3351 3352 cart.original_total_price = cart.items.length 3353 ? cart.items 3354 .map(item => item.original_price) 3355 .reduce((sum, price) => sum + price) 3356 : 0 3357 3358 cart.total_discount = cart.discount_applications.length 3359 ? cart.discount_applications 3360 .map(discount => parsePrice(discount.value)) 3361 .reduce((sum, value) => sum + value) 3362 : 0 3363 3364 cart.items = cart.items.map(item => mapLineItem(item)) 3365 3366 return cart 3367 3368 } 3369 3370 const mapCheckout = checkout => { 3371 3372 const mapper = { 3373 note: 'note', 3374 attributes: 'note_attributes', 3375 billing_address: 'billing_address', 3376 currency: 'currency', 3377 customer_id: 'customer_id', 3378 discounts_amount: 'total_discount', 3379 id: 'id', 3380 line_items: 'order_item', 3381 order_number: 'order_number', 3382 shipping_address: 'shipping_address', 3383 shipping_price: 'shipping_tax', 3384 shipping_method: 'shipping_method_name', 3385 tax_price: 'total_tax', 3386 } 3387 3388 checkout = map(checkout, mapper) 3389 3390 checkout.requires_shipping = checkout.line_items.some(item => item.shipping_required) 3391 3392 checkout.line_items = checkout.line_items.map(item => mapLineItem(item)) 3393 3394 return checkout 3395 3396 } 3397 3398 const mapOrder = order => { 3399 3400 const mapper = { 3401 attributes: 'note_attributes', 3402 billing_address: 'billing_address', 3403 cancelled: 'is_cancelled', 3404 cancelled_at: 'cancelled_at', 3405 created_at: 'created_at', 3406 customer_id: 'customer_id', 3407 // discount_applications: 'discount_applications', 3408 email: 'email', 3409 financial_status: 'financial_status', 3410 fulfillment_status: 'fulfillment_status', 3411 line_items: 'order_item', 3412 note: 'note', 3413 order_number: 'order_number', 3414 phone: 'phone', 3415 shipping_address: 'shipping_address', 3416 shipping_methods: 'shipping_methods', 3417 shipping_price: 'total_shipping', 3418 subtotal_price: 'subtotal_price', 3419 // tax_lines: 'tax_lines', 3420 tax_price: 'total_tax', 3421 total_discounts: 'total_discount', 3422 total_net_amount: 'total_amount_include_transaction', 3423 total_price: 'total_price', 3424 transactions: 'transaction_records', 3425 is_manual_payment: 'is_manual_payment', 3426 } 3427 3428 order.email = order.billing_address.email 3429 order.phone = order.billing_address.phone 3430 order.shipping_method = order.shipping_method_name 3431 3432 order = map(order, mapper) 3433 3434 order.line_items = order.line_items.map(item => mapLineItem(item)) 3435 order.transactions = order.transactions.map(transaction => mapTransaction(transaction)) 3436 3437 return order 3438 3439 } 3440 3441 const mapLineItem = line_item => { 3442 3443 const old_line_item = line_item 3444 3445 const mapper = { 3446 final_price: 'price', 3447 image: 'img_url', 3448 message: 'message', 3449 original_line_price: 'original_line_price', 3450 original_price: 'original_price', 3451 properties: 'properties', 3452 quantity: 'quantity', 3453 requires_shipping: 'shipping_required', 3454 sku: 'sku', 3455 taxable: 'taxable', 3456 title: 'product_name', 3457 product_name: 'product_name', 3458 url: 'url', 3459 product_id: 'product_id', 3460 variant_id: 'variant_id', 3461 id: ['id', 'i_id'], 3462 } 3463 3464 line_item = map(line_item, mapper) 3465 3466 line_item.product_id = line_item.product_id || (old_line_item.product && old_line_item.product.id) || null 3467 line_item.variant_id = line_item.variant_id || (old_line_item.variant && old_line_item.variant.id) || null 3468 line_item.image = line_item.image || (old_line_item.image && old_line_item.image.url) || null 3469 3470 return line_item 3471 3472 } 3473 3474 const mapTransaction = transaction => { 3475 3476 const mapper = { 3477 amount: 'amount', 3478 created_at: 'created_at', 3479 gateway: 'gateway_type', 3480 id: 'id', 3481 status: 'status', 3482 } 3483 3484 transaction = map(transaction, mapper) 3485 3486 return transaction 3487 3488 } 3489 3490 3491</script>
3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501
3502<script> 3503 // Create a link element for the external CSS 3504 var link = document.createElement('link'); 3505 link.rel = 'stylesheet'; 3506 link.type = 'text/css'; 3507 link.href = '/assets/css/shopping_app_banner.css?v1.02'; 3508 3509 // Create a div element for the app banner 3510 var banner = document.createElement('div'); 3511 banner.id = 'shopping_app_download_banner'; 3512 banner.className = 'is_shopping_app'; 3513 banner.innerHTML = ` 3514 <svg onclick="removeShoppingAppDownloadBanner()" xmlns="http://www.w3.org/2000/svg" class="icon-x" width="20" height="20" viewBox="0 0 24 24" stroke-width="2" stroke="#9e9e9e" fill="none" stroke-linecap="round" stroke-linejoin="round"> 3515 <path stroke="none" d="M0 0h24v24H0z" fill="none"/> 3516 <path d="M18 6L6 18" /> 3517 <path d="M6 6l12 12" /> 3518 </svg> 3519 <div class="sa_banner-container"> 3520 <a class="sa_banner-detail" href="https://sauqah.com/app/download" target="_blank"> 3521 <div class="sa_banner-icons"> 3522 3523 <img src="https://cdn.store-assets.com/s/385982/f/17626702.png" width="48px" height="48px" class="sa_banner-border" alt="SAUQAH " loading="lazy"> 3524 3525 3526 <img src="https://resources.easystore.co/storefront/icons/channels/icon-shopping-app.png" class="sa_banner-border" width="48px" height="48px" loading="lazy"> 3527 3528 </div> 3529 <div class="sa_banner-text-wrapper"> 3530 3531 <b>Shopping: Jejak Pesanan Anda</b> 3532 3533 <span class="sa_text-muted">Kedai Dipercayai Anda</span> 3534 </div> 3535 </a> 3536 <a class="sa_btn-download" href="https://sauqah.com/app/download" target="_blank"> 3537 Buka 3538 </a> 3539 </div> 3540 `; 3541 3542 // Function to set a cookie 3543 function _sa_setCookie(name, value, days) { 3544 var date = new Date(); 3545 date.setTime(date.getTime() + (days*24*60*60*1000)); 3546 var expires = "expires=" + date.toUTCString(); 3547 document.cookie = name + "=" + value + ";" + expires + ";path=/"; 3548 } 3549 3550 // Function to get a cookie 3551 function _sa_getCookie(name) { 3552 var nameEQ = name + "="; 3553 var ca = document.cookie.split(';'); 3554 for(var i=0;i < ca.length;i++) { 3555 var c = ca[i]; 3556 while (c.charAt(0) == ' ') c = c.substring(1,c.length); 3557 if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); 3558 } 3559 return null; 3560 } 3561 3562 // Append the banner if the cookie 'isAppDownloadBannerClosed' is not set 3563 if (!_sa_getCookie('isAppDownloadBannerClosed')) document.head.appendChild(link); 3564 if (!_sa_getCookie('isAppDownloadBannerClosed')) document.body.prepend(banner); 3565 3566 3567 function removeShoppingAppDownloadBanner() { 3568 document.querySelector('#shopping_app_download_banner').remove(); 3569 _sa_setCookie('isAppDownloadBannerClosed', true, 2); // Store the banner state in a cookie for 2 days 3570 } 3571</script>
3571 3572 3573</body> 3574</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.