${(function(){ const get_random_six_digits = () => { return Math.random().toString().slice(-6) }; const wholesale_enabled = false; const setting_product_image_display = "natural"; const product_image = data.image; const secondary_image = data.secondImage; const image_width = product_image.width; let image_height = product_image.height; if(setting_product_image_display == '100%'){ image_height = image_width }else if(setting_product_image_display == '133.33%'){ image_height = image_width * 1.3333; }; const product_image_hover_on = true && !!secondary_image.src; const has_save_label = true && ((+data.compare_at_price) > (+data.price)); const is_single_variant = data.variants.length == 1; const min_price_variant_href = (data.min_price_variant && data.min_price_variant.available) ? data.min_price_variant.withinUrl : data.withinUrl; const retail_price_max = data.retail_price_max || data.compare_at_price_max; const THUMBNAILS_MAX_SIZE = 3; const thumbnails = data.thumbVariants.slice(0, THUMBNAILS_MAX_SIZE); const image_wrap_id = 'image_wrap_' + get_random_six_digits(); const image_carousel_id = 'image_carousel_' + get_random_six_digits(); const thumbnails_selector_id = 'thumbnails_selector_' + get_random_six_digits(); const form_id = 'form_' + get_random_six_digits(); const mixed_wholesale = data.mixed_wholesale; return `
${ data.available ? `${ (+data.compare_at_price > +data.price) ? `Save ${ data.off_ratio }% ` : '' }` : "Sold out" }
Mixed Lot
${data.title}
${ data.price_min != data.price_max ? `from
` : `
` }
+${data.remainInvisibleThumbCount}
Add to cart
Add to cart
Choose an option
${variant.title}/
Sold out
` })()}
Enjoy Free Express Shipping on orders over $30
Hassle-free returns. 30-day postage paid returns
Enjoy Free Express Shipping on orders over $30
Hassle-free returns. 30-day postage paid returns
${function(){ let hour = data.d * 24 + data.h; if(hour < 10){ hour = '0' + hour; } return `
End in
${data.dd}
D
${data.hh}
:
${hour}
:
${data.mm}
:
${data.ss}
.
${data.SSS}
` }()}
${function() { const images = data.images || []; const selectedVariant = data.variants.find(v => (v.available && v.is_hit_discount == true)) || data.variants[0]; const selectedIndex = !!selectedVariant ? images.findIndex(img => img.src === (selectedVariant.image && selectedVariant.image.src)) : 0; const initialSlide = selectedIndex === -1 ? 0 : selectedIndex; return `
${images.map((image, index) => `
`).join('')}
${images.map(image => { const imageWidth = image.width || 450; const imageHeight = image.height || 450; return `
` }).join('')}
`; }()}
${function() { const productData = data; const limit_purchase = data.limit_purchase || 0; let product_change_event = ''; let mouse_over_event = ''; let mouse_out_event = ''; const product_options = productData.options.filter(Boolean) || []; for (let opt of product_options) { const nameEscape = opt.name.replace(/\/|\\|\s|\'|\"|`|\<|\>/g, ''); product_change_event = product_change_event + `apps-discount-quick-shop-selected-variant-${opt.id}.rerender(data=event.selectedValues.${opt.name});`; mouse_over_event = mouse_over_event + `@${nameEscape}Mouseover="apps-discount-quick-shop-selected-variant-${opt.id}.rerender(data=event);"`; mouse_out_event = mouse_out_event + `@${nameEscape}Mouseout="apps-discount-quick-shop-selected-variant-${opt.id}.rerender(data=event.selectData.${opt.name});"`; } const selectedVariant = productData.variants.find(v => (v.available && v.is_hit_discount == true)) || productData.variants[0]; const statusLan = ((selectedVariant && !selectedVariant.available) || (!selectedVariant && !productData.available)) ? "Sold out" : "Add to cart"; const status = ( (selectedVariant && !selectedVariant.available) || (!selectedVariant && !data.available)) ? 'soldout' : 'available'; return `
${data.title || data.brief}
Add ${productData.discount_min_purchase_qty} items for discount
Quantity
${function() { const selectedVariant = data.variants.find(v => v.available && v.is_hit_discount == true) || data.variants[0]; const statusLan = ( (selectedVariant && !selectedVariant.available) || (!selectedVariant && !data.available)) ? "Sold out" : "Add to cart"; return `
${statusLan}
Add
`; }()}
`; }()}
${function() { const selectedVariant = data.variant || data.variants[0]; const image = selectedVariant.image || data.product.image; const imageWidth = image?.width || 120; const imageHeight = image?.height || 120; return `
` }()}
${function() { const defaultVariant = data.variants?.find(v => (v.available && v.is_hit_discount == true)) || data.variants?.[0]; const selectedVariant = data.variant || defaultVariant; const isHasRrice = (selectedVariant.price || selectedVariant.price == 0) ? true : false; if(selectedVariant.flash_sale_info && selectedVariant.flash_sale_info.discount_price) { selectedVariant.price = selectedVariant.flash_sale_info.discount_price; } if(data.flash_sale_info && data.flash_sale_info.discount_price) { data.price = data.flash_sale_info.discount_price; } return !!selectedVariant ? `
` : `
-
`; }()}
${function(){ const defaultVariant = data.variants?.find(v => (v.available && v.is_hit_discount == true)) || data.variants?.[0]; const selectedVariant = data.variant || defaultVariant; let show_flashsale_limit_tip = false; let limit_user_product_discount; if(selectedVariant.flash_sale_info && selectedVariant.flash_sale_info?.limit_user_product_type != "LUPT_NO_LIMIT" && selectedVariant.flash_sale_info?.limit_user_product_discount > 0) { show_flashsale_limit_tip = true; limit_user_product_discount = selectedVariant.flash_sale_info?.limit_user_product_discount; } if(data.flash_sale_info && data.flash_sale_info?.limit_user_product_type != "LUPT_NO_LIMIT" && data.flash_sale_info?.limit_user_product_discount > 0) { show_flashsale_limit_tip = true; limit_user_product_discount = data.flash_sale_info?.limit_user_product_discount; } return `
Promo products limited to ${limit_user_product_discount} item per person
` }()}
${function() { const currentProduct = data.product; return (currentProduct.options || []).map((option, index) => { const optionName = option.name || ''; const optionId = option.id || ''; const position = `option${index + 1}`; return `
${optionName}:
${option.values.map((value,idx) => { const selected = data.product.defaultSelectValues?.[optionName] == value ? 'checked' : ''; return `
${value}
`; }).join('')}
`; }).join('') }()}
${function() { const value = (data.originData && data.originData.value) || data.value; const isHasValue = value ? true : false; return `
${value}
` }()}
The activity inventory has been sold out, flash sale discount will not be applied
Continue Shopping
class SpzCustomDiscountAtcAction extends SPZ.BaseElement { constructor(element) { super(element); this.xhr_ = SPZServices.xhrFor(this.win); this.product_title = ""; } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } async getProductTitle_ (data){ this.product_title = data.product_title; } handleLoading_ (event) { const { type, action } = event; const loadingElementId = '#apps-discount-whole-loading'; const loadingElement = document.querySelector(loadingElementId); if (loadingElement) { SPZ.whenApiDefined(loadingElement).then((api) => { if (action === 'show') { api.show_(); } else { api.close_(); } }); } } // 渲染加购弹窗内容 async renderQuickShop_ (data) { this.handleLoading_({type: 'whole', action: 'show'}); const apply_scenario = data.apply_scenario; const discount_id = data.discount_id; const product_id = data.product_id; const limit_purchase = data.limit_purchase; this.xhr_.fetchJson(`/api/storefront/promotion/landing_page/product?product_id=${product_id}&discount_id=${discount_id}&apply_scenario=${apply_scenario}`, { method: "get", }).then(async(res)=>{ this.handleLoading_({type: 'whole', action: 'close'}); const $quickShop = await SPZ.whenApiDefined(document.querySelector('#apps-discount-quick-view-render')); // 定义默认渲染的子款式 const selectedVariant = res.product.variants.find((v)=> (v.available && v.is_hit_discount)) || res.product.variants[0]; let selectedValues = {}; selectedVariant.options.length && selectedVariant.options.forEach(item => { selectedValues[item.name] = item.value; }) // 默认选中的 子款式、 options res.product.defaultSelectValues = selectedValues; let data = {...res.product, product:res.product, selectedVariant}; data.need_atc = true; data.limit_purchase = limit_purchase; $quickShop.render(data); // 打开加购弹窗 SPZ.whenApiDefined(document.querySelector(`#apps-discount-quick-view`)).then((api)=>{ api.open(); }); }).catch((err)=>{ this.handleLoading_({type: 'whole', action: 'close'}); }) } // 加入购物车 addToCart_(data) { const apply_scenario = data.apply_scenario; const discount_id = data.discount_id; const product_id = data.product_id; this.xhr_.fetchJson(`/api/storefront/promotion/landing_page/product?product_id=${data.product_id}&discount_id=${discount_id}&apply_scenario=${apply_scenario}`, { method: "get", }).then(async(res)=>{ // 单款式加购 const variant_id = res.product.variants[0]?.id; const $productFormInput = document.querySelector(`#apps-discount-product-form-${data.product_id} input[name='variant_id'`); $productFormInput.value = variant_id; SPZ.whenApiDefined(document.querySelector(`#apps-discount-product-form-${data.product_id}`)).then((api)=>{ api.handleAddToCart_(); }); }).catch((err)=> { this.handleLoading_({type: 'whole', action: 'close'}); }) } // 加购弹窗未参与活动 加购按钮不可点击 handleNotHitDiscount_(data) { const $quickShopBody = document.querySelector('#apps-discount-quick-shop-body'); const $limitTip = document.querySelector('.apps_discount_limit_purchase_tip'); //当前子框式未命中活动 if(data.variant.is_hit_discount == false) { $quickShopBody.setAttribute('variantstatus', 'notHitDiscount'); $limitTip && $limitTip.setAttribute('selectedvariantstatus', 'notHitDiscount'); } else { $quickShopBody.setAttribute('variantstatus', ''); $limitTip && $limitTip.setAttribute('selectedvariantstatus', '') } } setupAction_() { this.registerAction('renderQuickShop', (invocation) => { const data = invocation.args; this.renderQuickShop_(data); }); // 加购 this.registerAction('addToCart', (invocation) => { const data = invocation.args; this.addToCart_(data); }); // 子款式 未参与活动 this.registerAction('handleNotHitDiscount', (invocation) => { const data = invocation.args.data; this.handleNotHitDiscount_(data); }); this.registerAction('getCartCount', (invocation) => { //一些老主题还未用spz重构,需要手动触发一次老方法以更新购物车图标的数量 window.$ && $(document).trigger('dj.common.cart.change'); }); this.registerAction('getProductTitle', (invocation) => { const data = invocation.args; this.getProductTitle_(data); }); this.registerAction('handleButton', (invocation) => { const data = invocation.args; window.location.href = this.product_title; }); }; buildCallback() { this.setupAction_(); }; // 同一页里 flashsale_collection(首页限时促销卡片) 与凑单弹窗容器都渲染了本快速加购栈, // 会产生重复 fixed id——尤其加购弹窗 #apps-discount-quick-view。它“打开”走 querySelector, // “关闭”走声明式动作 apps-discount-quick-view.close(按 id 解析),重复时二者可能命中不同副本, // 导致加购成功后弹窗第一次关不掉、第二次才关。参考 toast 的处理,运行时保证这些单例只保留一份。 mountCallback() { const funcs = document.querySelectorAll('#appDiscountRenderQuickShopFunc'); // 逻辑元件重复:仅保留第一个,其余移除自身,保证按 id 解析到的动作实例唯一。 if (funcs.length > 1 && this.element !== funcs[0]) { this.element.remove(); return; } // 加购弹窗重复:保留第一个,移除多余(移除弹窗即连带移除其内部 render/表单等子节点)。 const modals = document.querySelectorAll('#apps-discount-quick-view'); Array.from(modals).slice(1).forEach((el) => el.remove()); } } SPZ.defineElement('spz-custom-discount-atc-action', SpzCustomDiscountAtcAction);
class SpzCustomDiscountBundle extends SPZ.BaseElement { constructor(element) { super(element); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } mountCallback() { // 同一页可能有多个 block 各自渲染本 snippet,导致逻辑元素 spz-custom-discount-toast(#appsAddCartToastFunc) 重复。 // 仅保留 DOM 中第一个实例,其余重复实例移除自身,保证逻辑元素及其 action 引用(appsAddCartToastFunc)唯一。 const funcs = document.querySelectorAll('#appsAddCartToastFunc'); if (funcs.length > 1 && this.element !== funcs[0]) { this.element.remove(); return; } // 全局折扣 toast 的弹出点分散在多个模板/组件里(含声明式 @atcError),无法逐一在弹出前前置, // 故挂载时幂等地去重并挂到 body;加购 toast 改为弹出前按需去重(见 showAddToCartToast) this.ensureSingleToastInBody_('cart_match_discount_toast_wrap'); } unmountCallback() {} // 同一页面可能有多个 block 各自渲染本 toast snippet(如商详的 discount_automatic + 购物车抽屉里的折扣横幅), // 导致 toast 外层出现重复 id。重复 id 下 getElementById/querySelector 及 SPZ 动作引用都只命中第一个, // 且被关进抽屉的那份会被抽屉的 transform/overflow 裁剪/错位。这里在挂载时幂等去重: // 只保留一份、移除多余的,并把保留的挂到 body(body 是 position:fixed 最安全的落点,避免被任何祖先裁剪)。可反复调用。 ensureSingleToastInBody_(id) { const els = Array.from(document.querySelectorAll('#' + id)); if (!els.length) return; els.slice(1).forEach((el) => el.remove()); const keep = els[0]; if (keep.parentNode !== document.body) { document.body.appendChild(keep); } } // 主题购物车抽屉是否打开 isInCartDrawer_() { return !!document.querySelector('[data-section-type="cart_drawer"] spz-sidebar[open]'); } setupAction_() { this.registerAction('showAddToCartToast', () => { // 抽屉内加购:主题本就不会有加购效果,统一弹插件自己的 toast // 非抽屉:主题有加购代理则沿用主题加购效果,否则插件兜底 const proxyEl = document.getElementById('add-cart-event-proxy'); const inDrawer = this.isInCartDrawer_(); if (!inDrawer && proxyEl) { return; } // 弹出前按需去重并挂到 body(幂等),避免重复 id 命中错对象或被抽屉裁剪/错位 this.ensureSingleToastInBody_('apps_add_cart_toast_wrap'); const toastEl = document.querySelector('#apps-match-drawer-add_to_cart_toast') SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast("Added successfully"); }); }); } buildCallback() { this.setupAction_(); }; } SPZ.defineElement('spz-custom-discount-toast', SpzCustomDiscountBundle);
class SpzCustomDiscountFlashsale extends SPZ.BaseElement { constructor(element) { super(element); this.xhr_ = SPZServices.xhrFor(this.win); this.discountInfoApi = "\/api\/storefront\/promotion\/home_page\/campaign?discount_id=" this.product_display = {}; this.model = { loading: false, page: 2, limit: 20, total: 0, //已展示的商品数量 params: { count: 0, has_more: false, sort: { by: "recommend", direction: "asc" } } }; this.discount_id= ""; this.image_size="100%"; this.discount_info = {}; } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } async getDiscountList() { const data = await this.xhr_.fetchJson(this.discountInfoApi + this.discount_id, { method: "GET", }).then(res => { this.model.params = { count: res.product_info.count, has_more: res.product_info.has_more, sort: { by: "recommend", direction: "asc" } } if(!res.product_info.product.length) return; this.model.total = res.product_info.product.length; this.product_display = res.home_page_info.product_display; this.discount_info = res.discount_info; res.product_info.product.forEach((product) => { product.url = appDiscountUtils.globalizePath(product.url); }) res.image_domain = this.win.SHOPLAZZA.image_domain; res.isMobile = appDiscountUtils.judgeMobile(); SPZ.whenApiDefined(document.getElementById("appDiscountIndexFlashsale")) .then(apis => { apis.render(res).then(() => { const hiddenArraw = res.home_page_info.banner.enabled ? res.product_info.product.length < 5 : res.product_info.product.length < 6 if(hiddenArraw) { document.querySelectorAll('.app_discount_flashsale_arrow').forEach((item) => { item.style.display="none"; }) } SPZ.whenApiDefined(document.getElementById("flashsaleProductsRender")).then((api) => { res.product_info.product_display = this.product_display; res.product_info.discount_id = this.discount_id; res.product_info.apply_scenario = 1; res.product_info.limit_purchase = this.discount_info.limit_user_product_discount; res.product_info.discount_image_size = this.image_size; api.render(res.product_info,true).then(() => {this.bindEvent_()}); }) }) }) }).catch(err => { console.error(err); }) return data; }; // 获取加载的商品数据,拼接html模板 async loadData(cb) { // 请求数据 this.model.loading = true; //查询活动商品接口 const reqBody = { discount_id: this.discount_id, page: this.model.page, limit: this.model.limit, apply_scenario: 1, sort: this.model.params.sort, sales_channel: { sale_channel_type: "online", sale_channel_id: '2424937' } } this.xhr_.fetchJson(`/api/storefront/promotion/landing_page/product/list`, { method: "post", body: reqBody }).then(async(res)=>{ const count = res.count; this.model.params.has_more = res.has_more; this.model.total = this.model.total + res.products.length; if (count > 0) { this.model.page++; if (res.products && res.products.length > 0) { res.products.forEach((product) => { product.url = appDiscountUtils.globalizePath(product.url); }) res.product_display = this.product_display; res.discount_id = this.discount_id; res.apply_scenario = 1; res.limit_purchase = this.discount_info.limit_user_product_discount; res.discount_image_size = this.image_size; // 获取商品列表渲染模板, dom挂载 const $content = document.querySelector(".app_discount_products_list_wrapper"); this.templates_ = SPZServices.templatesForDoc(); this.templates_.renderTemplate(document.querySelector('#apps-discounts_product_list_template'), res).then((el) => { const childNodes = el.querySelectorAll('.as-render-product-item'); if (childNodes && childNodes.length > 0) { $content.append(...childNodes); } }) // 监听load去掉灰色背景 document.dispatchEvent(new CustomEvent('fire.load.img')); // 触发懒加载 cb && cb(products); window.lazyLoadInstance && window.lazyLoadInstance.update(); } } this.model.loading = false; }).catch((err)=>{ console.error(err); this.model.loading = false; }) }; setupAction_() { this.registerAction('shiftMove', (data) => { const $el = document.querySelector(".app_discount_products_list_wrapper"); const action = data.args.direct === "right"; const scrollwidth = action ? $el.offsetWidth : -$el.offsetWidth; $el.scrollBy({ left: scrollwidth, behavior: 'smooth' }); }); this.registerAction('changeFlashSaleLimitPurchase', (invocation) => { const data = invocation.args.data; this.handleFlashsaleTip_(data); }); }; //切换快速加购弹窗内限时促销限购提示 handleFlashsaleTip_(data) { const flashsaleEl = document.querySelector('#quick-shop-flashsale-tip'); SPZ.whenApiDefined(flashsaleEl).then((api) => { api.render(data); }); } bindEvent_() { // 监听滚动,请求数据 const $el = document.querySelector(".app_discount_products_list_wrapper"); if($el) { $el.addEventListener("scroll", this.win.SPZCore.Types.debounce( this.win, () => { const isRightEnd = $el.scrollLeft + $el.offsetWidth + 10 >= $el.scrollWidth; const isLeftEnd = Math.abs($el.scrollLeft) + $el.offsetWidth + 10 >= $el.scrollWidth; const isRTL = document.documentElement.getAttribute('dir') == 'rtl'; const isEnd = isRTL ? isLeftEnd : isRightEnd; if(isEnd && this.model.params.has_more && !this.model.loading && this.model.total < 100) { this.loadData(); } }, 50 )) }; }; buildCallback() { this.setupAction_(); }; mountCallback() { const $el = document.querySelector("#appDiscountFlashsale") this.discount_id = $el.getAttribute('flashsale-id'); this.image_size = $el.getAttribute('image-size'); if(!this.discount_id) return; this.getDiscountList(); }; } SPZ.defineElement('spz-custom-discount-flashsale', SpzCustomDiscountFlashsale);
Log in
Create an account
${data.data && data.data.count}
Home
All Products
More links
${(function(){ var linkList =[false,false].slice(offset); var hasChild = linkList.some(v => v); if(!hasChild){ return `
Home
All Products
` } return `
Home
All Products
` })()}
Home
All Products
More links
${(function(){ var linkList =[false,false].slice(offset); var hasChild = linkList.some(v => v); if(!hasChild){ return `
Home
All Products
` } return `
Home
All Products
` })()}
${function(){ let hour = data.d * 24 + data.h; if(hour < 10){ hour = '0' + hour; } return `
End in
${data.dd}
D
${data.hh}
:
${hour}
:
${data.mm}
:
${data.ss}
.
${data.SSS}
` }()}
${function() { const images = data.images || []; const selectedVariant = data.variants.find(v => (v.available && v.is_hit_discount == true)) || data.variants[0]; const selectedIndex = !!selectedVariant ? images.findIndex(img => img.src === (selectedVariant.image && selectedVariant.image.src)) : 0; const initialSlide = selectedIndex === -1 ? 0 : selectedIndex; return `
${images.map((image, index) => `
`).join('')}
${images.map(image => { const imageWidth = image.width || 450; const imageHeight = image.height || 450; return `
` }).join('')}
`; }()}
${function() { const productData = data; const limit_purchase = data.limit_purchase || 0; let product_change_event = ''; let mouse_over_event = ''; let mouse_out_event = ''; const product_options = productData.options.filter(Boolean) || []; for (let opt of product_options) { const nameEscape = opt.name.replace(/\/|\\|\s|\'|\"|`|\<|\>/g, ''); product_change_event = product_change_event + `apps-discount-quick-shop-selected-variant-${opt.id}.rerender(data=event.selectedValues.${opt.name});`; mouse_over_event = mouse_over_event + `@${nameEscape}Mouseover="apps-discount-quick-shop-selected-variant-${opt.id}.rerender(data=event);"`; mouse_out_event = mouse_out_event + `@${nameEscape}Mouseout="apps-discount-quick-shop-selected-variant-${opt.id}.rerender(data=event.selectData.${opt.name});"`; } const selectedVariant = productData.variants.find(v => (v.available && v.is_hit_discount == true)) || productData.variants[0]; const statusLan = ((selectedVariant && !selectedVariant.available) || (!selectedVariant && !productData.available)) ? "Sold out" : "Add to cart"; const status = ( (selectedVariant && !selectedVariant.available) || (!selectedVariant && !data.available)) ? 'soldout' : 'available'; return `
${data.title || data.brief}
Add ${productData.discount_min_purchase_qty} items for discount
Quantity
${function() { const selectedVariant = data.variants.find(v => v.available && v.is_hit_discount == true) || data.variants[0]; const statusLan = ( (selectedVariant && !selectedVariant.available) || (!selectedVariant && !data.available)) ? "Sold out" : "Add to cart"; return `
${statusLan}
Add
`; }()}
`; }()}
${function() { const selectedVariant = data.variant || data.variants[0]; const image = selectedVariant.image || data.product.image; const imageWidth = image?.width || 120; const imageHeight = image?.height || 120; return `
` }()}
${function() { const defaultVariant = data.variants?.find(v => (v.available && v.is_hit_discount == true)) || data.variants?.[0]; const selectedVariant = data.variant || defaultVariant; const isHasRrice = (selectedVariant.price || selectedVariant.price == 0) ? true : false; if(selectedVariant.flash_sale_info && selectedVariant.flash_sale_info.discount_price) { selectedVariant.price = selectedVariant.flash_sale_info.discount_price; } if(data.flash_sale_info && data.flash_sale_info.discount_price) { data.price = data.flash_sale_info.discount_price; } return !!selectedVariant ? `
` : `
-
`; }()}
${function(){ const defaultVariant = data.variants?.find(v => (v.available && v.is_hit_discount == true)) || data.variants?.[0]; const selectedVariant = data.variant || defaultVariant; let show_flashsale_limit_tip = false; let limit_user_product_discount; if(selectedVariant.flash_sale_info && selectedVariant.flash_sale_info?.limit_user_product_type != "LUPT_NO_LIMIT" && selectedVariant.flash_sale_info?.limit_user_product_discount > 0) { show_flashsale_limit_tip = true; limit_user_product_discount = selectedVariant.flash_sale_info?.limit_user_product_discount; } if(data.flash_sale_info && data.flash_sale_info?.limit_user_product_type != "LUPT_NO_LIMIT" && data.flash_sale_info?.limit_user_product_discount > 0) { show_flashsale_limit_tip = true; limit_user_product_discount = data.flash_sale_info?.limit_user_product_discount; } return `
Promo products limited to ${limit_user_product_discount} item per person
` }()}
${function() { const currentProduct = data.product; return (currentProduct.options || []).map((option, index) => { const optionName = option.name || ''; const optionId = option.id || ''; const position = `option${index + 1}`; return `
${optionName}:
${option.values.map((value,idx) => { const selected = data.product.defaultSelectValues?.[optionName] == value ? 'checked' : ''; return `
${value}
`; }).join('')}
`; }).join('') }()}
${function() { const value = (data.originData && data.originData.value) || data.value; const isHasValue = value ? true : false; return `
${value}
` }()}
The activity inventory has been sold out, flash sale discount will not be applied
Continue Shopping
class SpzCustomDiscountAtcAction extends SPZ.BaseElement { constructor(element) { super(element); this.xhr_ = SPZServices.xhrFor(this.win); this.product_title = ""; } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } async getProductTitle_ (data){ this.product_title = data.product_title; } handleLoading_ (event) { const { type, action } = event; const loadingElementId = '#apps-discount-whole-loading'; const loadingElement = document.querySelector(loadingElementId); if (loadingElement) { SPZ.whenApiDefined(loadingElement).then((api) => { if (action === 'show') { api.show_(); } else { api.close_(); } }); } } // 渲染加购弹窗内容 async renderQuickShop_ (data) { this.handleLoading_({type: 'whole', action: 'show'}); const apply_scenario = data.apply_scenario; const discount_id = data.discount_id; const product_id = data.product_id; const limit_purchase = data.limit_purchase; this.xhr_.fetchJson(`/api/storefront/promotion/landing_page/product?product_id=${product_id}&discount_id=${discount_id}&apply_scenario=${apply_scenario}`, { method: "get", }).then(async(res)=>{ this.handleLoading_({type: 'whole', action: 'close'}); const $quickShop = await SPZ.whenApiDefined(document.querySelector('#apps-discount-quick-view-render')); // 定义默认渲染的子款式 const selectedVariant = res.product.variants.find((v)=> (v.available && v.is_hit_discount)) || res.product.variants[0]; let selectedValues = {}; selectedVariant.options.length && selectedVariant.options.forEach(item => { selectedValues[item.name] = item.value; }) // 默认选中的 子款式、 options res.product.defaultSelectValues = selectedValues; let data = {...res.product, product:res.product, selectedVariant}; data.need_atc = true; data.limit_purchase = limit_purchase; $quickShop.render(data); // 打开加购弹窗 SPZ.whenApiDefined(document.querySelector(`#apps-discount-quick-view`)).then((api)=>{ api.open(); }); }).catch((err)=>{ this.handleLoading_({type: 'whole', action: 'close'}); }) } // 加入购物车 addToCart_(data) { const apply_scenario = data.apply_scenario; const discount_id = data.discount_id; const product_id = data.product_id; this.xhr_.fetchJson(`/api/storefront/promotion/landing_page/product?product_id=${data.product_id}&discount_id=${discount_id}&apply_scenario=${apply_scenario}`, { method: "get", }).then(async(res)=>{ // 单款式加购 const variant_id = res.product.variants[0]?.id; const $productFormInput = document.querySelector(`#apps-discount-product-form-${data.product_id} input[name='variant_id'`); $productFormInput.value = variant_id; SPZ.whenApiDefined(document.querySelector(`#apps-discount-product-form-${data.product_id}`)).then((api)=>{ api.handleAddToCart_(); }); }).catch((err)=> { this.handleLoading_({type: 'whole', action: 'close'}); }) } // 加购弹窗未参与活动 加购按钮不可点击 handleNotHitDiscount_(data) { const $quickShopBody = document.querySelector('#apps-discount-quick-shop-body'); const $limitTip = document.querySelector('.apps_discount_limit_purchase_tip'); //当前子框式未命中活动 if(data.variant.is_hit_discount == false) { $quickShopBody.setAttribute('variantstatus', 'notHitDiscount'); $limitTip && $limitTip.setAttribute('selectedvariantstatus', 'notHitDiscount'); } else { $quickShopBody.setAttribute('variantstatus', ''); $limitTip && $limitTip.setAttribute('selectedvariantstatus', '') } } setupAction_() { this.registerAction('renderQuickShop', (invocation) => { const data = invocation.args; this.renderQuickShop_(data); }); // 加购 this.registerAction('addToCart', (invocation) => { const data = invocation.args; this.addToCart_(data); }); // 子款式 未参与活动 this.registerAction('handleNotHitDiscount', (invocation) => { const data = invocation.args.data; this.handleNotHitDiscount_(data); }); this.registerAction('getCartCount', (invocation) => { //一些老主题还未用spz重构,需要手动触发一次老方法以更新购物车图标的数量 window.$ && $(document).trigger('dj.common.cart.change'); }); this.registerAction('getProductTitle', (invocation) => { const data = invocation.args; this.getProductTitle_(data); }); this.registerAction('handleButton', (invocation) => { const data = invocation.args; window.location.href = this.product_title; }); }; buildCallback() { this.setupAction_(); }; // 同一页里 flashsale_collection(首页限时促销卡片) 与凑单弹窗容器都渲染了本快速加购栈, // 会产生重复 fixed id——尤其加购弹窗 #apps-discount-quick-view。它“打开”走 querySelector, // “关闭”走声明式动作 apps-discount-quick-view.close(按 id 解析),重复时二者可能命中不同副本, // 导致加购成功后弹窗第一次关不掉、第二次才关。参考 toast 的处理,运行时保证这些单例只保留一份。 mountCallback() { const funcs = document.querySelectorAll('#appDiscountRenderQuickShopFunc'); // 逻辑元件重复:仅保留第一个,其余移除自身,保证按 id 解析到的动作实例唯一。 if (funcs.length > 1 && this.element !== funcs[0]) { this.element.remove(); return; } // 加购弹窗重复:保留第一个,移除多余(移除弹窗即连带移除其内部 render/表单等子节点)。 const modals = document.querySelectorAll('#apps-discount-quick-view'); Array.from(modals).slice(1).forEach((el) => el.remove()); } } SPZ.defineElement('spz-custom-discount-atc-action', SpzCustomDiscountAtcAction);
class SpzCustomDiscountBundle extends SPZ.BaseElement { constructor(element) { super(element); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } mountCallback() { // 同一页可能有多个 block 各自渲染本 snippet,导致逻辑元素 spz-custom-discount-toast(#appsAddCartToastFunc) 重复。 // 仅保留 DOM 中第一个实例,其余重复实例移除自身,保证逻辑元素及其 action 引用(appsAddCartToastFunc)唯一。 const funcs = document.querySelectorAll('#appsAddCartToastFunc'); if (funcs.length > 1 && this.element !== funcs[0]) { this.element.remove(); return; } // 全局折扣 toast 的弹出点分散在多个模板/组件里(含声明式 @atcError),无法逐一在弹出前前置, // 故挂载时幂等地去重并挂到 body;加购 toast 改为弹出前按需去重(见 showAddToCartToast) this.ensureSingleToastInBody_('cart_match_discount_toast_wrap'); } unmountCallback() {} // 同一页面可能有多个 block 各自渲染本 toast snippet(如商详的 discount_automatic + 购物车抽屉里的折扣横幅), // 导致 toast 外层出现重复 id。重复 id 下 getElementById/querySelector 及 SPZ 动作引用都只命中第一个, // 且被关进抽屉的那份会被抽屉的 transform/overflow 裁剪/错位。这里在挂载时幂等去重: // 只保留一份、移除多余的,并把保留的挂到 body(body 是 position:fixed 最安全的落点,避免被任何祖先裁剪)。可反复调用。 ensureSingleToastInBody_(id) { const els = Array.from(document.querySelectorAll('#' + id)); if (!els.length) return; els.slice(1).forEach((el) => el.remove()); const keep = els[0]; if (keep.parentNode !== document.body) { document.body.appendChild(keep); } } // 主题购物车抽屉是否打开 isInCartDrawer_() { return !!document.querySelector('[data-section-type="cart_drawer"] spz-sidebar[open]'); } setupAction_() { this.registerAction('showAddToCartToast', () => { // 抽屉内加购:主题本就不会有加购效果,统一弹插件自己的 toast // 非抽屉:主题有加购代理则沿用主题加购效果,否则插件兜底 const proxyEl = document.getElementById('add-cart-event-proxy'); const inDrawer = this.isInCartDrawer_(); if (!inDrawer && proxyEl) { return; } // 弹出前按需去重并挂到 body(幂等),避免重复 id 命中错对象或被抽屉裁剪/错位 this.ensureSingleToastInBody_('apps_add_cart_toast_wrap'); const toastEl = document.querySelector('#apps-match-drawer-add_to_cart_toast') SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast("Added successfully"); }); }); } buildCallback() { this.setupAction_(); }; } SPZ.defineElement('spz-custom-discount-toast', SpzCustomDiscountBundle);
class SpzCustomDiscountFlashsale extends SPZ.BaseElement { constructor(element) { super(element); this.xhr_ = SPZServices.xhrFor(this.win); this.discountInfoApi = "\/api\/storefront\/promotion\/home_page\/campaign?discount_id=" this.product_display = {}; this.model = { loading: false, page: 2, limit: 20, total: 0, //已展示的商品数量 params: { count: 0, has_more: false, sort: { by: "recommend", direction: "asc" } } }; this.discount_id= ""; this.image_size="100%"; this.discount_info = {}; } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } async getDiscountList() { const data = await this.xhr_.fetchJson(this.discountInfoApi + this.discount_id, { method: "GET", }).then(res => { this.model.params = { count: res.product_info.count, has_more: res.product_info.has_more, sort: { by: "recommend", direction: "asc" } } if(!res.product_info.product.length) return; this.model.total = res.product_info.product.length; this.product_display = res.home_page_info.product_display; this.discount_info = res.discount_info; res.product_info.product.forEach((product) => { product.url = appDiscountUtils.globalizePath(product.url); }) res.image_domain = this.win.SHOPLAZZA.image_domain; res.isMobile = appDiscountUtils.judgeMobile(); SPZ.whenApiDefined(document.getElementById("appDiscountIndexFlashsale")) .then(apis => { apis.render(res).then(() => { const hiddenArraw = res.home_page_info.banner.enabled ? res.product_info.product.length < 5 : res.product_info.product.length < 6 if(hiddenArraw) { document.querySelectorAll('.app_discount_flashsale_arrow').forEach((item) => { item.style.display="none"; }) } SPZ.whenApiDefined(document.getElementById("flashsaleProductsRender")).then((api) => { res.product_info.product_display = this.product_display; res.product_info.discount_id = this.discount_id; res.product_info.apply_scenario = 1; res.product_info.limit_purchase = this.discount_info.limit_user_product_discount; res.product_info.discount_image_size = this.image_size; api.render(res.product_info,true).then(() => {this.bindEvent_()}); }) }) }) }).catch(err => { console.error(err); }) return data; }; // 获取加载的商品数据,拼接html模板 async loadData(cb) { // 请求数据 this.model.loading = true; //查询活动商品接口 const reqBody = { discount_id: this.discount_id, page: this.model.page, limit: this.model.limit, apply_scenario: 1, sort: this.model.params.sort, sales_channel: { sale_channel_type: "online", sale_channel_id: '2424937' } } this.xhr_.fetchJson(`/api/storefront/promotion/landing_page/product/list`, { method: "post", body: reqBody }).then(async(res)=>{ const count = res.count; this.model.params.has_more = res.has_more; this.model.total = this.model.total + res.products.length; if (count > 0) { this.model.page++; if (res.products && res.products.length > 0) { res.products.forEach((product) => { product.url = appDiscountUtils.globalizePath(product.url); }) res.product_display = this.product_display; res.discount_id = this.discount_id; res.apply_scenario = 1; res.limit_purchase = this.discount_info.limit_user_product_discount; res.discount_image_size = this.image_size; // 获取商品列表渲染模板, dom挂载 const $content = document.querySelector(".app_discount_products_list_wrapper"); this.templates_ = SPZServices.templatesForDoc(); this.templates_.renderTemplate(document.querySelector('#apps-discounts_product_list_template'), res).then((el) => { const childNodes = el.querySelectorAll('.as-render-product-item'); if (childNodes && childNodes.length > 0) { $content.append(...childNodes); } }) // 监听load去掉灰色背景 document.dispatchEvent(new CustomEvent('fire.load.img')); // 触发懒加载 cb && cb(products); window.lazyLoadInstance && window.lazyLoadInstance.update(); } } this.model.loading = false; }).catch((err)=>{ console.error(err); this.model.loading = false; }) }; setupAction_() { this.registerAction('shiftMove', (data) => { const $el = document.querySelector(".app_discount_products_list_wrapper"); const action = data.args.direct === "right"; const scrollwidth = action ? $el.offsetWidth : -$el.offsetWidth; $el.scrollBy({ left: scrollwidth, behavior: 'smooth' }); }); this.registerAction('changeFlashSaleLimitPurchase', (invocation) => { const data = invocation.args.data; this.handleFlashsaleTip_(data); }); }; //切换快速加购弹窗内限时促销限购提示 handleFlashsaleTip_(data) { const flashsaleEl = document.querySelector('#quick-shop-flashsale-tip'); SPZ.whenApiDefined(flashsaleEl).then((api) => { api.render(data); }); } bindEvent_() { // 监听滚动,请求数据 const $el = document.querySelector(".app_discount_products_list_wrapper"); if($el) { $el.addEventListener("scroll", this.win.SPZCore.Types.debounce( this.win, () => { const isRightEnd = $el.scrollLeft + $el.offsetWidth + 10 >= $el.scrollWidth; const isLeftEnd = Math.abs($el.scrollLeft) + $el.offsetWidth + 10 >= $el.scrollWidth; const isRTL = document.documentElement.getAttribute('dir') == 'rtl'; const isEnd = isRTL ? isLeftEnd : isRightEnd; if(isEnd && this.model.params.has_more && !this.model.loading && this.model.total < 100) { this.loadData(); } }, 50 )) }; }; buildCallback() { this.setupAction_(); }; mountCallback() { const $el = document.querySelector("#appDiscountFlashsale") this.discount_id = $el.getAttribute('flashsale-id'); this.image_size = $el.getAttribute('image-size'); if(!this.discount_id) return; this.getDiscountList(); }; } SPZ.defineElement('spz-custom-discount-flashsale', SpzCustomDiscountFlashsale);
Log in
Create an account
${data.data && data.data.count}
Home
All Products
${(function(){ if (data === undefined || typeof data !== 'string' || data == '') return ''; const keyword = encodeURIComponent(data); return `
View more
Your search for '${data}' did not yield any results.
` })()}
Home
All Products
${function(){ let hour = data.d * 24 + data.h; if(hour < 10){ hour = '0' + hour; } return `
End in
${data.dd}
D
${data.hh}
:
${hour}
:
${data.mm}
:
${data.ss}
.
${data.SSS}
` }()}
${function() { const images = data.images || []; const selectedVariant = data.variants.find(v => (v.available && v.is_hit_discount == true)) || data.variants[0]; const selectedIndex = !!selectedVariant ? images.findIndex(img => img.src === (selectedVariant.image && selectedVariant.image.src)) : 0; const initialSlide = selectedIndex === -1 ? 0 : selectedIndex; return `
${images.map((image, index) => `
`).join('')}
${images.map(image => { const imageWidth = image.width || 450; const imageHeight = image.height || 450; return `
` }).join('')}
`; }()}
${function() { const productData = data; const limit_purchase = data.limit_purchase || 0; let product_change_event = ''; let mouse_over_event = ''; let mouse_out_event = ''; const product_options = productData.options.filter(Boolean) || []; for (let opt of product_options) { const nameEscape = opt.name.replace(/\/|\\|\s|\'|\"|`|\<|\>/g, ''); product_change_event = product_change_event + `apps-discount-quick-shop-selected-variant-${opt.id}.rerender(data=event.selectedValues.${opt.name});`; mouse_over_event = mouse_over_event + `@${nameEscape}Mouseover="apps-discount-quick-shop-selected-variant-${opt.id}.rerender(data=event);"`; mouse_out_event = mouse_out_event + `@${nameEscape}Mouseout="apps-discount-quick-shop-selected-variant-${opt.id}.rerender(data=event.selectData.${opt.name});"`; } const selectedVariant = productData.variants.find(v => (v.available && v.is_hit_discount == true)) || productData.variants[0]; const statusLan = ((selectedVariant && !selectedVariant.available) || (!selectedVariant && !productData.available)) ? "Sold out" : "Add to cart"; const status = ( (selectedVariant && !selectedVariant.available) || (!selectedVariant && !data.available)) ? 'soldout' : 'available'; return `
${data.title || data.brief}
Add ${productData.discount_min_purchase_qty} items for discount
Quantity
${function() { const selectedVariant = data.variants.find(v => v.available && v.is_hit_discount == true) || data.variants[0]; const statusLan = ( (selectedVariant && !selectedVariant.available) || (!selectedVariant && !data.available)) ? "Sold out" : "Add to cart"; return `
${statusLan}
Add
`; }()}
`; }()}
${function() { const selectedVariant = data.variant || data.variants[0]; const image = selectedVariant.image || data.product.image; const imageWidth = image?.width || 120; const imageHeight = image?.height || 120; return `
` }()}
${function() { const defaultVariant = data.variants?.find(v => (v.available && v.is_hit_discount == true)) || data.variants?.[0]; const selectedVariant = data.variant || defaultVariant; const isHasRrice = (selectedVariant.price || selectedVariant.price == 0) ? true : false; if(selectedVariant.flash_sale_info && selectedVariant.flash_sale_info.discount_price) { selectedVariant.price = selectedVariant.flash_sale_info.discount_price; } if(data.flash_sale_info && data.flash_sale_info.discount_price) { data.price = data.flash_sale_info.discount_price; } return !!selectedVariant ? `
` : `
-
`; }()}
${function(){ const defaultVariant = data.variants?.find(v => (v.available && v.is_hit_discount == true)) || data.variants?.[0]; const selectedVariant = data.variant || defaultVariant; let show_flashsale_limit_tip = false; let limit_user_product_discount; if(selectedVariant.flash_sale_info && selectedVariant.flash_sale_info?.limit_user_product_type != "LUPT_NO_LIMIT" && selectedVariant.flash_sale_info?.limit_user_product_discount > 0) { show_flashsale_limit_tip = true; limit_user_product_discount = selectedVariant.flash_sale_info?.limit_user_product_discount; } if(data.flash_sale_info && data.flash_sale_info?.limit_user_product_type != "LUPT_NO_LIMIT" && data.flash_sale_info?.limit_user_product_discount > 0) { show_flashsale_limit_tip = true; limit_user_product_discount = data.flash_sale_info?.limit_user_product_discount; } return `
Promo products limited to ${limit_user_product_discount} item per person
` }()}
${function() { const currentProduct = data.product; return (currentProduct.options || []).map((option, index) => { const optionName = option.name || ''; const optionId = option.id || ''; const position = `option${index + 1}`; return `
${optionName}:
${option.values.map((value,idx) => { const selected = data.product.defaultSelectValues?.[optionName] == value ? 'checked' : ''; return `
${value}
`; }).join('')}
`; }).join('') }()}
${function() { const value = (data.originData && data.originData.value) || data.value; const isHasValue = value ? true : false; return `
${value}
` }()}
The activity inventory has been sold out, flash sale discount will not be applied
Continue Shopping
class SpzCustomDiscountAtcAction extends SPZ.BaseElement { constructor(element) { super(element); this.xhr_ = SPZServices.xhrFor(this.win); this.product_title = ""; } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } async getProductTitle_ (data){ this.product_title = data.product_title; } handleLoading_ (event) { const { type, action } = event; const loadingElementId = '#apps-discount-whole-loading'; const loadingElement = document.querySelector(loadingElementId); if (loadingElement) { SPZ.whenApiDefined(loadingElement).then((api) => { if (action === 'show') { api.show_(); } else { api.close_(); } }); } } // 渲染加购弹窗内容 async renderQuickShop_ (data) { this.handleLoading_({type: 'whole', action: 'show'}); const apply_scenario = data.apply_scenario; const discount_id = data.discount_id; const product_id = data.product_id; const limit_purchase = data.limit_purchase; this.xhr_.fetchJson(`/api/storefront/promotion/landing_page/product?product_id=${product_id}&discount_id=${discount_id}&apply_scenario=${apply_scenario}`, { method: "get", }).then(async(res)=>{ this.handleLoading_({type: 'whole', action: 'close'}); const $quickShop = await SPZ.whenApiDefined(document.querySelector('#apps-discount-quick-view-render')); // 定义默认渲染的子款式 const selectedVariant = res.product.variants.find((v)=> (v.available && v.is_hit_discount)) || res.product.variants[0]; let selectedValues = {}; selectedVariant.options.length && selectedVariant.options.forEach(item => { selectedValues[item.name] = item.value; }) // 默认选中的 子款式、 options res.product.defaultSelectValues = selectedValues; let data = {...res.product, product:res.product, selectedVariant}; data.need_atc = true; data.limit_purchase = limit_purchase; $quickShop.render(data); // 打开加购弹窗 SPZ.whenApiDefined(document.querySelector(`#apps-discount-quick-view`)).then((api)=>{ api.open(); }); }).catch((err)=>{ this.handleLoading_({type: 'whole', action: 'close'}); }) } // 加入购物车 addToCart_(data) { const apply_scenario = data.apply_scenario; const discount_id = data.discount_id; const product_id = data.product_id; this.xhr_.fetchJson(`/api/storefront/promotion/landing_page/product?product_id=${data.product_id}&discount_id=${discount_id}&apply_scenario=${apply_scenario}`, { method: "get", }).then(async(res)=>{ // 单款式加购 const variant_id = res.product.variants[0]?.id; const $productFormInput = document.querySelector(`#apps-discount-product-form-${data.product_id} input[name='variant_id'`); $productFormInput.value = variant_id; SPZ.whenApiDefined(document.querySelector(`#apps-discount-product-form-${data.product_id}`)).then((api)=>{ api.handleAddToCart_(); }); }).catch((err)=> { this.handleLoading_({type: 'whole', action: 'close'}); }) } // 加购弹窗未参与活动 加购按钮不可点击 handleNotHitDiscount_(data) { const $quickShopBody = document.querySelector('#apps-discount-quick-shop-body'); const $limitTip = document.querySelector('.apps_discount_limit_purchase_tip'); //当前子框式未命中活动 if(data.variant.is_hit_discount == false) { $quickShopBody.setAttribute('variantstatus', 'notHitDiscount'); $limitTip && $limitTip.setAttribute('selectedvariantstatus', 'notHitDiscount'); } else { $quickShopBody.setAttribute('variantstatus', ''); $limitTip && $limitTip.setAttribute('selectedvariantstatus', '') } } setupAction_() { this.registerAction('renderQuickShop', (invocation) => { const data = invocation.args; this.renderQuickShop_(data); }); // 加购 this.registerAction('addToCart', (invocation) => { const data = invocation.args; this.addToCart_(data); }); // 子款式 未参与活动 this.registerAction('handleNotHitDiscount', (invocation) => { const data = invocation.args.data; this.handleNotHitDiscount_(data); }); this.registerAction('getCartCount', (invocation) => { //一些老主题还未用spz重构,需要手动触发一次老方法以更新购物车图标的数量 window.$ && $(document).trigger('dj.common.cart.change'); }); this.registerAction('getProductTitle', (invocation) => { const data = invocation.args; this.getProductTitle_(data); }); this.registerAction('handleButton', (invocation) => { const data = invocation.args; window.location.href = this.product_title; }); }; buildCallback() { this.setupAction_(); }; // 同一页里 flashsale_collection(首页限时促销卡片) 与凑单弹窗容器都渲染了本快速加购栈, // 会产生重复 fixed id——尤其加购弹窗 #apps-discount-quick-view。它“打开”走 querySelector, // “关闭”走声明式动作 apps-discount-quick-view.close(按 id 解析),重复时二者可能命中不同副本, // 导致加购成功后弹窗第一次关不掉、第二次才关。参考 toast 的处理,运行时保证这些单例只保留一份。 mountCallback() { const funcs = document.querySelectorAll('#appDiscountRenderQuickShopFunc'); // 逻辑元件重复:仅保留第一个,其余移除自身,保证按 id 解析到的动作实例唯一。 if (funcs.length > 1 && this.element !== funcs[0]) { this.element.remove(); return; } // 加购弹窗重复:保留第一个,移除多余(移除弹窗即连带移除其内部 render/表单等子节点)。 const modals = document.querySelectorAll('#apps-discount-quick-view'); Array.from(modals).slice(1).forEach((el) => el.remove()); } } SPZ.defineElement('spz-custom-discount-atc-action', SpzCustomDiscountAtcAction);
class SpzCustomDiscountBundle extends SPZ.BaseElement { constructor(element) { super(element); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } mountCallback() { // 同一页可能有多个 block 各自渲染本 snippet,导致逻辑元素 spz-custom-discount-toast(#appsAddCartToastFunc) 重复。 // 仅保留 DOM 中第一个实例,其余重复实例移除自身,保证逻辑元素及其 action 引用(appsAddCartToastFunc)唯一。 const funcs = document.querySelectorAll('#appsAddCartToastFunc'); if (funcs.length > 1 && this.element !== funcs[0]) { this.element.remove(); return; } // 全局折扣 toast 的弹出点分散在多个模板/组件里(含声明式 @atcError),无法逐一在弹出前前置, // 故挂载时幂等地去重并挂到 body;加购 toast 改为弹出前按需去重(见 showAddToCartToast) this.ensureSingleToastInBody_('cart_match_discount_toast_wrap'); } unmountCallback() {} // 同一页面可能有多个 block 各自渲染本 toast snippet(如商详的 discount_automatic + 购物车抽屉里的折扣横幅), // 导致 toast 外层出现重复 id。重复 id 下 getElementById/querySelector 及 SPZ 动作引用都只命中第一个, // 且被关进抽屉的那份会被抽屉的 transform/overflow 裁剪/错位。这里在挂载时幂等去重: // 只保留一份、移除多余的,并把保留的挂到 body(body 是 position:fixed 最安全的落点,避免被任何祖先裁剪)。可反复调用。 ensureSingleToastInBody_(id) { const els = Array.from(document.querySelectorAll('#' + id)); if (!els.length) return; els.slice(1).forEach((el) => el.remove()); const keep = els[0]; if (keep.parentNode !== document.body) { document.body.appendChild(keep); } } // 主题购物车抽屉是否打开 isInCartDrawer_() { return !!document.querySelector('[data-section-type="cart_drawer"] spz-sidebar[open]'); } setupAction_() { this.registerAction('showAddToCartToast', () => { // 抽屉内加购:主题本就不会有加购效果,统一弹插件自己的 toast // 非抽屉:主题有加购代理则沿用主题加购效果,否则插件兜底 const proxyEl = document.getElementById('add-cart-event-proxy'); const inDrawer = this.isInCartDrawer_(); if (!inDrawer && proxyEl) { return; } // 弹出前按需去重并挂到 body(幂等),避免重复 id 命中错对象或被抽屉裁剪/错位 this.ensureSingleToastInBody_('apps_add_cart_toast_wrap'); const toastEl = document.querySelector('#apps-match-drawer-add_to_cart_toast') SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast("Added successfully"); }); }); } buildCallback() { this.setupAction_(); }; } SPZ.defineElement('spz-custom-discount-toast', SpzCustomDiscountBundle);
class SpzCustomDiscountFlashsale extends SPZ.BaseElement { constructor(element) { super(element); this.xhr_ = SPZServices.xhrFor(this.win); this.discountInfoApi = "\/api\/storefront\/promotion\/home_page\/campaign?discount_id=" this.product_display = {}; this.model = { loading: false, page: 2, limit: 20, total: 0, //已展示的商品数量 params: { count: 0, has_more: false, sort: { by: "recommend", direction: "asc" } } }; this.discount_id= ""; this.image_size="100%"; this.discount_info = {}; } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } async getDiscountList() { const data = await this.xhr_.fetchJson(this.discountInfoApi + this.discount_id, { method: "GET", }).then(res => { this.model.params = { count: res.product_info.count, has_more: res.product_info.has_more, sort: { by: "recommend", direction: "asc" } } if(!res.product_info.product.length) return; this.model.total = res.product_info.product.length; this.product_display = res.home_page_info.product_display; this.discount_info = res.discount_info; res.product_info.product.forEach((product) => { product.url = appDiscountUtils.globalizePath(product.url); }) res.image_domain = this.win.SHOPLAZZA.image_domain; res.isMobile = appDiscountUtils.judgeMobile(); SPZ.whenApiDefined(document.getElementById("appDiscountIndexFlashsale")) .then(apis => { apis.render(res).then(() => { const hiddenArraw = res.home_page_info.banner.enabled ? res.product_info.product.length < 5 : res.product_info.product.length < 6 if(hiddenArraw) { document.querySelectorAll('.app_discount_flashsale_arrow').forEach((item) => { item.style.display="none"; }) } SPZ.whenApiDefined(document.getElementById("flashsaleProductsRender")).then((api) => { res.product_info.product_display = this.product_display; res.product_info.discount_id = this.discount_id; res.product_info.apply_scenario = 1; res.product_info.limit_purchase = this.discount_info.limit_user_product_discount; res.product_info.discount_image_size = this.image_size; api.render(res.product_info,true).then(() => {this.bindEvent_()}); }) }) }) }).catch(err => { console.error(err); }) return data; }; // 获取加载的商品数据,拼接html模板 async loadData(cb) { // 请求数据 this.model.loading = true; //查询活动商品接口 const reqBody = { discount_id: this.discount_id, page: this.model.page, limit: this.model.limit, apply_scenario: 1, sort: this.model.params.sort, sales_channel: { sale_channel_type: "online", sale_channel_id: '2424937' } } this.xhr_.fetchJson(`/api/storefront/promotion/landing_page/product/list`, { method: "post", body: reqBody }).then(async(res)=>{ const count = res.count; this.model.params.has_more = res.has_more; this.model.total = this.model.total + res.products.length; if (count > 0) { this.model.page++; if (res.products && res.products.length > 0) { res.products.forEach((product) => { product.url = appDiscountUtils.globalizePath(product.url); }) res.product_display = this.product_display; res.discount_id = this.discount_id; res.apply_scenario = 1; res.limit_purchase = this.discount_info.limit_user_product_discount; res.discount_image_size = this.image_size; // 获取商品列表渲染模板, dom挂载 const $content = document.querySelector(".app_discount_products_list_wrapper"); this.templates_ = SPZServices.templatesForDoc(); this.templates_.renderTemplate(document.querySelector('#apps-discounts_product_list_template'), res).then((el) => { const childNodes = el.querySelectorAll('.as-render-product-item'); if (childNodes && childNodes.length > 0) { $content.append(...childNodes); } }) // 监听load去掉灰色背景 document.dispatchEvent(new CustomEvent('fire.load.img')); // 触发懒加载 cb && cb(products); window.lazyLoadInstance && window.lazyLoadInstance.update(); } } this.model.loading = false; }).catch((err)=>{ console.error(err); this.model.loading = false; }) }; setupAction_() { this.registerAction('shiftMove', (data) => { const $el = document.querySelector(".app_discount_products_list_wrapper"); const action = data.args.direct === "right"; const scrollwidth = action ? $el.offsetWidth : -$el.offsetWidth; $el.scrollBy({ left: scrollwidth, behavior: 'smooth' }); }); this.registerAction('changeFlashSaleLimitPurchase', (invocation) => { const data = invocation.args.data; this.handleFlashsaleTip_(data); }); }; //切换快速加购弹窗内限时促销限购提示 handleFlashsaleTip_(data) { const flashsaleEl = document.querySelector('#quick-shop-flashsale-tip'); SPZ.whenApiDefined(flashsaleEl).then((api) => { api.render(data); }); } bindEvent_() { // 监听滚动,请求数据 const $el = document.querySelector(".app_discount_products_list_wrapper"); if($el) { $el.addEventListener("scroll", this.win.SPZCore.Types.debounce( this.win, () => { const isRightEnd = $el.scrollLeft + $el.offsetWidth + 10 >= $el.scrollWidth; const isLeftEnd = Math.abs($el.scrollLeft) + $el.offsetWidth + 10 >= $el.scrollWidth; const isRTL = document.documentElement.getAttribute('dir') == 'rtl'; const isEnd = isRTL ? isLeftEnd : isRightEnd; if(isEnd && this.model.params.has_more && !this.model.loading && this.model.total < 100) { this.loadData(); } }, 50 )) }; }; buildCallback() { this.setupAction_(); }; mountCallback() { const $el = document.querySelector("#appDiscountFlashsale") this.discount_id = $el.getAttribute('flashsale-id'); this.image_size = $el.getAttribute('image-size'); if(!this.discount_id) return; this.getDiscountList(); }; } SPZ.defineElement('spz-custom-discount-flashsale', SpzCustomDiscountFlashsale);
Log in
Create an account
(function(){ let w = window.innerWidth; function setHeaderCssVar() { const headerEle = document.getElementById('shoplaza-section-header'); if(!headerEle){ return }; document.body.style.setProperty('--window-height', `${window.innerHeight}px`); document.body.style.setProperty('--header-height', `${headerEle.clientHeight}px`); const mdScorllHideEle = headerEle.querySelector('.header__mobile .header__scroll_hide'); if (mdScorllHideEle) { document.body.style.setProperty('--header-scroll-hide-height-md', `${mdScorllHideEle.clientHeight}px`); } const pcScorllHideEle = headerEle.querySelector('.header__desktop .header__scroll_hide'); if (pcScorllHideEle) { document.body.style.setProperty('--header-scroll-hide-height-pc', `${pcScorllHideEle.clientHeight}px`); } } function handlResize() { if(w == window.innerWidth){return}; w = window.innerWidth; setHeaderCssVar(); }; function init(){ setHeaderCssVar(); window.removeEventListener('resize', window._theme_header_listener) window._theme_header_listener = handlResize; window.addEventListener('resize', window._theme_header_listener); } init(); })();
${function() { return `
0 ? (data.index - 1) : (data.total - 1)},animate=true,direct=-1); " data-type="prev">
` }()}
All Products
(4-Pack)Fall Winter Ultra Soft Wide Leg Breathable Pocket Gym Running Athletic Sweatpants
$19.99
Add to cart
Choose an option
Rose red + navy blue + light gray + black-XXS/
$19.99
Rose red + navy blue + light gray + black-XS/
$19.99
Rose red + navy blue + light gray + black-S/
$19.99
Rose red + navy blue + light gray + black-M/
$19.99
Rose red + navy blue + light gray + black-L/
$19.99
Rose red + navy blue + light gray + black-XL/
$19.99
Rose red + navy blue + light gray + black-XXL/
$19.99
Rose red + navy blue + light gray + black-XXXL/
$19.99
Rose red + navy blue + light gray + black-XXXXL/
$19.99
Light gray + White + Black + Dark gray-XXS/
$19.99
Light gray + White + Black + Dark gray-XS/
$19.99
Light gray + White + Black + Dark gray-S/
$19.99
Light gray + White + Black + Dark gray-M/
$19.99
Light gray + White + Black + Dark gray-L/
$19.99
Light gray + White + Black + Dark gray-XL/
$19.99
Light gray + White + Black + Dark gray-XXL/
$19.99
Light gray + White + Black + Dark gray-XXXL/
$19.99
Light gray + White + Black + Dark gray-XXXXL/
$19.99
Rose red + Apricot + Navy blue + Light gray-XXS/
$19.99
Rose red + Apricot + Navy blue + Light gray-XS/
$19.99
Rose red + Apricot + Navy blue + Light gray-S/
$19.99
Rose red + Apricot + Navy blue + Light gray-M/
$19.99
Rose red + Apricot + Navy blue + Light gray-L/
$19.99
Rose red + Apricot + Navy blue + Light gray-XL/
$19.99
Rose red + Apricot + Navy blue + Light gray-XXL/
$19.99
Rose red + Apricot + Navy blue + Light gray-XXXL/
$19.99
Rose red + Apricot + Navy blue + Light gray-XXXXL/
$19.99
Dark gray + navy blue + light gray + black-XXS/
$19.99
Dark gray + navy blue + light gray + black-XS/
$19.99
Dark gray + navy blue + light gray + black-S/
$19.99
(4-pack)Men’s Casual Sweat Stretchable Breathable Knee-Length Shorts
$19.99
Add to cart
Choose an option
Light gray + black + rose red + navy blue-XXS/
$19.99
Light gray + black + rose red + navy blue-XS/
$19.99
Light gray + black + rose red + navy blue-S/
$19.99
Light gray + black + rose red + navy blue-M/
$19.99
Light gray + black + rose red + navy blue-L/
$19.99
Light gray + black + rose red + navy blue-XL/
$19.99
Light gray + black + rose red + navy blue-XXL/
$19.99
Light gray + black + rose red + navy blue-XXXL/
$19.99
Light gray + black + rose red + navy blue-XXXXL/
$19.99
Light gray + black + navy blue + dark gray-XXS/
$19.99
Light gray + black + navy blue + dark gray-XS/
$19.99
Light gray + black + navy blue + dark gray-S/
$19.99
Light gray + black + navy blue + dark gray-M/
$19.99
Light gray + black + navy blue + dark gray-L/
$19.99
Light gray + black + navy blue + dark gray-XL/
$19.99
Light gray + black + navy blue + dark gray-XXL/
$19.99
Light gray + black + navy blue + dark gray-XXXL/
$19.99
Light gray + black + navy blue + dark gray-XXXXL/
$19.99
Light gray + black + white + dark gray-XXS/
$19.99
Light gray + black + white + dark gray-XS/
$19.99
Light gray + black + white + dark gray-S/
$19.99
Light gray + black + white + dark gray-M/
$19.99
Light gray + black + white + dark gray-L/
$19.99
Light gray + black + white + dark gray-XL/
$19.99
Light gray + black + white + dark gray-XXL/
$19.99
Light gray + black + white + dark gray-XXXL/
$19.99
Light gray + black + white + dark gray-XXXXL/
$19.99
Light gray + black + black + navy blue-XXS/
$19.99
Light gray + black + black + navy blue-XS/
$19.99
Light gray + black + black + navy blue-S/
$19.99
Oversized Thermal Fleece Drawstring Winter Daily Mens Sweatpants
from
$14.99
Add to cart
Choose an option
Black+dark gray+light gray-XS/
$19.99
Black+dark gray+light gray-S/
$19.99
Black+dark gray+light gray-M/
$19.99
Black+dark gray+light gray-L/
$19.99
Black+dark gray+light gray-XL/
$19.99
Black+dark gray+light gray-XXL/
$19.99
Black+light gray+navy blue-XS/
$19.99
Black+light gray+navy blue-S/
$19.99
Black+light gray+navy blue-M/
$19.99
Black+light gray+navy blue-L/
$19.99
Black+light gray+navy blue-XL/
$19.99
Black+light gray+navy blue-XXL/
$19.99
Black+dark gray+navy blue-XS/
$19.99
Black+dark gray+navy blue-S/
$19.99
Black+dark gray+navy blue-M/
$19.99
Black+dark gray+navy blue-L/
$19.99
Black+dark gray+navy blue-XL/
$19.99
Black+dark gray+navy blue-XXL/
$19.99
Black+light gray+lake green-XS/
$19.99
Black+light gray+lake green-S/
$19.99
Black+light gray+lake green-M/
$19.99
Black+light gray+lake green-L/
$19.99
Black+light gray+lake green-XL/
$19.99
Black+light gray+lake green-XXL/
$19.99
Black+light gray+rose red-XS/
$19.99
Black+light gray+rose red-S/
$19.99
Black+light gray+rose red-M/
$19.99
Black+light gray+rose red-L/
$19.99
Black+light gray+rose red-XL/
$19.99
Black+light gray+rose red-XXL/
$19.99
Save 57%
Save 57%
Oversized Unisex Vintage Heavyweight Cotton T-Shirts
$19.99
$45.99
+2
Add to cart
Choose an option
Grey+coffee+apricot+purple+rose-Small/
$19.99
$45.99
Grey+coffee+apricot+purple+rose-Medium/
$19.99
$45.99
Grey+coffee+apricot+purple+rose-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+rose-X-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+rose-XX-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+blue-Small/
$19.99
$45.99
Grey+coffee+apricot+purple+blue-Medium/
$19.99
$45.99
Grey+coffee+apricot+purple+blue-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+blue-X-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+blue-XX-Large/
$19.99
$45.99
Black+grey+coffee+apricot+blue-Small/
$19.99
$45.99
Black+grey+coffee+apricot+blue-Medium/
$19.99
$45.99
Black+grey+coffee+apricot+blue-Large/
$19.99
$45.99
Black+grey+coffee+apricot+blue-X-Large/
$19.99
$45.99
Black+grey+coffee+apricot+blue-XX-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+green-Small/
$19.99
$45.99
Grey+coffee+apricot+purple+green-Medium/
$19.99
$45.99
Grey+coffee+apricot+purple+green-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+green-X-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+green-XX-Large/
$19.99
$45.99
Black+grey+coffee+apricot+purple-Small/
$19.99
$45.99
Black+grey+coffee+apricot+purple-Medium/
$19.99
$45.99
Black+grey+coffee+apricot+purple-Large/
$19.99
$45.99
Black+grey+coffee+apricot+purple-X-Large/
$19.99
$45.99
Black+grey+coffee+apricot+purple-XX-Large/
$19.99
$45.99
Rose+purple+blue+green+apricot-Small/
$19.99
$45.99
Rose+purple+blue+green+apricot-Medium/
$19.99
$45.99
Rose+purple+blue+green+apricot-Large/
$19.99
$45.99
Rose+purple+blue+green+apricot-X-Large/
$19.99
$45.99
Rose+purple+blue+green+apricot-XX-Large/
$19.99
$45.99
Save 33%
Save 33%
Men's Solid Pocket Lightweight Breathable Casual Workout Shorts
$19.99
$29.99
Add to cart
Choose an option
Black+Dark Grey+Light Grey+Light Blue-S/
$19.99
$29.99
Black+Dark Grey+Light Grey+Light Blue-M/
$19.99
$29.99
Black+Dark Grey+Light Grey+Light Blue-L/
$19.99
$29.99
Black+Dark Grey+Light Grey+Light Blue-XL/
$19.99
$29.99
Black+Dark Grey+Light Grey+Light Blue-XXL/
$19.99
$29.99
Black+light blue+dark gray+rose red-S/
$19.99
$29.99
Black+light blue+dark gray+rose red-M/
$19.99
$29.99
Black+light blue+dark gray+rose red-L/
$19.99
$29.99
Black+light blue+dark gray+rose red-XL/
$19.99
$29.99
Black+light blue+dark gray+rose red-XXL/
$19.99
$29.99
Black+light gray+dark gray+rose red-S/
$19.99
$29.99
Black+light gray+dark gray+rose red-M/
$19.99
$29.99
Black+light gray+dark gray+rose red-L/
$19.99
$29.99
Black+light gray+dark gray+rose red-XL/
$19.99
$29.99
Black+light gray+dark gray+rose red-XXL/
$19.99
$29.99
Black+light gray+light blue+rose red-S/
$19.99
$29.99
Black+light gray+light blue+rose red-M/
$19.99
$29.99
Black+light gray+light blue+rose red-L/
$19.99
$29.99
Black+light gray+light blue+rose red-XL/
$19.99
$29.99
Black+light gray+light blue+rose red-XXL/
$19.99
$29.99
Light Blue+Light Grey+Dark Grey+Rose Red-S/
$19.99
$29.99
Light Blue+Light Grey+Dark Grey+Rose Red-M/
$19.99
$29.99
Light Blue+Light Grey+Dark Grey+Rose Red-L/
$19.99
$29.99
Light Blue+Light Grey+Dark Grey+Rose Red-XL/
$19.99
$29.99
Light Blue+Light Grey+Dark Grey+Rose Red-XXL/
$19.99
$29.99
(3-pack)Unisex Acid Wash Tank Top - Vintage Cotton Tee
$15.99
Add to cart
Choose an option
Black + Coffee + Gray-S/
$15.99
Black + Coffee + Gray-M/
$15.99
Black + Coffee + Gray-L/
$15.99
Black + Coffee + Gray-XL/
$15.99
Coffee + Apricot + Rose Red-S/
$15.99
Coffee + Apricot + Rose Red-M/
$15.99
Coffee + Apricot + Rose Red-L/
$15.99
Coffee + Apricot + Rose Red-XL/
$15.99
Coffee + Apricot + Gray-S/
$15.99
Coffee + Apricot + Gray-M/
$15.99
Coffee + Apricot + Gray-L/
$15.99
Coffee + Apricot + Gray-XL/
$15.99
Black + Gray + Apricot-S/
$15.99
Black + Gray + Apricot-M/
$15.99
Black + Gray + Apricot-L/
$15.99
Black + Gray + Apricot-XL/
$15.99
Rose red + Apricot + Gray-S/
$15.99
Rose red + Apricot + Gray-M/
$15.99
Rose red + Apricot + Gray-L/
$15.99
Rose red + Apricot + Gray-XL/
$15.99
Black+Khaki+Beige-S/
$15.99
Black+Khaki+Beige-M/
$15.99
Black+Khaki+Beige-L/
$15.99
Black+Khaki+Beige-XL/
$15.99
Black+Grey+Beige-S/
$15.99
Black+Grey+Beige-M/
$15.99
Black+Grey+Beige-L/
$15.99
Black+Grey+Beige-XL/
$15.99
Black+Khaki+Army-S/
$15.99
Black+Khaki+Army-M/
$15.99
4-Pack Oversized Cotton T-Shirts, Unisex
$19.99
Add to cart
Choose an option
Black+Grey+Coffer+Green-S/
$19.99
Black+Grey+Coffer+Green-M/
$19.99
Black+Grey+Coffer+Green-L/
$19.99
Black+Grey+Coffer+Green-XL/
$19.99
Black+Grey+Coffer+Green-XXL/
$19.99
Black+Grey+Coffer+Green-XXXL/
$19.99
Black+Grey+Coffer+Light Green-S/
$19.99
Black+Grey+Coffer+Light Green-M/
$19.99
Black+Grey+Coffer+Light Green-L/
$19.99
Black+Grey+Coffer+Light Green-XL/
$19.99
Black+Grey+Coffer+Light Green-XXL/
$19.99
Black+Grey+Coffer+Light Green-XXXL/
$19.99
Black+Grey+Coffer+Light Blue-S/
$19.99
Black+Grey+Coffer+Light Blue-M/
$19.99
Black+Grey+Coffer+Light Blue-L/
$19.99
Black+Grey+Coffer+Light Blue-XL/
$19.99
Black+Grey+Coffer+Light Blue-XXL/
$19.99
Black+Grey+Coffer+Light Blue-XXXL/
$19.99
Black+Grey+Coffer+Orange-S/
$19.99
Black+Grey+Coffer+Orange-M/
$19.99
Black+Grey+Coffer+Orange-L/
$19.99
Black+Grey+Coffer+Orange-XL/
$19.99
Black+Grey+Coffer+Orange-XXL/
$19.99
Black+Grey+Coffer+Orange-XXXL/
$19.99
Black+Grey+Coffer+Beige-S/
$19.99
Black+Grey+Coffer+Beige-M/
$19.99
Black+Grey+Coffer+Beige-L/
$19.99
Black+Grey+Coffer+Beige-XL/
$19.99
Black+Grey+Coffer+Beige-XXL/
$19.99
Black+Grey+Coffer+Beige-XXXL/
$19.99
Enchante Floral Lace Plus Size Minimizer Bra
from
$19.99
Add to cart
Choose an option
4-PACKS-S/
$19.99
4-PACKS-M/
$19.99
4-PACKS-L/
$19.99
4-PACKS-XL/
$19.99
4-PACKS-2XL/
$19.99
4-PACKS-3XL/
$19.99
4-PACKS-4XL/
$19.99
6-PACKS-S/
$29.99
6-PACKS-M/
$29.99
6-PACKS-L/
$29.99
6-PACKS-XL/
$29.99
6-PACKS-2XL/
$29.99
6-PACKS-3XL/
$29.99
6-PACKS-4XL/
$29.99
Men's Cotton Blend Hoodie Long Sleeve Regular Fit
$19.99
Add to cart
Choose an option
Light gray+Dark gray+Black-XS/
$19.99
Light gray+Dark gray+Black-S/
$19.99
Light gray+Dark gray+Black-M/
$19.99
Light gray+Dark gray+Black-L/
$19.99
Light gray+Dark gray+Black-XL/
$19.99
Light gray+Dark gray+Black-2XL/
$19.99
Black+Light gray+Light blue-XS/
$19.99
Black+Light gray+Light blue-S/
$19.99
Black+Light gray+Light blue-M/
$19.99
Black+Light gray+Light blue-L/
$19.99
Black+Light gray+Light blue-XL/
$19.99
Black+Light gray+Light blue-2XL/
$19.99
Black+Light gray+Beige-XS/
$19.99
Black+Light gray+Beige-S/
$19.99
Black+Light gray+Beige-M/
$19.99
Black+Light gray+Beige-L/
$19.99
Black+Light gray+Beige-XL/
$19.99
Black+Light gray+Beige-2XL/
$19.99
Black+Light gray+Light Ash Gray-XS/
$19.99
Black+Light gray+Light Ash Gray-S/
$19.99
Black+Light gray+Light Ash Gray-M/
$19.99
Black+Light gray+Light Ash Gray-L/
$19.99
Black+Light gray+Light Ash Gray-XL/
$19.99
Black+Light gray+Light Ash Gray-2XL/
$19.99
Black+Rose red+Dark gray-XS/
$19.99
Black+Rose red+Dark gray-S/
$19.99
Black+Rose red+Dark gray-M/
$19.99
Black+Rose red+Dark gray-L/
$19.99
Black+Rose red+Dark gray-XL/
$19.99
Black+Rose red+Dark gray-2XL/
$19.99
Save 33%
Save 33%
Men's 5-Pack Quick-Dry Athletic Shorts
$19.99
$29.99
Add to cart
Choose an option
White + Wine Red + Lake Blue + Gray + Black-XS/
$19.99
$29.99
White + Wine Red + Lake Blue + Gray + Black-S/
$19.99
$29.99
White + Wine Red + Lake Blue + Gray + Black-M/
$19.99
$29.99
White + Wine Red + Lake Blue + Gray + Black-L/
$19.99
$29.99
White + Wine Red + Lake Blue + Gray + Black-XL/
$19.99
$29.99
White + Wine Red + Lake Blue + Gray + Black-XXL/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-XS/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-S/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-M/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-L/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-XL/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-XXL/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-XS/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-S/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-M/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-L/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-XL/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-XXL/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-XS/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-S/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-M/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-L/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-XL/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-XXL/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-XS/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-S/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-M/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-L/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-XL/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-XXL/
$19.99
$29.99
Cotton 2-Piece All-Over Leopard Print Streetwear Set
$15.00
Add to cart
Choose an option
Dark gray-XXS/
$15.00
Dark gray-XS/
$15.00
Dark gray-S/
$15.00
Dark gray-M/
$15.00
Dark gray-L/
$15.00
Dark gray-XL/
$15.00
Dark gray-2XL/
$15.00
Khaki-XXS/
$15.00
Khaki-XS/
$15.00
Khaki-S/
$15.00
Khaki-M/
$15.00
Khaki-L/
$15.00
Khaki-XL/
$15.00
Khaki-2XL/
$15.00
Rose red-XXS/
$15.00
Rose red-XS/
$15.00
Rose red-S/
$15.00
Rose red-M/
$15.00
Rose red-L/
$15.00
Rose red-XL/
$15.00
Rose red-2XL/
$15.00
Dark blue-XXS/
$15.00
Dark blue-XS/
$15.00
Dark blue-S/
$15.00
Dark blue-M/
$15.00
Dark blue-L/
$15.00
Dark blue-XL/
$15.00
Dark blue-2XL/
$15.00
Colorful orchid blue-XXS/
$15.00
Colorful orchid blue-XS/
$15.00
Womens Strapless Front Closure Bra Push Up Padded Add Cup Non Slip Wireless Supportive Seamless Comfortable Tube Jelly Bra A B C Cup#SummerVibe
from
$9.99
Add to cart
Choose an option
Nude(3-pcs)-S(32A/32B/32C)/
$19.99
Nude(3-pcs)-M(34A/34B/34C)/
$19.99
Nude(3-pcs)-L(36A/36B/36C)/
$19.99
Nude(3-pcs)-XL(38A/38B/38C)/
$19.99
White+Black+Nude-S(32A/32B/32C)/
$19.99
White+Black+Nude-M(34A/34B/34C)/
$19.99
White+Black+Nude-L(36A/36B/36C)/
$19.99
White+Black+Nude-XL(38A/38B/38C)/
$19.99
Pink+Black+Nude-S(32A/32B/32C)/
$19.99
Pink+Black+Nude-M(34A/34B/34C)/
$19.99
Pink+Black+Nude-L(36A/36B/36C)/
$19.99
Pink+Black+Nude-XL(38A/38B/38C)/
$19.99
Black(3-pcs)-S(32A/32B/32C)/
$19.99
Black(3-pcs)-M(34A/34B/34C)/
$19.99
Black(3-pcs)-L(36A/36B/36C)/
$19.99
Black(3-pcs)-XL(38A/38B/38C)/
$19.99
White+Pink+Nude-S(32A/32B/32C)/
$19.99
White+Pink+Nude-M(34A/34B/34C)/
$19.99
White+Pink+Nude-L(36A/36B/36C)/
$19.99
White+Pink+Nude-XL(38A/38B/38C)/
$19.99
Blue+White+Nude-S(32A/32B/32C)/
$19.99
Blue+White+Nude-M(34A/34B/34C)/
$19.99
Blue+White+Nude-L(36A/36B/36C)/
$19.99
Blue+White+Nude-XL(38A/38B/38C)/
$19.99
Black+Nude+Brown-S(32A/32B/32C)/
$19.99
Black+Nude+Brown-M(34A/34B/34C)/
$19.99
Black+Nude+Brown-L(36A/36B/36C)/
$19.99
Black+Nude+Brown-XL(38A/38B/38C)/
$19.99
Green+White+Black-S(32A/32B/32C)/
$19.99
Green+White+Black-M(34A/34B/34C)/
$19.99
Save 60%
Save 60%
Men's Crew Neck Cotton Short Sleeve Tees
from
$19.99
$49.99
+1
Add to cart
Choose an option
Black(12-pack)-S/
$29.99
$49.99
White(12-pack)-S/
$29.99
$49.99
Black(6-pack)-S/
$19.99
$49.99
White(6-pack)-S/
$19.99
$49.99
Black(12-pack)-M/
$29.99
$49.99
Black(12-pack)-L/
$29.99
$49.99
Black(12-pack)-XL/
$29.99
$49.99
Black(12-pack)-2XL/
$29.99
$49.99
Black(12-pack)-3XL/
$29.99
$49.99
White(12-pack)-M/
$29.99
$49.99
White(12-pack)-L/
$29.99
$49.99
White(12-pack)-XL/
$29.99
$49.99
White(12-pack)-2XL/
$29.99
$49.99
White(12-pack)-3XL/
$29.99
$49.99
Black(6-pack)-M/
$19.99
$49.99
Black(6-pack)-L/
$19.99
$49.99
Black(6-pack)-XL/
$19.99
$49.99
Black(6-pack)-2XL/
$19.99
$49.99
Black(6-pack)-3XL/
$19.99
$49.99
White(6-pack)-M/
$19.99
$49.99
White(6-pack)-L/
$19.99
$49.99
White(6-pack)-XL/
$19.99
$49.99
White(6-pack)-2XL/
$19.99
$49.99
White(6-pack)-3XL/
$19.99
$49.99
Save 40%
Save 40%
Premium Ultra-Soft Cotton Fitted Tank
$17.99
$29.99
+2
Add to cart
Choose an option
Black/White/Heather Brown-S/
$17.99
$29.99
Black-S/
$17.99
$29.99
White-S/
$17.99
$29.99
Heather Brown-S/
$17.99
$29.99
Steel Blue-S/
$17.99
$29.99
Black/White/Heather Brown-M/
$17.99
$29.99
Black/White/Heather Brown-L/
$17.99
$29.99
Black/White/Heather Brown-XL/
$17.99
$29.99
Black/White/Heather Brown-XXL/
$17.99
$29.99
Black/White/Heather Brown-3XL/
$17.99
$29.99
Black/White/Heather Brown-4XL/
$17.99
$29.99
Black-M/
$17.99
$29.99
Black-L/
$17.99
$29.99
Black-XL/
$17.99
$29.99
Black-XXL/
$17.99
$29.99
Black-3XL/
$17.99
$29.99
Black-4XL/
$17.99
$29.99
White-M/
$17.99
$29.99
White-L/
$17.99
$29.99
White-XL/
$17.99
$29.99
White-XXL/
$17.99
$29.99
White-3XL/
$17.99
$29.99
White-4XL/
$17.99
$29.99
Heather Brown-M/
$17.99
$29.99
Heather Brown-L/
$17.99
$29.99
Heather Brown-XL/
$17.99
$29.99
Heather Brown-XXL/
$17.99
$29.99
Heather Brown-3XL/
$17.99
$29.99
Heather Brown-4XL/
$17.99
$29.99
Steel Blue-M/
$17.99
$29.99
Summervibes Men's Cotton Crew Neck T-Shirt Set - 5 Pack
$19.99
Add to cart
Choose an option
Black + Army Green + Conceal Blue + Gray + White-S/
$19.99
Black + Army Green + Conceal Blue + Gray + White-M/
$19.99
Black + Army Green + Conceal Blue + Gray + White-L/
$19.99
Black + Army Green + Conceal Blue + Gray + White-XL/
$19.99
Black + Army Green + Conceal Blue + Gray + White-XXL/
$19.99
Navy blue + Black + Gray + Apricot + White-S/
$19.99
Navy blue + Black + Gray + Apricot + White-M/
$19.99
Navy blue + Black + Gray + Apricot + White-L/
$19.99
Navy blue + Black + Gray + Apricot + White-XL/
$19.99
Navy blue + Black + Gray + Apricot + White-XXL/
$19.99
Military Green + Black + Concealed Blue + Gray + Apricot-S/
$19.99
Military Green + Black + Concealed Blue + Gray + Apricot-M/
$19.99
Military Green + Black + Concealed Blue + Gray + Apricot-L/
$19.99
Military Green + Black + Concealed Blue + Gray + Apricot-XL/
$19.99
Military Green + Black + Concealed Blue + Gray + Apricot-XXL/
$19.99
Black + Dark Blue + Gray + White + Light Blue-S/
$19.99
Black + Dark Blue + Gray + White + Light Blue-M/
$19.99
Black + Dark Blue + Gray + White + Light Blue-L/
$19.99
Black + Dark Blue + Gray + White + Light Blue-XL/
$19.99
Black + Dark Blue + Gray + White + Light Blue-XXL/
$19.99
Black + Army Green + Conceal Blue + Gray + Apricot-S/
$19.99
Black + Army Green + Conceal Blue + Gray + Apricot-M/
$19.99
Black + Army Green + Conceal Blue + Gray + Apricot-L/
$19.99
Black + Army Green + Conceal Blue + Gray + Apricot-XL/
$19.99
Black + Army Green + Conceal Blue + Gray + Apricot-XXL/
$19.99
Navy blue + Black + White + Gray + Apricot-S/
$19.99
Navy blue + Black + White + Gray + Apricot-M/
$19.99
Navy blue + Black + White + Gray + Apricot-L/
$19.99
Navy blue + Black + White + Gray + Apricot-XL/
$19.99
Navy blue + Black + White + Gray + Apricot-XXL/
$19.99
Save 40%
Save 40%
athletic shorts lightweight moisture wicking with zipper pockets
$14.99
$24.99
+8
Add to cart
Choose an option
Small-Black/Green/Blue/
$14.99
$24.99
Small-Black/Gray/Blue/
$14.99
$24.99
Small-Black/Dark Blue/Khaki/
$14.99
$24.99
Small-Dark Blue/Wine Red/Khaki/
$14.99
$24.99
Small-261black/Beige/White/
$14.99
$24.99
Small-261beige/Gray/White/
$14.99
$24.99
Small-261black/Gray/Army Green/
$14.99
$24.99
Small-261beige/Gray/Green/
$14.99
$24.99
Small-261black/Gray/Dark Green/
$14.99
$24.99
Small-261black/Gray/White/
$14.99
$24.99
Small-261army Green/Gray/Green/
$14.99
$24.99
Medium-Black/Green/Blue/
$14.99
$24.99
Medium-Black/Gray/Blue/
$14.99
$24.99
Medium-Black/Dark Blue/Khaki/
$14.99
$24.99
Medium-Dark Blue/Wine Red/Khaki/
$14.99
$24.99
Medium-261black/Beige/White/
$14.99
$24.99
Medium-261beige/Gray/White/
$14.99
$24.99
Medium-261black/Gray/Army Green/
$14.99
$24.99
Medium-261beige/Gray/Green/
$14.99
$24.99
Medium-261black/Gray/Dark Green/
$14.99
$24.99
Medium-261black/Gray/White/
$14.99
$24.99
Medium-261army Green/Gray/Green/
$14.99
$24.99
Large-Black/Green/Blue/
$14.99
$24.99
Large-Black/Gray/Blue/
$14.99
$24.99
Large-Black/Dark Blue/Khaki/
$14.99
$24.99
Large-Dark Blue/Wine Red/Khaki/
$14.99
$24.99
Large-261black/Beige/White/
$14.99
$24.99
Large-261beige/Gray/White/
$14.99
$24.99
Large-261black/Gray/Army Green/
$14.99
$24.99
Large-261beige/Gray/Green/
$14.99
$24.99
(4-Pack)Summer Casual Elastic Waist Drawstring Wide Leg Breathable Pants
$19.99
Add to cart
Choose an option
Navy blue + Apricot + Black + White-XS/
$19.99
Navy blue + Apricot + Black + White-S/
$19.99
Navy blue + Apricot + Black + White-M/
$19.99
Navy blue + Apricot + Black + White-L/
$19.99
Navy blue + Apricot + Black + White-XL/
$19.99
Navy blue + Apricot + Black + White-XXL/
$19.99
Light gray + Apricot + Black + White-XS/
$19.99
Light gray + Apricot + Black + White-S/
$19.99
Light gray + Apricot + Black + White-M/
$19.99
Light gray + Apricot + Black + White-L/
$19.99
Light gray + Apricot + Black + White-XL/
$19.99
Light gray + Apricot + Black + White-XXL/
$19.99
Light green + black + white + apricot-XS/
$19.99
Light green + black + white + apricot-S/
$19.99
Light green + black + white + apricot-M/
$19.99
Light green + black + white + apricot-L/
$19.99
Light green + black + white + apricot-XL/
$19.99
Light green + black + white + apricot-XXL/
$19.99
Light Blue + Apricot + Black + White-XS/
$19.99
Light Blue + Apricot + Black + White-S/
$19.99
Light Blue + Apricot + Black + White-M/
$19.99
Light Blue + Apricot + Black + White-L/
$19.99
Light Blue + Apricot + Black + White-XL/
$19.99
Light Blue + Apricot + Black + White-XXL/
$19.99
Light Blue + Light Gray + White + Apricot-XS/
$19.99
Light Blue + Light Gray + White + Apricot-S/
$19.99
Light Blue + Light Gray + White + Apricot-M/
$19.99
Light Blue + Light Gray + White + Apricot-L/
$19.99
Light Blue + Light Gray + White + Apricot-XL/
$19.99
Light Blue + Light Gray + White + Apricot-XXL/
$19.99
Slim Fit White and Black Tees Crewneck
$19.99
Add to cart
Choose an option
Black-S/
$19.99
Black-M/
$19.99
Black-L/
$19.99
Black-XL/
$19.99
Black-XXL/
$19.99
White-S/
$19.99
White-M/
$19.99
White-L/
$19.99
White-XL/
$19.99
White-XXL/
$19.99
(3-Pack)Vintage Acid Wash Cotton Elastic Drawstring Pocket Casual Athletic Unisex Shorts
$17.99
Add to cart
Choose an option
Black+Grey+Army-Small/
$17.99
Black+Grey+Army-Medium/
$17.99
Black+Grey+Army-Large/
$17.99
Black+Grey+Army-X-Large/
$17.99
Black+Grey+Army-XX-Large/
$17.99
Black+Grey+Navy-Small/
$17.99
Black+Grey+Navy-Medium/
$17.99
Black+Grey+Navy-Large/
$17.99
Black+Grey+Navy-X-Large/
$17.99
Black+Grey+Navy-XX-Large/
$17.99
Black+Grey+Red-Small/
$17.99
Black+Grey+Red-Medium/
$17.99
Black+Grey+Red-Large/
$17.99
Black+Grey+Red-X-Large/
$17.99
Black+Grey+Red-XX-Large/
$17.99
Grey+Navy+Army-Small/
$17.99
Grey+Navy+Army-Medium/
$17.99
Grey+Navy+Army-Large/
$17.99
Grey+Navy+Army-X-Large/
$17.99
Grey+Navy+Army-XX-Large/
$17.99
Save 56%
Save 56%
Premium Crew Neck T‐Shirt
$23.99
$54.00
Add to cart
Choose an option
BLACK、WHITE-S/
$23.99
$54.00
SIX COLORS-S/
$23.99
$54.00
BLACK、WHITE-M/
$23.99
$54.00
BLACK、WHITE-L/
$23.99
$54.00
BLACK、WHITE-XL/
$23.99
$54.00
BLACK、WHITE-2XL/
$23.99
$54.00
SIX COLORS-M/
$23.99
$54.00
SIX COLORS-L/
$23.99
$54.00
SIX COLORS-XL/
$23.99
$54.00
SIX COLORS-2XL/
$23.99
$54.00
(4-Pack)Fall Winter Ultra Soft Wide Leg Breathable Pocket Gym Running Athletic Sweatpants
$19.99
Add to cart
Choose an option
Rose red + navy blue + light gray + black-XXS/
$19.99
Rose red + navy blue + light gray + black-XS/
$19.99
Rose red + navy blue + light gray + black-S/
$19.99
Rose red + navy blue + light gray + black-M/
$19.99
Rose red + navy blue + light gray + black-L/
$19.99
Rose red + navy blue + light gray + black-XL/
$19.99
Rose red + navy blue + light gray + black-XXL/
$19.99
Rose red + navy blue + light gray + black-XXXL/
$19.99
Rose red + navy blue + light gray + black-XXXXL/
$19.99
Light gray + White + Black + Dark gray-XXS/
$19.99
Light gray + White + Black + Dark gray-XS/
$19.99
Light gray + White + Black + Dark gray-S/
$19.99
Light gray + White + Black + Dark gray-M/
$19.99
Light gray + White + Black + Dark gray-L/
$19.99
Light gray + White + Black + Dark gray-XL/
$19.99
Light gray + White + Black + Dark gray-XXL/
$19.99
Light gray + White + Black + Dark gray-XXXL/
$19.99
Light gray + White + Black + Dark gray-XXXXL/
$19.99
Rose red + Apricot + Navy blue + Light gray-XXS/
$19.99
Rose red + Apricot + Navy blue + Light gray-XS/
$19.99
Rose red + Apricot + Navy blue + Light gray-S/
$19.99
Rose red + Apricot + Navy blue + Light gray-M/
$19.99
Rose red + Apricot + Navy blue + Light gray-L/
$19.99
Rose red + Apricot + Navy blue + Light gray-XL/
$19.99
Rose red + Apricot + Navy blue + Light gray-XXL/
$19.99
Rose red + Apricot + Navy blue + Light gray-XXXL/
$19.99
Rose red + Apricot + Navy blue + Light gray-XXXXL/
$19.99
Dark gray + navy blue + light gray + black-XXS/
$19.99
Dark gray + navy blue + light gray + black-XS/
$19.99
Dark gray + navy blue + light gray + black-S/
$19.99
(4-pack)Men’s Casual Sweat Stretchable Breathable Knee-Length Shorts
$19.99
Add to cart
Choose an option
Light gray + black + rose red + navy blue-XXS/
$19.99
Light gray + black + rose red + navy blue-XS/
$19.99
Light gray + black + rose red + navy blue-S/
$19.99
Light gray + black + rose red + navy blue-M/
$19.99
Light gray + black + rose red + navy blue-L/
$19.99
Light gray + black + rose red + navy blue-XL/
$19.99
Light gray + black + rose red + navy blue-XXL/
$19.99
Light gray + black + rose red + navy blue-XXXL/
$19.99
Light gray + black + rose red + navy blue-XXXXL/
$19.99
Light gray + black + navy blue + dark gray-XXS/
$19.99
Light gray + black + navy blue + dark gray-XS/
$19.99
Light gray + black + navy blue + dark gray-S/
$19.99
Light gray + black + navy blue + dark gray-M/
$19.99
Light gray + black + navy blue + dark gray-L/
$19.99
Light gray + black + navy blue + dark gray-XL/
$19.99
Light gray + black + navy blue + dark gray-XXL/
$19.99
Light gray + black + navy blue + dark gray-XXXL/
$19.99
Light gray + black + navy blue + dark gray-XXXXL/
$19.99
Light gray + black + white + dark gray-XXS/
$19.99
Light gray + black + white + dark gray-XS/
$19.99
Light gray + black + white + dark gray-S/
$19.99
Light gray + black + white + dark gray-M/
$19.99
Light gray + black + white + dark gray-L/
$19.99
Light gray + black + white + dark gray-XL/
$19.99
Light gray + black + white + dark gray-XXL/
$19.99
Light gray + black + white + dark gray-XXXL/
$19.99
Light gray + black + white + dark gray-XXXXL/
$19.99
Light gray + black + black + navy blue-XXS/
$19.99
Light gray + black + black + navy blue-XS/
$19.99
Light gray + black + black + navy blue-S/
$19.99
Oversized Thermal Fleece Drawstring Winter Daily Mens Sweatpants
from
$14.99
Add to cart
Choose an option
Black+dark gray+light gray-XS/
$19.99
Black+dark gray+light gray-S/
$19.99
Black+dark gray+light gray-M/
$19.99
Black+dark gray+light gray-L/
$19.99
Black+dark gray+light gray-XL/
$19.99
Black+dark gray+light gray-XXL/
$19.99
Black+light gray+navy blue-XS/
$19.99
Black+light gray+navy blue-S/
$19.99
Black+light gray+navy blue-M/
$19.99
Black+light gray+navy blue-L/
$19.99
Black+light gray+navy blue-XL/
$19.99
Black+light gray+navy blue-XXL/
$19.99
Black+dark gray+navy blue-XS/
$19.99
Black+dark gray+navy blue-S/
$19.99
Black+dark gray+navy blue-M/
$19.99
Black+dark gray+navy blue-L/
$19.99
Black+dark gray+navy blue-XL/
$19.99
Black+dark gray+navy blue-XXL/
$19.99
Black+light gray+lake green-XS/
$19.99
Black+light gray+lake green-S/
$19.99
Black+light gray+lake green-M/
$19.99
Black+light gray+lake green-L/
$19.99
Black+light gray+lake green-XL/
$19.99
Black+light gray+lake green-XXL/
$19.99
Black+light gray+rose red-XS/
$19.99
Black+light gray+rose red-S/
$19.99
Black+light gray+rose red-M/
$19.99
Black+light gray+rose red-L/
$19.99
Black+light gray+rose red-XL/
$19.99
Black+light gray+rose red-XXL/
$19.99
Save 57%
Save 57%
Oversized Unisex Vintage Heavyweight Cotton T-Shirts
$19.99
$45.99
+2
Add to cart
Choose an option
Grey+coffee+apricot+purple+rose-Small/
$19.99
$45.99
Grey+coffee+apricot+purple+rose-Medium/
$19.99
$45.99
Grey+coffee+apricot+purple+rose-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+rose-X-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+rose-XX-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+blue-Small/
$19.99
$45.99
Grey+coffee+apricot+purple+blue-Medium/
$19.99
$45.99
Grey+coffee+apricot+purple+blue-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+blue-X-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+blue-XX-Large/
$19.99
$45.99
Black+grey+coffee+apricot+blue-Small/
$19.99
$45.99
Black+grey+coffee+apricot+blue-Medium/
$19.99
$45.99
Black+grey+coffee+apricot+blue-Large/
$19.99
$45.99
Black+grey+coffee+apricot+blue-X-Large/
$19.99
$45.99
Black+grey+coffee+apricot+blue-XX-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+green-Small/
$19.99
$45.99
Grey+coffee+apricot+purple+green-Medium/
$19.99
$45.99
Grey+coffee+apricot+purple+green-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+green-X-Large/
$19.99
$45.99
Grey+coffee+apricot+purple+green-XX-Large/
$19.99
$45.99
Black+grey+coffee+apricot+purple-Small/
$19.99
$45.99
Black+grey+coffee+apricot+purple-Medium/
$19.99
$45.99
Black+grey+coffee+apricot+purple-Large/
$19.99
$45.99
Black+grey+coffee+apricot+purple-X-Large/
$19.99
$45.99
Black+grey+coffee+apricot+purple-XX-Large/
$19.99
$45.99
Rose+purple+blue+green+apricot-Small/
$19.99
$45.99
Rose+purple+blue+green+apricot-Medium/
$19.99
$45.99
Rose+purple+blue+green+apricot-Large/
$19.99
$45.99
Rose+purple+blue+green+apricot-X-Large/
$19.99
$45.99
Rose+purple+blue+green+apricot-XX-Large/
$19.99
$45.99
Save 33%
Save 33%
Men's Solid Pocket Lightweight Breathable Casual Workout Shorts
$19.99
$29.99
Add to cart
Choose an option
Black+Dark Grey+Light Grey+Light Blue-S/
$19.99
$29.99
Black+Dark Grey+Light Grey+Light Blue-M/
$19.99
$29.99
Black+Dark Grey+Light Grey+Light Blue-L/
$19.99
$29.99
Black+Dark Grey+Light Grey+Light Blue-XL/
$19.99
$29.99
Black+Dark Grey+Light Grey+Light Blue-XXL/
$19.99
$29.99
Black+light blue+dark gray+rose red-S/
$19.99
$29.99
Black+light blue+dark gray+rose red-M/
$19.99
$29.99
Black+light blue+dark gray+rose red-L/
$19.99
$29.99
Black+light blue+dark gray+rose red-XL/
$19.99
$29.99
Black+light blue+dark gray+rose red-XXL/
$19.99
$29.99
Black+light gray+dark gray+rose red-S/
$19.99
$29.99
Black+light gray+dark gray+rose red-M/
$19.99
$29.99
Black+light gray+dark gray+rose red-L/
$19.99
$29.99
Black+light gray+dark gray+rose red-XL/
$19.99
$29.99
Black+light gray+dark gray+rose red-XXL/
$19.99
$29.99
Black+light gray+light blue+rose red-S/
$19.99
$29.99
Black+light gray+light blue+rose red-M/
$19.99
$29.99
Black+light gray+light blue+rose red-L/
$19.99
$29.99
Black+light gray+light blue+rose red-XL/
$19.99
$29.99
Black+light gray+light blue+rose red-XXL/
$19.99
$29.99
Light Blue+Light Grey+Dark Grey+Rose Red-S/
$19.99
$29.99
Light Blue+Light Grey+Dark Grey+Rose Red-M/
$19.99
$29.99
Light Blue+Light Grey+Dark Grey+Rose Red-L/
$19.99
$29.99
Light Blue+Light Grey+Dark Grey+Rose Red-XL/
$19.99
$29.99
Light Blue+Light Grey+Dark Grey+Rose Red-XXL/
$19.99
$29.99
(3-pack)Unisex Acid Wash Tank Top - Vintage Cotton Tee
$15.99
Add to cart
Choose an option
Black + Coffee + Gray-S/
$15.99
Black + Coffee + Gray-M/
$15.99
Black + Coffee + Gray-L/
$15.99
Black + Coffee + Gray-XL/
$15.99
Coffee + Apricot + Rose Red-S/
$15.99
Coffee + Apricot + Rose Red-M/
$15.99
Coffee + Apricot + Rose Red-L/
$15.99
Coffee + Apricot + Rose Red-XL/
$15.99
Coffee + Apricot + Gray-S/
$15.99
Coffee + Apricot + Gray-M/
$15.99
Coffee + Apricot + Gray-L/
$15.99
Coffee + Apricot + Gray-XL/
$15.99
Black + Gray + Apricot-S/
$15.99
Black + Gray + Apricot-M/
$15.99
Black + Gray + Apricot-L/
$15.99
Black + Gray + Apricot-XL/
$15.99
Rose red + Apricot + Gray-S/
$15.99
Rose red + Apricot + Gray-M/
$15.99
Rose red + Apricot + Gray-L/
$15.99
Rose red + Apricot + Gray-XL/
$15.99
Black+Khaki+Beige-S/
$15.99
Black+Khaki+Beige-M/
$15.99
Black+Khaki+Beige-L/
$15.99
Black+Khaki+Beige-XL/
$15.99
Black+Grey+Beige-S/
$15.99
Black+Grey+Beige-M/
$15.99
Black+Grey+Beige-L/
$15.99
Black+Grey+Beige-XL/
$15.99
Black+Khaki+Army-S/
$15.99
Black+Khaki+Army-M/
$15.99
4-Pack Oversized Cotton T-Shirts, Unisex
$19.99
Add to cart
Choose an option
Black+Grey+Coffer+Green-S/
$19.99
Black+Grey+Coffer+Green-M/
$19.99
Black+Grey+Coffer+Green-L/
$19.99
Black+Grey+Coffer+Green-XL/
$19.99
Black+Grey+Coffer+Green-XXL/
$19.99
Black+Grey+Coffer+Green-XXXL/
$19.99
Black+Grey+Coffer+Light Green-S/
$19.99
Black+Grey+Coffer+Light Green-M/
$19.99
Black+Grey+Coffer+Light Green-L/
$19.99
Black+Grey+Coffer+Light Green-XL/
$19.99
Black+Grey+Coffer+Light Green-XXL/
$19.99
Black+Grey+Coffer+Light Green-XXXL/
$19.99
Black+Grey+Coffer+Light Blue-S/
$19.99
Black+Grey+Coffer+Light Blue-M/
$19.99
Black+Grey+Coffer+Light Blue-L/
$19.99
Black+Grey+Coffer+Light Blue-XL/
$19.99
Black+Grey+Coffer+Light Blue-XXL/
$19.99
Black+Grey+Coffer+Light Blue-XXXL/
$19.99
Black+Grey+Coffer+Orange-S/
$19.99
Black+Grey+Coffer+Orange-M/
$19.99
Black+Grey+Coffer+Orange-L/
$19.99
Black+Grey+Coffer+Orange-XL/
$19.99
Black+Grey+Coffer+Orange-XXL/
$19.99
Black+Grey+Coffer+Orange-XXXL/
$19.99
Black+Grey+Coffer+Beige-S/
$19.99
Black+Grey+Coffer+Beige-M/
$19.99
Black+Grey+Coffer+Beige-L/
$19.99
Black+Grey+Coffer+Beige-XL/
$19.99
Black+Grey+Coffer+Beige-XXL/
$19.99
Black+Grey+Coffer+Beige-XXXL/
$19.99
Enchante Floral Lace Plus Size Minimizer Bra
from
$19.99
Add to cart
Choose an option
4-PACKS-S/
$19.99
4-PACKS-M/
$19.99
4-PACKS-L/
$19.99
4-PACKS-XL/
$19.99
4-PACKS-2XL/
$19.99
4-PACKS-3XL/
$19.99
4-PACKS-4XL/
$19.99
6-PACKS-S/
$29.99
6-PACKS-M/
$29.99
6-PACKS-L/
$29.99
6-PACKS-XL/
$29.99
6-PACKS-2XL/
$29.99
6-PACKS-3XL/
$29.99
6-PACKS-4XL/
$29.99
Men's Cotton Blend Hoodie Long Sleeve Regular Fit
$19.99
Add to cart
Choose an option
Light gray+Dark gray+Black-XS/
$19.99
Light gray+Dark gray+Black-S/
$19.99
Light gray+Dark gray+Black-M/
$19.99
Light gray+Dark gray+Black-L/
$19.99
Light gray+Dark gray+Black-XL/
$19.99
Light gray+Dark gray+Black-2XL/
$19.99
Black+Light gray+Light blue-XS/
$19.99
Black+Light gray+Light blue-S/
$19.99
Black+Light gray+Light blue-M/
$19.99
Black+Light gray+Light blue-L/
$19.99
Black+Light gray+Light blue-XL/
$19.99
Black+Light gray+Light blue-2XL/
$19.99
Black+Light gray+Beige-XS/
$19.99
Black+Light gray+Beige-S/
$19.99
Black+Light gray+Beige-M/
$19.99
Black+Light gray+Beige-L/
$19.99
Black+Light gray+Beige-XL/
$19.99
Black+Light gray+Beige-2XL/
$19.99
Black+Light gray+Light Ash Gray-XS/
$19.99
Black+Light gray+Light Ash Gray-S/
$19.99
Black+Light gray+Light Ash Gray-M/
$19.99
Black+Light gray+Light Ash Gray-L/
$19.99
Black+Light gray+Light Ash Gray-XL/
$19.99
Black+Light gray+Light Ash Gray-2XL/
$19.99
Black+Rose red+Dark gray-XS/
$19.99
Black+Rose red+Dark gray-S/
$19.99
Black+Rose red+Dark gray-M/
$19.99
Black+Rose red+Dark gray-L/
$19.99
Black+Rose red+Dark gray-XL/
$19.99
Black+Rose red+Dark gray-2XL/
$19.99
Save 33%
Save 33%
Men's 5-Pack Quick-Dry Athletic Shorts
$19.99
$29.99
Add to cart
Choose an option
White + Wine Red + Lake Blue + Gray + Black-XS/
$19.99
$29.99
White + Wine Red + Lake Blue + Gray + Black-S/
$19.99
$29.99
White + Wine Red + Lake Blue + Gray + Black-M/
$19.99
$29.99
White + Wine Red + Lake Blue + Gray + Black-L/
$19.99
$29.99
White + Wine Red + Lake Blue + Gray + Black-XL/
$19.99
$29.99
White + Wine Red + Lake Blue + Gray + Black-XXL/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-XS/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-S/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-M/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-L/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-XL/
$19.99
$29.99
Burgundy + Army Green + Blue + Gray + Black-XXL/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-XS/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-S/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-M/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-L/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-XL/
$19.99
$29.99
Lake Blue + Army Green + Blue + Gray + Black-XXL/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-XS/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-S/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-M/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-L/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-XL/
$19.99
$29.99
Khaki + Army Green + Blue + Gray + Black-XXL/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-XS/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-S/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-M/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-L/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-XL/
$19.99
$29.99
White + Army Green + Blue + Gray + Black-XXL/
$19.99
$29.99
View more
Cart
Your shopping bag is empty
Continue shopping
${item.product_title}
${item.options.map(option => option.value).join('/')}
${propertie.name}/${propertie.isImage ? `
View image
` : propertie.value}
Free gift
Mixed Lot
*${item.quantity}
${item.item_text}
${discount_item.title}
(-
)
Total:
${function() { const textArray = ("Save {{save_amount}}").split(/\{\{\s*save_amount\}\}/); if (textArray.length > 0 && textArray.length < 2) { textArray.push(''); } return textArray.map((text, index) => { if (index == 0) { return `
${text}
`; } return `
${text}
`; }).join(''); }()}
${function() { const textArray = ("Save {{save_amount}}").split(/\{\{\s*save_amount\}\}/); if (textArray.length > 0 && textArray.length < 2) { textArray.push(''); } return textArray.map((text, index) => { if (index == 0) { return `
${text}
`; } return `
${text}
`; }).join(''); }()}
${discount_application.title}:
-
${data.invalid_msg}
Check out
Taxes and shipping calculated at checkout
${data.invalid_msg}
Total:
${function() { const textArray = ("Save {{save_amount}}").split(/\{\{\s*save_amount\}\}/); if (textArray.length > 0 && textArray.length < 2) { textArray.push(''); } return textArray.map((text, index) => { if (index == 0) { return `
${text}
`; } return `
${text}
`; }).join(''); }()}
${function() { const textArray = ("Save {{save_amount}}").split(/\{\{\s*save_amount\}\}/); if (textArray.length > 0 && textArray.length < 2) { textArray.push(''); } return textArray.map((text, index) => { if (index == 0) { return `
${text}
`; } return `
${text}
`; }).join(''); }()}
${function() { const textArray = ("Save {{save_amount}}").split(/\{\{\s*save_amount\}\}/); if (textArray.length > 0 && textArray.length < 2) { textArray.push(''); } return textArray.map((text, index) => { if (index == 0) { return `
${text}
`; } return `
${text}
`; }).join(''); }()}
${discount_application.title}:
-
Check out
${data.invalid_msg}
Check out
Taxes and shipping calculated at checkout
Subtotal:
${discount_application.title}:
-
Total:
Check out
Taxes and shipping calculated at checkout
const summaryStickyRender = document.querySelector('#cart-drawer-summary-sticky-render'); if (summaryStickyRender) { document.body.style.setProperty('--cart-drawer-summary-sticky-height', summaryStickyRender.clientHeight + 'px'); }
View Cart
${function(){ console.log('quick-shop-render',data); const productData = data.product; let product_change_event = '', mouse_over_event = ' '; mouse_out_event = ''; const product_options = productData.options.filter(Boolean) || []; const selectedVariant = productData.variants.find(v => v.available) || productData.variants[0]; const statusLan = ((selectedVariant && !selectedVariant.available) || (!selectedVariant && !productData.available)) ? "Sold out" : "Add to cart"; return `
${statusLan}
` }()}
${function(){ const currentSelectVariant = data.variant; const defaultVariant = (data.product && data.product.variants && data.product.variants[0]); const variantData = currentSelectVariant || defaultVariant || data; const retail_price = variantData.retail_price || 0; return `
Retail
` }()}
${function(){ const wholesale_enabled = false; const qty = data.quantity || 1; const currentSelectVariant = data.variant; const defaultVariant = (data.product && data.product.variants && data.product.variants[0]); const productVariant = null; const variantData = currentSelectVariant || defaultVariant || productVariant; const wholesale_price = variantData.wholesale_price || []; if(wholesale_enabled && wholesale_price.length > 0) { let wholesaleIndex = wholesale_price.findIndex(item => { return item.min_quantity > qty; }); if(wholesaleIndex < 0){ wholesaleIndex = wholesale_price.length - 1; }else if(wholesaleIndex > 0){ wholesaleIndex = wholesaleIndex - 1; } const wholesalePrice = wholesale_price[wholesaleIndex] || ''; return `
` }else { const price = variantData && variantData.price; return price != undefined ? `
` : '
'; } }()}
${function(){ const optionName = option.name || ''; const optionId = option.id || ''; let isThumbImage = !!option.showThumbImage; const thumbStyle = "image_with_text"; const variantType = "button"; const isSelected = (value) => { const selected = (data.selectedOptions || []).find(v => v.name === optionName); return selected && selected.value.length && selected.value[0] == value; }; const getThumbImage = (value) => { const options = data.product.options || []; const option = options.find(o => o.name === optionName); if (option.thumbImages) { const thumbImage = option.thumbImages.find(t => t.value === value); if (thumbImage && thumbImage.image) { return { src: thumbImage.image.src, alt: thumbImage.image.alt }; } } return {src: '', alt: ''}; }; return `
${optionName}:
${data.selectedOptions && data.selectedOptions.length && data.selectedOptions.find(v => v.name === optionName).value[0]}
${value}
${optionName}
${value}
${value}
` }()}
${data.value}