www.girlsafetykit.com
Open in
urlscan Pro
104.18.232.42
Public Scan
Submitted URL: https://girlsafetykit.com/
Effective URL: https://www.girlsafetykit.com/
Submission: On April 04 via api from US — Scanned from US
Effective URL: https://www.girlsafetykit.com/
Submission: On April 04 via api from US — Scanned from US
Form analysis
4 forms found in the DOMGET /search
<form class="header__search tw-relative tw-flex md:tw-w-full tw-h-10 lg:tw-py-[18px]" action="/search" method="get">
<input
class="header__search-input tw-box-border tw-inline-block md:tw-flex-1 tw-m-0 tw-pl-9 tw-pr-4 tw-py-3 tw-text-[13px] tw-leading-4 tw-text-header-search-text-color tw-bg-header-search-bg type-text-font-family tw-rounded-none tw-rounded-l-sm lg:tw-rounded-sm tw-border-0 tw-outline-none lg:tw-w-[232px] "
autocomplete="off" type="text" name="q" placeholder="Search products">
<button type="submit"
class="header__search-icon tw-absolute tw-left-[10px] tw-top-1/2 tw--translate-y-1/2 tw-m-0 tw-p-0 tw-text-header-search-text-5 tw-cursor-pointer tw-text-0 tw-bg-transparent type-text-font-family tw-border-0 tw-outline-none hover:tw-text-header-search-text-color"
tabindex="-1"><svg class="" width="18" height="18" xmlns="http://www.w3.org/2000/svg">
<path opacity=".01" fill="currentColor" d="M0 0h18v18H0z"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.41 13.885a6.923 6.923 0 1 1 .839-.728l3.412 3.413a.554.554 0 0 1-.783.783l-3.462-3.462a.383.383 0 0 1-.006-.006Zm1.713-5.577a5.815 5.815 0 1 1-11.63 0 5.815 5.815 0 0 1 11.63 0Z"
fill="currentColor"></path>
</svg></button>
<span
class="header__search-icon-close tw-hidden tw-h-[18px] tw-w-[18px] tw-rounded-full tw-bg-[#C0C0C0] tw-text-[#FFFFFF] tw-items-center tw-justify-center tw-absolute tw-right-[10px] md:tw-right-0 tw-top-1/2 tw--translate-y-1/2 tw-m-0 tw-p-0 tw-text-header-search-text-5 tw-cursor-pointer tw-text-0 tw-bg-transparent type-text-font-family tw-border-0 tw-outline-none hover:tw-text-header-search-text-color"
tabindex="-2"><svg class="" width="12" height="12" xmlns="http://www.w3.org/2000/svg">
<path
d="M2.746 1.992a.2.2 0 0 0-.283 0l-.471.471a.2.2 0 0 0 0 .283L5.245 6 1.992 9.25a.2.2 0 0 0 0 .283l.471.472a.2.2 0 0 0 .283 0L6 6.753l3.252 3.253a.2.2 0 0 0 .283 0l.472-.472a.2.2 0 0 0 0-.283L6.753 6l3.253-3.253a.2.2 0 0 0 0-.283l-.472-.471a.2.2 0 0 0-.283 0L6 5.245 2.746 1.992z"
fill="currentColor"></path>
</svg></span>
<button type="submit"
class="header__search-submit-btn lg:tw-hidden tw-m-0 tw-px-4 tw-py-[11px] tw-text-sm tw-leading-[18px] tw-text-header-search-btn-text-color tw-bg-header-search-btn-bg type-text-font-family tw-rounded-none tw-rounded-r-sm tw-border-0 tw-outline-none">Search</button>
</form>
GET /search
<form class="header__search tw-relative tw-flex md:tw-w-full tw-h-10 lg:tw-py-[18px]" action="/search" method="get">
<input
class="header__search-input tw-box-border tw-inline-block md:tw-flex-1 tw-m-0 tw-pl-9 tw-pr-4 tw-py-3 tw-text-[13px] tw-leading-4 tw-text-header-search-text-color tw-bg-header-search-bg type-text-font-family tw-rounded-none tw-rounded-l-sm lg:tw-rounded-sm tw-border-0 tw-outline-none lg:tw-w-[232px] "
autocomplete="off" type="text" name="q" placeholder="Search products">
<button type="submit"
class="header__search-icon tw-absolute tw-left-[10px] tw-top-1/2 tw--translate-y-1/2 tw-m-0 tw-p-0 tw-text-header-search-text-5 tw-cursor-pointer tw-text-0 tw-bg-transparent type-text-font-family tw-border-0 tw-outline-none hover:tw-text-header-search-text-color"
tabindex="-1"><svg class="" width="18" height="18" xmlns="http://www.w3.org/2000/svg">
<path opacity=".01" fill="currentColor" d="M0 0h18v18H0z"></path>
<path fill-rule="evenodd" clip-rule="evenodd" d="M12.41 13.885a6.923 6.923 0 1 1 .839-.728l3.412 3.413a.554.554 0 0 1-.783.783l-3.462-3.462a.383.383 0 0 1-.006-.006Zm1.713-5.577a5.815 5.815 0 1 1-11.63 0 5.815 5.815 0 0 1 11.63 0Z"
fill="currentColor"></path>
</svg></button>
<span
class="header__search-icon-close tw-hidden tw-h-[18px] tw-w-[18px] tw-rounded-full tw-bg-[#C0C0C0] tw-text-[#FFFFFF] tw-items-center tw-justify-center tw-absolute tw-right-[10px] md:tw-right-0 tw-top-1/2 tw--translate-y-1/2 tw-m-0 tw-p-0 tw-text-header-search-text-5 tw-cursor-pointer tw-text-0 tw-bg-transparent type-text-font-family tw-border-0 tw-outline-none hover:tw-text-header-search-text-color"
tabindex="-2"><svg class="" width="12" height="12" xmlns="http://www.w3.org/2000/svg">
<path
d="M2.746 1.992a.2.2 0 0 0-.283 0l-.471.471a.2.2 0 0 0 0 .283L5.245 6 1.992 9.25a.2.2 0 0 0 0 .283l.471.472a.2.2 0 0 0 .283 0L6 6.753l3.252 3.253a.2.2 0 0 0 .283 0l.472-.472a.2.2 0 0 0 0-.283L6.753 6l3.253-3.253a.2.2 0 0 0 0-.283l-.472-.471a.2.2 0 0 0-.283 0L6 5.245 2.746 1.992z"
fill="currentColor"></path>
</svg></span>
<button type="submit"
class="header__search-submit-btn lg:tw-hidden tw-m-0 tw-px-4 tw-py-[11px] tw-text-sm tw-leading-[18px] tw-text-header-search-btn-text-color tw-bg-header-search-btn-bg type-text-font-family tw-rounded-none tw-rounded-r-sm tw-border-0 tw-outline-none">Search</button>
</form>
<form class="">
<div class="zb-flex">
<a href="${product.url}?${toQuery({ aid: 'smart_recommend.2.' + data.id, ifb: product.ifb || '', cfb: product.cfb || '', scm: product.scm || data.scm || '', ssp: data.ssp || '' })}" impr="1" imprevt="1" class="zb-w-[132px] zb-mr-4 rtl:zb-ml-4 rtl:zb-mr-0" data-prdct="${product.id}" data-ifb="${product.ifb || ''}" data-cfb="${product.cfb || ''}" data-scm="${product.scm || data.scm || ''}" data-spm="${productIndex}"> <ljs-render layout="container" id="smart_cart_pop_image_${product.id}" template="smart_cart_pop_image_template" manual=""></ljs-render> </a>
<div class="zb-flex zb-flex-col zb-flex-grow zb-justify-between">
<div>
<div class="zb-line-clamp-2 zb-text-sm zb-mb-2">${product.title}</div> <ljs-render layout="container" id="smart_cart_pop_price_${product.id}" template="smart_cart_pop_price_template" manual=""></ljs-render>
</div>
<div>
<div class="zb-relative zb-w-full zb-cursor-pointer">
<div class="zb-border zb-border-solid zb-border-[#eee] zb-px-3 zb-py-[10px] zb-flex zb-items-center zb-justify-between zb-font-semibold zb-text-sm zb-rounded-sm"
@tap="smart_pop_variant-select-${product.id}.toggleClass(class=zb-rotate-180);smart_cart_pop_variant_${product.id}_mobile.toggleClass(class=zb-hidden);smart_cart_pop_variant_${product.id}_pc.toggleClass(class=smart_cart_pop_variant_pc_show,force=true);smart_cart_pop_variant_modal_${product.id}.open"
spz-if="${!!(product.options && product.options.length && product.options.length > 0) && data.config.variant_select_visible}"> <ljs-render manual="" layout="container" id="smart_cart_pop_variant_text_${product.id}"
template="smart_cart_pop_variant_text_template"></ljs-render> <svg id="smart_pop_variant-select-${product.id}" width="12" height="8" class="zb-ml-2" viewBox="0 0 12 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M6.00002 7.06738C6.19244 7.06775 6.38498 6.99453 6.5318 6.84772C6.54504 6.83447 6.55769 6.82086 6.56973 6.8069L11.1251 2.25152C11.418 1.95863 11.418 1.48375 11.1251 1.19086C10.8322 0.897968 10.3573 0.897968 10.0645 1.19086L6.00003 5.25529L1.9356 1.19086C1.64271 0.897968 1.16784 0.897968 0.874943 1.19086C0.58205 1.48375 0.58205 1.95863 0.874943 2.25152L5.43033 6.8069C5.44237 6.82086 5.45502 6.83447 5.46826 6.84772C5.61507 6.99453 5.8076 7.06775 6.00002 7.06738Z"
fill="#0A1533"></path>
</svg> </div> <ljs-lightbox layout="nodisplay" disable-unmount="" class="smart_cart_pop_lightbox_pc" id="smart_cart_pop_variant_modal_${product.id}" @close="smart_pop_variant-select-${product.id}.toggleClass(class=zb-rotate-180);">
<div id="smart_cart_pop_variant_${product.id}_pc" class="zb-hidden"><ljs-variants id="smart_cart_pop_variants_${product.id}"
class="md:!zb-absolute md:zb-top-[50px] md:zb-w-full md:zb-left-0 md:zb-z-30 md:zb-bg-white zb-max-h-[280px] zb-overflow-y-auto md:zb-shadow-pop" layout="container" template="smart_cart_pop_variant_template"
onclick="event.stopPropagation()" disabled-dj-event="" interference=""> </ljs-variants></div>
</ljs-lightbox>
</div>
<div class="zb-mt-3"> <button product-id="${product.id}" id="smart_cart_pop_atc_btn_${product.id}"
class="zb-flex zb-items-center zb-justify-center zb-w-full zb-text-white zb-py-[10px] zb-h-9 zb-text-xs zb-font-normal zb-border-none zb-rounded-[4px] smart_cart_pop_atc_btn_bg" type="button" role="addToCart"
@tap="smart_cart_pop_loading_${product.id}.toggleClass(class=zb-hidden);smart_cart_pop_atc_${product.id}.toggleClass(class=zb-hidden);smart_cart_pop_atc_btn_${product.id}.toggleClass(class=zb-pointer-events-none);custom-func.addATCHook(activity_id='${data.id}',ifb='${product.ifb}',cfb='${product.cfb}',scm='${product.scm || data.scm}',ssp='${data.ssp}',spm='${data.spmBase}.${productIndex}')">
<ljs-render layout="container" id="smart_cart_pop_atc_${product.id}" template="smart_cart_pop_atc_template" mamual="" class="notranslate"> </ljs-render>
<div id="smart_cart_pop_added_${product.id}" class="zb-hidden"><span class="zb-flex zb-justify-center zb-gap-1"><svg width="14" height="15" viewBox="0 0 16 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
d="M8 16.5006C3.58171 16.5006 0 12.9183 0 8.5C0 4.08171 3.58171 0.5 8 0.5C12.4183 0.5 16 4.08171 16 8.5C16 12.9183 12.4183 16.5006 8 16.5006ZM8 2.04344C4.21314 2.04344 1.54287 4.71371 1.54287 8.50057C1.54287 12.2874 4.21314 14.9577 8 14.9577C11.7869 14.9577 14.4571 12.2874 14.4571 8.50057C14.4571 4.71371 11.7869 2.04344 8 2.04344ZM7.26057 11.1909L7.12229 11.3286L7.09543 11.3017C7.02286 11.336 6.94286 11.3577 6.85714 11.3577C6.73543 11.3577 6.62857 11.3109 6.536 11.2463L6.52229 11.2594L6.45371 11.1909C6.45314 11.1903 6.45314 11.1903 6.45257 11.1897L4.09771 8.83486L4.90629 8.02686L6.85714 9.97771L11.1629 5.67143L11.9714 6.48L7.26171 11.1897C7.26114 11.1903 7.26114 11.1903 7.26057 11.1909Z"
fill="white"></path>
</svg>Added</span></div>
<div id="smart_cart_pop_loading_${product.id}" class="zb-hidden">
<div class="smart_cart_pop_loading"></div>
</div>
</button> </div>
</div>
</div>
</div>
<div id="smart_cart_pop_variant_${product.id}_mobile" class="zb-hidden md:zb-hidden"><ljs-variants id="smart_cart_pop_variants_${product.id}"
class="md:!zb-absolute md:zb-top-[50px] md:zb-w-full md:zb-left-0 md:zb-z-30 md:zb-bg-white zb-max-h-[280px] zb-overflow-y-auto md:zb-shadow-pop" layout="container" template="smart_cart_pop_variant_template" onclick="event.stopPropagation()"
disabled-dj-event="" interference=""> </ljs-variants></div>
</form>
<form class="modal__form-style_template8" id="modal__form" style="background: rgba(255,255,255,1) url() no-repeat scroll center center/cover; width: 550px; ">
<div class="modal__image-wrapper" style="background: rgba(208,2,27,1) url(https://cdn.shoplazza.com/0b42e39c23615919b06cce0a0f9db7d9.png) no-repeat scroll center center/cover; ">
<div class="modal__title">
<p style="text-align: center;"><span style="font-family: 'arial black', 'avant garde'; font-size: 22px;"><span style="text-decoration: underline; font-weight: bold; color: #f1f6f6;">SALE 50% OFF</span></span></p>
</div>
<div class="modal__description">
<p><strong><span style="color: #e5e5e6; font-family: arial, helvetica, sans-serif;"><span style="font-size: 16px;">Shipping also 50% OFF</span></span></strong></p>
<p><span style="color: #e5e5e6; font-family: arial, helvetica, sans-serif;"><span style="font-size: 16px;">For orders above $50</span></span></p>
<p><span style="color: #e5e5e6; font-family: arial, helvetica, sans-serif;"><span style="font-size: 16px;">- WOMEN'S DAY -</span></span></p>
</div>
<div class="countdown__container notranslate">
<div class="day" style="display: none;">
<span class="day__word1 countdown__word" style="color: #000; background-color: #ffffff; ">0</span>
<span class="day__word2 countdown__word" style="color: #000; background-color: #ffffff; ">0</span>
<span class="countdown__colon" style="color: #ffffff; ">:</span>
</div>
<div class="hour">
<span class="hour__word1 countdown__word" style="color: #000; background-color: #ffffff; ">0</span>
<span class="hour__word2 countdown__word" style="color: #000; background-color: #ffffff; ">6</span>
<span class="countdown__colon" style="color: #ffffff; ">:</span>
</div>
<div class="minute">
<span class="minute__word1 countdown__word" style="color: #000; background-color: #ffffff; ">5</span>
<span class="minute__word2 countdown__word" style="color: #000; background-color: #ffffff; ">7</span>
<span class="countdown__colon" style="color: #ffffff; ">:</span>
</div>
<div class="second">
<span class="second__word1 countdown__word" style="color: #000; background-color: #ffffff; ">0</span>
<span class="second__word2 countdown__word" style="color: #000; background-color: #ffffff; ">9</span>
</div>
</div>
</div>
<div class="modal__content">
<div id="modal__close-btn" class="d-flex align-items-center justify-content-center modal__button " style="background-color: #000; border-color: #000; ">
<p><span style="color: #ffffff; font-size: 22px; font-weight: bold;">SHOP NOW</span></p>
</div>
<div class="modal__close-icon">×</div>
</div>
</form>
Text Content
GIRLS-DEFENSE Search * Log in * Create an account 0 * Home * WOMEN'S DAY SALE :) * Limited Editions * Best Sellers * Custom Designs * New Arrivals * Delivery and Availability * Refund Policy * Contact Us * More links * Home * WOMEN'S DAY SALE :) * Limited Editions * Best Sellers * Custom Designs * New Arrivals * Delivery and Availability * Refund Policy * Contact Us * More links Refund Policy Contact Us GIRLS-DEFENSE * Log in * Create an account 0 Search * Home * WOMEN'S DAY SALE :) * Limited Editions * Best Sellers * Custom Designs * New Arrivals * Delivery and Availability * Refund Policy * Contact Us Log in WOMEN'S DAY SALE :) 50% discounts + 50% off on shipping for orders above $50 SHOP NOW CUSTOM DESIGNS For custom designs and enquiries contact support@girls-defense.com Click me * 1 * 2 BEST SELLERS THE TOTE FASHION BAG 36-IN-1 SELF DEFENSE KEYCHAIN WITH LIMITED FASHION BAG (NEW) (33) From $39.99 $99.99 Save $60.00 Save $60.00 VALENTINES ST!TCH & ANGEL THEME 35-IN-1 SELF DEFENSE KEYCHAIN WITH JUMBO LOVE PLUSHIES! From $29.98 $49.99 Save $20.01 Save $20.01 N!GHTM@RE BEFORE CHRISTMAS THEME 35-IN-1 SELF DEFENSE KEYCHAIN WITH FIGURES AND SPECIALS (40) From $29.98 $49.99 Save $20.01 Save $20.01 ST@RBUCKS THEME 36-IN-1 SELF DEFENSE KEYCHAIN WITH ST@RBUCKS TUMBLER (27) From $29.98 $49.99 Save $20.01 Save $20.01 C@RE BE@RS THEME 35-IN-1 SELF DEFENSE KEYCHAIN WITH HANDBAGS (34) From $29.98 $49.99 Save $20.01 Save $20.01 WEDN3SDAY THEME 35-IN-1 SELF DEFENSE KEYCHAIN WITH BIG FUNKO WEDN3SDAY PLAYING VIOLIN (38) From $29.98 $49.99 Save $20.01 Save $20.01 (EASTER) ST!TCH BUNNY SELF DEFENSE KEYCHAIN SET WITH PLUSHIE, BAGS AND TUMBLER From $29.98 $49.99 Save $20.01 Save $20.01 ST!TCH THEME 38-IN-1 SELF DEFENSE KEYCHAIN WITH BIG FUNKO FIGURE, HANDBAGS, TUMBLERS, AND SPECIAL COLLECTIONS (43) From $29.98 $49.99 Save $20.01 Save $20.01 View more NEW ARRIVALS THE BUCKET FASHION BAG 36-IN-1 SELF DEFENSE KEYCHAIN WITH LIMITED FASHION BAG (NEW) (27) From $39.99 $99.99 Save $60.00 Save $60.00 SUP3RNATURAL THEME 35-IN-1 SELF DEFENSE KEYCHAIN WITH BIG FUNKO DEAN WINCHESTER From $29.98 $49.99 Save $20.01 Save $20.01 (EASTER) ST!TCH BUNNY SELF DEFENSE KEYCHAIN SET WITH PLUSHIE, BAGS AND TUMBLER From $29.98 $49.99 Save $20.01 Save $20.01 VALENTINES M!CKEY & M!NN!E THEME 35-IN-1 SELF DEFENSE KEYCHAIN WITH JUMBO M!CKEY BUCKET From $29.98 $49.99 Save $20.01 Save $20.01 SUPER MAX 21-IN-1 SELF DEFENSE SET IN TWO COLORS (34) $64.98 $109.98 Save $45.00 Save $45.00 WEDN3SDAY THEME 35-IN-1 SELF DEFENSE KEYCHAIN WITH BIG FUNKO WEDN3SDAY PLAYING VIOLIN (38) From $29.98 $49.99 Save $20.01 Save $20.01 FRENCH FASHION THEME 21-IN-1 SELF DEFENSE KEYCHAIN WITH DOUBLE-C BAG (NEW) (6) From $39.99 $99.99 Save $60.00 Save $60.00 THE L FASHION BAG 36-IN-1 SELF DEFENSE KEYCHAIN WITH STYLISH WALLET (NEW) (30) From $44.99 $99.99 Save $55.00 Save $55.00 View more TIKTOK FAVORITES (NEW) COW PRINT 35-IN-1 SELF DEFENSE KEYCHAIN From $29.98 $49.99 Save $20.01 Save $20.01 BUTTERFLY AND FASHION BAGS SELF DEFENSE KEYCHAIN SET WITH TUMBLER From $29.98 $49.99 Save $20.01 Save $20.01 SUNFLOWER 36-IN-1 SELF DEFENSE KEYCHAIN WITH EXTRA SUNFLOWER TUMBLER AND TOTE BAG (NEW) (35) From $42.97 $79.99 Save $37.02 Save $37.02 NEW 18-IN-1 FASHION SELF DEFENSE KEYCHAIN SET (36) From $29.99 $46.89 Save $16.90 Save $16.90 (NEW) EVERYTHING FRENCH L AND FASHION BAGS SELF DEFENSE KEYCHAIN SET From $29.98 $49.99 Save $20.01 Save $20.01 WEDN3SDAY THEME 35-IN-1 SELF DEFENSE KEYCHAIN WITH BIG FUNKO WEDN3SDAY PLAYING VIOLIN (38) From $29.98 $49.99 Save $20.01 Save $20.01 SUPER MAX 21-IN-1 SELF DEFENSE SET (34) $64.98 $109.98 Save $45.00 Save $45.00 FAIRY PINK 15-IN-1 SELF DEFENSE KEYCHAIN (22) $53.89 $79.99 Save $26.10 Save $26.10 View more HOT SELLINGS FASHION BAGS! From $9.99 $21.99 Save $12.00 Save $12.00 TUMBLERS & STORAGE BUCKETS $14.99 $39.99 Save $25.00 Save $25.00 SPICY FOR WOMEN From $9.99 $14.99 Save $5.00 Save $5.00 MINI RECHARGEABLE TZ WITH LED FLASHLIGHT From $14.99 $19.99 Save $5.00 Save $5.00 KITTY PAW $7.99 $14.99 Save $7.00 Save $7.00 DISCREET PEN $14.99 $19.99 Save $5.00 Save $5.00 SOS ALARM WITH LED FLASHLIGHT $12.99 $20.99 Save $8.00 Save $8.00 SD STICKS $7.99 $14.99 Save $7.00 Save $7.00 DISCREET KEY $5.99 $10.99 Save $5.00 Save $5.00 WIRELESS LOCATION TRACKER $14.99 $19.99 Save $5.00 Save $5.00 L0UIS V LEATHER WRISTLET & LIPSTICK BAG (LIMITED) From $5.99 $15.99 Save $10.00 Save $10.00 MINI SUITCASE From $3.99 $6.99 Save $3.00 Save $3.00 View more CUSTOMER REVIEWS " Girls-defense has truly saved me from danger threats. Every girl MUST buy one" * KATE M. 2 days ago Every girl MUST buy this!! Absolutely useful and stunning, it has already protected me from several real encounters. 10/10 will buy again $38.98 $60.99 Buy it * BRYAN H. 2 days ago As a veteran dad, I guarantee you this is the best solution to keep your family safe. Compact with strong performance, great all in one self defense kit. $29.98 $49.99 Buy it * CHLOE R. 3 days ago Seriously best buy EVER. Every lady has the right to protect herself. Don't risk urself with suspicious threats or potential dangers. We NEED this. $54.99 $116.98 Buy it GLOBAL SHIPPING CUSTOMER SERVICE Short content about your store SECURE PAYMENT Short content about your store CONTACT LIVE WHATSAPP Short content about your store Subscribe Thanks for subscribing Email and contacts +1 (213) 254-8350 support@girls-defense.com © 2024 girls-defense 111 GIFTS POINTS S***e recently purchased S***e recently purchased Item has been added ${(function(){ const products = data.products; const getDefaultVariant = function(product){ if (product.min_price_variant.available){ return product.min_price_variant; }else { const avail_variants = product.variants.filter(function(variant){ return variant.available; }); if (avail_variants.length) { return avail_variants[0]; } } }; const toQuery = obj => Object.keys(obj) .map(k => Array.isArray(obj[k]) ? obj[k].map(v => `${k}[]=${encodeURIComponent(v)}`).join('&') : `${k}=${encodeURIComponent(obj[k])}` ) .join('&'); const getDefaultTrackParams = function(product, index){ const variant = getDefaultVariant(product); const params = { aid: 'smart_recommend.2.' + data.id, scm: product.scm || data.scm || '', spm: data.spmBase + '.' + index, ssp: data.ssp || '', }; const trackParams = Object.keys(params).map(function(key){ return params[key]; }).join('__'); return trackParams; }; const hasMore = (data.products.length - data.target_top_product_num - data.page * data.limit) === 0; return ` ${(function(){ return ` ${data.config.pop_title} ${data.rebate_tips || ''} `; })()} ${product.title} Added `; })()} class SpzCustomComponent extends SPZ.BaseElement { constructor(element) { super(element); this.templates_ = null; this.container_ = null; this._atcLineItem = {}; this.cart_ = {}; this.top_product_ids_ = []; this.products_ = []; this.activityId_ = null; this.rendered_ = false; this.myInterceptor_ = null; this.i18n_ = {}; this.config_ = {}; this.page_ = 1; this.limit_ = 10; this.loading_ = false; } static deferredMount() { return false; } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback() { this.templates_ = SPZServices.templatesForDoc(this.element); this.setAction_(); } mountCallback() { console.log('pop mounted'); this.i18n_ = window.smartRecommendI18n && window.smartRecommendI18n[document.documentElement.lang || 'en-US'] || {}; const cartPopRenderEl = document.getElementById("smart_cart_pop_render"); const modalEl = document.getElementById("smart_cart_pop_modal"); const spmBase = `smart_recommend_2`; const extra = { spmBase: spmBase, i18n: this.i18n_, }; const that = this; document.addEventListener('dj.addToCart', (event) => { try { const e = event.detail; if (e.source === 'buy_now' || window.__upsell_block || this.rendered_) return; that.fetchActivityData({product_id: e.product_id, variant_id: e.variant_id}).then(data => { if (!data || !data.products || !data.products.length) return; that.config_ = data.config; const recommendStyle = document.createElement('style'); recommendStyle.innerHTML = ` #plugin_recommend_atc_pop { display: none !important; } `; document.head.appendChild(recommendStyle); if (data.config.pop_frequency === 'once' && window.sessionStorage.getItem('smart_pop_times') > 0) return; SPZ.whenApiDefined(cartPopRenderEl).then(function(api){ api.render(Object.assign({}, data, extra), true).then(function() { that.rendered_ = true; if (data.products.length) { const headEl = document.getElementById("smart_cart_pop_head_render"); if (headEl) { SPZ.whenApiDefined(headEl).then(function(head){ head.render({ data: data }); }); } SPZ.whenApiDefined(modalEl).then(function(api){ that.impressListen('#smart_cart_pop_activity', function(){ that.trackPluginImpression_(data); }); api.open(); const intersectionObserver = new IntersectionObserver( function (entries) { if (entries[0].intersectionRatio > 0){ !that.loading_ && (that.products_.length - that.target_top_product_num_) === that.page_ * that.limit_ && that.viewMore(); } }, { threshold: [0.1] } ); intersectionObserver.observe( document.querySelector('#smart_cart_pop_view_more_text') ); }); } }) }); }) } catch (e) { console.error(e); } }); } unmountCallback() { } viewMore () { const cartPopRenderEl = document.getElementById("smart_cart_pop_render"); const that = this; const data = {}; SPZ.whenApiDefined(cartPopRenderEl).then(function(api){ that.fetchActivityData({ page: that.page_ + 1, limit: that.limit_ }).then(function(data) { data.products = that.products_; data.target_top_product_num = that.target_top_product_num_; data.i18n = that.i18n_; data.spmBase = `smart_recommend_2`; api.render(data); }) }) } fetchActivityData(data) { const that = this; if (data.product_id) { that._atcLineItem = data; } that.loading_ = true; return that.getCart().then(cart => { that.cart_ = cart.cart; return fetch(window.SHOPLAZZA.routes.root + "/api/possum/recommend_activities", { method: "POST", headers: { "Content-Type": "application/json", "store-id": window.SHOPLAZZA.shop.shop_id, }, body: JSON.stringify({ "show_type": 2, "line_item": { "product_id": that._atcLineItem.product_id, "variant_id": that._atcLineItem.variant_id, }, line_items: cart.cart.line_items, "page": data.page || 1, "limit": data.limit || 10, }) }).then(function(res){ if(res.ok){ return res.json(); } }).then(function(data){ data.cart = cart.cart; if (data.page === 1) { that.target_top_product_num_ = data.target_top_product_num || 0; } that.products_ = that.products_.concat(data.products || []); that.page_ = data.page || 1; that.limit_ = data.limit || 10; return data; }).catch(function(e){ console.log(e); }).finally(function(){ that.loading_ = false; }) }); }; setAction_() { this.registerAction('changeBannerColor', (data) => { if (!data.args.data || !data.args.data.data || !data.args.data.data.data) return false; const config = data.args.data.data.data.config; const bannerBgEl = document.querySelector('.smart_cart_pop_banner_bg'); if (bannerBgEl && config) { bannerBgEl.style.background = config.banner_bg_color; bannerBgEl.style.color = config.banner_text_color; } }); this.registerAction('handleProductChange', (data) => { const that = this; const imageEl = document.getElementById(`smart_cart_pop_image_${data.args.data.product_id}`); SPZ.whenApiDefined(imageEl).then(function(api){ api.render({ data: data.args.data, config: that.config_ }); }); const atcTextEl = document.getElementById(`smart_cart_pop_atc_${data.args.data.product_id}`); SPZ.whenApiDefined(atcTextEl).then(function(api){ api.render({ data: data.args.data, defaultText: data.args.defaultText, soldOutText: that.i18n_.sold_out }); }); if (data.args.data.variant.available) { document.getElementById(`smart_cart_pop_atc_btn_${data.args.data.product_id}`).classList.remove('zb-pointer-events-none'); } else { document.getElementById(`smart_cart_pop_atc_btn_${data.args.data.product_id}`).classList.add('zb-pointer-events-none'); } }); this.registerAction('handleProduct', (detail) => { const that = this; this.renderProductsForm_(detail.args.data.data); }); this.registerAction('addATCHook', (data) => { const params = data.args; this.myInterceptor_ = window.djInterceptors && window.djInterceptors.track.use({ event: 'dj.addToCart', params: { aid: 'smart_recommend.2.' + params.activity_id, ssp: params.ssp, scm: params.scm, cfb: params.cfb, spm: `..${window.SHOPLAZZA.meta.page.template_name}.${params.spm}`, }, once: true }); }); this.registerAction('handleAtcSuccess', (detail) => { detail.args.data.product = detail.args.data.product || {}; detail.args.data.variant = detail.args.data.variant || {}; const defParams = detail.args.product.split('__'); const product_id = detail.args.data.product.id; const product_title = detail.args.data.product.title; const variant_id = detail.args.data.variant.id; const price = detail.args.data.variant.price; const aid = defParams[0]; const ifb = detail.args.data.product.ifb; const cfb = detail.args.data.product.cfb; const scm = defParams[1]; const spm = defParams[2]; const ssp = defParams[3]; const params = { id: product_id, product_id: product_id, number: 1, name: product_title, variant_id: variant_id, childrenId: variant_id, item_price: price, source: 'add_to_cart', _extra: { aid: aid, ifb: ifb, cfb: cfb, scm: scm, spm: `..${window.SHOPLAZZA.meta.page.template_name}.${spm}`, ssp: ssp, } }; const activity_id = `${detail.args.activity_id}`; const target_drive_way = detail.args.target_drive_way; document.getElementById(`smart_cart_pop_loading_${product_id}`).classList.add('zb-hidden'); document.getElementById(`smart_cart_pop_added_${product_id}`).classList.remove('zb-hidden'); setTimeout(() => { document.getElementById(`smart_cart_pop_added_${product_id}`).classList.add('zb-hidden'); document.getElementById(`smart_cart_pop_atc_${product_id}`).classList.remove('zb-hidden'); document.getElementById(`smart_cart_pop_atc_btn_${product_id}`).classList.remove('zb-pointer-events-none'); }, 1000); this.tranckAddToCart(params); if (target_drive_way === 'rebate') { const bannerEl = document.getElementById(`smart_cart_pop_banner`); this.getRecommendInfo(activity_id).then(res => { if (res && res.rebate_tips) { bannerEl.innerHTML = res.rebate_tips; } }) } }); this.registerAction('handleCartSummary', (event) => { const that = this; const checkoutButtonEle = document.getElementById("smart_cart_pop_checkout_button"); if (checkoutButtonEle) { SPZ.whenApiDefined(checkoutButtonEle).then(function(api){ api.render({ i18n: that.i18n_ }, false); }); } const tipEl = document.getElementById("smart_cart_pop_tip_info"); const cart = event && event.args && event.args.data && event.args.data.data; if (!tipEl || !cart) return; let total_price = cart.total_price; if (!total_price) { SPZ.whenApiDefined(tipEl).then(function(api){ api.render({ total_price: total_price, i18n: that.i18n_ }, false); }); } else { this.getBindDiscount_(cart.line_items).then(res => { if (res && res.discount_code){ const total = cart.line_price - cart.total_discount - res.bundle_discount_value; if (total > 0) { total_price = total; } else { total_price = 0; } } SPZ.whenApiDefined(tipEl).then(function(api){ api.render({ total_price: total_price, i18n: that.i18n_ }, false); }); }) } }); this.registerAction('open', () => { window.sessionStorage.setItem('smart_pop_times', Number(window.sessionStorage.getItem('smart_pop_times')) + 1); }); this.registerAction('close', () => { this.rendered_ = false; this.products_ = []; window.djInterceptors && window.djInterceptors.track.eject(this.myInterceptor_); }); } getCart() { return fetch(`${window.SHOPLAZZA.routes.root || ''}/api/cart`, { method: 'GET', headers: { 'Content-Type': 'application/json; charset=UTF-8', }, }).then(res => res.json()) } getRecommendInfo (activity_id) { return this.getCart().then(cart => { this.cart_ = cart.cart; return fetch(`${window.SHOPLAZZA.routes.root || ''}/api/possum/recommend_info`, { method: 'POST', headers: { 'Content-Type': 'application/json; charset=UTF-8', }, body: JSON.stringify({ show_type: 2, rule_id: `${activity_id}`, line_items: cart.cart.line_items, line_item: this._atcLineItem, }) }).then(res => res.json()) }) } renderProductsForm_(data) { const products = data.products; const listPopRenderEl = document.getElementById("smart_cart_pop_render"); if (!listPopRenderEl) return; listPopRenderEl.querySelectorAll('.smart_cart_pop_atc_btn_bg').forEach(function(el){ el.style.background = data.config.add_to_cart_button_color; }); products.forEach(function(product){ const productId = product.id; const productFormEls = listPopRenderEl.querySelectorAll(`ljs-product-form[product-id="${productId}"]`); let variantsEl = listPopRenderEl.querySelectorAll(`ljs-product-form[product-id="${productId}"] #smart_cart_pop_variant_${productId}_mobile ljs-variants`); if (window.innerWidth > 768) { variantsEl = listPopRenderEl.querySelectorAll(`ljs-product-form[product-id="${productId}"] #smart_cart_pop_variant_${productId}_pc ljs-variants`); } productFormEls.forEach(function(el){ SPZ.whenApiDefined(el).then(function(api){ api.setProduct(product); }); }); variantsEl.forEach(function(el){ SPZ.whenApiDefined(el).then(function(api){ api.handleRender(product); }); }) }); } tranckAddToCart(detail) { if (window.$) { window.$(document.body).trigger('dj.addToCart', detail); } } trackPluginImpression_(rule){ if (window.sa && window.sa.track) { window.sa.track("module_impressions", { aid: `smart_recommend.2.${rule.id}` }); } } getBindDiscount_(carts) { let bundle_sale_ids = []; try { bundle_sale_ids = sessionStorage['bundle_sale_ids'] && JSON.parse(sessionStorage['bundle_sale_ids']).filter((item, index, arr) => arr.indexOf(item, 0) === index).slice(-5); } catch (err) { console.error(err); } if (!carts.length) { Promise.resolve(); } return fetch(`${window.SHOPLAZZA.routes.root || ''}/api/bundle-sales/cart`, { method: 'POST', headers: { 'Content-Type': 'application/json; charset=UTF-8', 'store-id': window.SHOPLAZZA.shop.shop_id, }, body: JSON.stringify({ cart: carts, action_type: 'cart', bundle_sale_ids }) }).then(res => res.json()) } impressListen(selector, cb) { const el = document.querySelector(selector); const onImpress = (e) => { if (e) { e.stopPropagation(); } cb(); }; if (el && !el.getAttribute('imprsd')) { el.addEventListener('impress', onImpress) } else if (el) { onImpress(); } } } SPZ.defineElement('spz-custom-smart', SpzCustomComponent); ${function(){ return ` ${data.data.rebate_tips || ''} `; }()} ${function(){ const getImageHeight = function(image){ const width = image.width || 500; const height = image.height || 500; const image_size = data.config.image_size || 0; let ratio = 0; if(image_size == 0){ ratio = (height / width).toFixed(2); }else if(image_size == 1){ ratio = 1.5; } return 132 * ratio; }; const image = data.data.variant.image || data.data.product.image; return ` `; }()} ${(function(){ const product = data.product; const avail_variants = product.variants.filter(function(variant){ return variant.available; }); const selected_variant = product.min_price_variant.available ? product.min_price_variant : avail_variants.length && avail_variants[0]; return ` ${option.name} ${ option.values.map(function(value, index){ const checked = selected_variant["option"+option.position] == value ? "checked": ""; return ` ${value} ` }).join("") } ` })()} ${(function(){ const variant = data.variant; return ` `; })()} ${(function(){ const variant = data.variant; return ` ${ variant.options.map(function(option){ return option.value; }).join("/") || 'Not exist' } `; })()} ${(function(){ const variant = data.data && data.data.variant; const defaultText = data.defaultText || 'Add To Cart'; const text = (!variant || variant.available) ? defaultText: data.soldOutText; return ` ${text} `; })()} ${(function(){ let cart = data; if(data.data) { cart = data.data; } return ` ${cart.item_count >=0 ? cart.item_count : '..'} `; })()} ${(function(){ return ` ${data.i18n.checkout} `; })()} SALE 50% OFF Shipping also 50% OFF For orders above $50 - WOMEN'S DAY - 0 0 : 0 6 : 5 7 : 0 9 SHOP NOW × See detail See detail $0.00 Quantity 1 Add to cart