Free shipping on orders over $100
Fast shipping worldwide.
Free shipping on orders over $100
Free shipping on orders over $100
Fast shipping worldwide.
Free shipping on orders over $100
Log in
Create an account
0
Home
Hot Sale
New Arrivals
Tops
Sweater
Coats
Blouses
Beautiful Peter Pan Collar Graphic Print Linen Shirts Top Summer
$40.00
Bottoms
Pants
Skirts
Fashion Black Embroidered Pockets Elastic Waist Lace Shorts Summer
$83.00
Dresses
Shoes
Accessories
Bags
SALE
2024 New Brown Large Capacity Capacity Handbag
$55.00
$81.00
Save 32%
More links
Home
Hot Sale
New Arrivals
Tops
Tops
Sweater
Coats
Blouses
Bottoms
Bottoms
Pants
Skirts
Dresses
Shoes
Accessories
Accessories
Bags
Log in
Home
/
BAGS
Home
/
Home
/
Buckle Open Toe Flat Sandals
Price
$79.00
$44.00
Save
44%
size
5
6
7
8
9
10
11
12
Please select a size
color
-
Brown
Please select a color
Quantity
Add to cart -
$44.00
Buy it now
Share
Tweet
Pin it
${function(){ // 获取基础配置数据 const isRTL = originData.isRTL; // 是否从右到左显示 const isMobile = originData.isMobile; // 是否移动端 const inProductDetail = originData.inProductDetail; // 是否在商品详情页 const image_domain = originData.image_domain; // 图片域名 const copyBtnClass = originData.copyBtnClass; // 复制按钮类名 const copyClass = originData.copyClass; // 复制内容类名 // 优惠码列表 const list = originData.discountCodeData.list || []; if (list.length === 0) { return ``; } // 显示模式: 平铺或折叠 const isTiled = originData.discountCodeData.display_type === "DTE_TILE"; // 获取第一个配置作为默认配置 const productSetting = list[0].product_setting; const { template_type, template_config } = productSetting; const { text, tag, banner, coupon } = template_config.color; // 优惠券样式配置 const { coupon_border_color, // 边框颜色 coupon_background_color, // 背景色起始色 coupon_background_color_end, // 背景色结束色 coupon_color, // 文字颜色 coupon_button_background_color_start, // 按钮背景起始色 coupon_button_background_color_end, // 按钮背景结束色 coupon_button_color // 按钮文字颜色 } = coupon; // 颜色透明度转换函数 const colorToRGBA = (color, alpha) => { if (color.startsWith('#')) { const hex = color.slice(1); const r = parseInt(hex.slice(0, 2), 16); const g = parseInt(hex.slice(2, 4), 16); const b = parseInt(hex.slice(4, 6), 16); return `rgba(${r}, ${g}, ${b}, ${alpha})`; } else if (color.includes('rgb')) { const rgb = color.slice(color.indexOf('(') + 1, color.indexOf(')')).split(','); const r = parseInt(rgb[0]); const g = parseInt(rgb[1]); const b = parseInt(rgb[2]); return `rgba(${r}, ${g}, ${b}, ${alpha})`; } else { return color } } // 渲染平铺样式的优惠券列表 const renderTiledList = (list, isFold = false) => { const rate = isRTL ? '34%' : '66%'; // RTL布局时调整分割线位置 let curDom = ` `; // 循环渲染优惠券列表 for(const item of list) { curDom += `
${item.discount_text}
${(isFold || item.product_setting.show_effective_date) && +item.ends_at !== -1 ? `${item.starts_at} - ${item.ends_at}` : ""}
${item.code}
` } return curDom; } let Dom = ``; // 根据显示模式选择渲染方式 if (isTiled || list.length === 1) { // 根据模板类型渲染不同样式 switch(template_type) { // 文本样式 case 'text': { Dom = `
${function(){ let textDom = ''; for(const item of list) { textDom += `
${ item.discount_text }
Code:
${ item.code }
` } return textDom; }()}
`; break; } // 标签样式 case 'tag': { const { text_color, background_color } = tag; Dom = `
${function(){ let textDom = ''; for(const item of list) { textDom += `
${ item.discount_text }
Code:
${ item.code }
`; } return textDom; }()}
` break; } // 横幅样式 case 'banner': { Dom = `
${function(){ let textDom = ''; for(const item of list) { textDom += `
${ item.discount_text }
Code:
${ item.code }
`; } return textDom; }()}
`; break; } // 优惠券样式 case 'coupon': { Dom = `
${renderTiledList(list)}
` break; } } } else { // 折叠模式样式 const foldStyle = ` `; // 只显示前3个优惠券 const showList = list.slice(0, 3); let couponDom = ""; for(const item of showList) { couponDom += `
${item.discount_text}
` } // PC端弹窗 const webModal = `
${function(){ return renderTiledList(list, true); }()}
` // 移动端侧边栏 const mobileModal = `
${function(){ return renderTiledList(list, true); }()}
` couponDom += `
Click to claim
${isMobile ? mobileModal : webModal} `; Dom = ` ${foldStyle}
${couponDom}
` } return `
${Dom}
`; }()}
/** * 优惠码组件模型类 * 处理优惠码的显示和交互逻辑 */ class SpzCustomDiscountCodeModel extends SPZ.BaseElement { constructor(element) { super(element); // 复制按钮和内容的类名 this.copyBtnClass = "discount_code_btn" this.copyClass = "discount_code_value" } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } buildCallback() { // 初始化服务 this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); } /** * 渲染优惠码组件 * @param {Object} data - 渲染数据 */ doRender_(data) { return this.templates_ .findAndRenderTemplate(this.element, Object.assign(this.getDefaultData(), data) ) .then((el) => { this.clearDom(); this.element.appendChild(el); // 绑定复制代码功能 this.copyCode(el, data); }); } /** * 获取渲染模板 * @param {Object} data - 渲染数据 */ getRenderTemplate(data) { const renderData = Object.assign(this.getDefaultData(), data); return this.templates_ .findAndRenderTemplate(this.element, renderData) .then((el) => { this.clearDom(); return el; }); } /** * 清除DOM内容 */ clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } /** * 获取默认数据 * @returns {Object} 默认数据对象 */ getDefaultData() { return { isMobile: appDiscountUtils.judgeMobile(), isRTL: appDiscountUtils.judgeRTL(), image_domain: this.win.SHOPLAZZA.image_domain, copyBtnClass: this.copyBtnClass, copyClass: this.copyClass } } /** * 复制优惠码功能 * @param {Element} el - 当前元素 */ copyCode(el) { const copyBtnList = el.querySelectorAll(`.${this.copyBtnClass}`); if (copyBtnList.length > 0) { copyBtnList.forEach(item => { item.onclick = async () => { // 确保获取正确的元素和内容 const codeElement = item.querySelector(`.${this.copyClass}`); if (!codeElement) return; // 获取纯文本内容 const textToCopy = codeElement.innerText.trim(); // 尝试使用现代API,如果失败则使用备用方案 try { if (navigator.clipboard && navigator.clipboard.writeText) { await navigator.clipboard.writeText(textToCopy); } else { throw new Error('Clipboard API not available'); } // 显示复制成功提示 this.showCopySuccessToast(textToCopy, el); } catch (err) { console.error('Modern clipboard API failed, trying fallback...', err); // 使用备用复制方案 this.fallbackCopy(textToCopy, el); } const discountId = item.dataset["discountId"]; // 是否跳转落地页配置 const redirection = item.dataset["redirection"] === "true"; // 跳转到落地页 if (redirection && appDiscountUtils.inProductBody(this.element)) { this.win.open(`/promotions/discount-default/${discountId}`); } } }) } } /** * 使用 execCommand 的复制方案 * @param {string} codeText - 要复制的文本 * @param {Element} el - 当前元素 */ fallbackCopy(codeText, el) { const textarea = this.win.document.createElement('textarea'); textarea.value = codeText; // 设置样式使文本框不可见 textarea.style.position = 'fixed'; textarea.style.left = '-9999px'; textarea.style.top = '0'; // 添加 readonly 属性防止移动端虚拟键盘弹出 textarea.setAttribute('readonly', 'readonly'); this.win.document.body.appendChild(textarea); textarea.focus(); textarea.select(); try { this.win.document.execCommand('copy'); // 显示复制成功提示 this.showCopySuccessToast(codeText, el); } catch (err) { console.error('Copy failed:', err); } this.win.document.body.removeChild(textarea); } /** * 创建 Toast 元素 * @returns {Element} 创建的 Toast 元素 */ createToastEl_() { const toast = document.createElement('ljs-toast'); toast.setAttribute('layout', 'nodisplay'); toast.setAttribute('hidden', ''); toast.setAttribute('id', 'discount-code-toast'); toast.style.zIndex = '1051'; return toast; } /** * 挂载 Toast 元素到 body * @returns {Element} 挂载的 Toast 元素 */ mountToastToBody_() { const existingToast = this.win.document.getElementById('discount-code-toast'); if (existingToast) { return existingToast; } const toast = this.createToastEl_(); this.win.document.body.appendChild(toast); return toast; } /** * 复制成功的提醒 * @param {string} codeText - 要复制的文本 * @param {Element} el - 当前元素 */ showCopySuccessToast(codeText, el) { const $toast = this.mountToastToBody_(); SPZ.whenApiDefined($toast).then(toast => { toast.showToast("Discount code copied !"); this.codeCopyInSessionStorage(codeText); }); } /** * 复制优惠码成功后要存一份到本地存储中,购物车使用 * @param {string} codeText - 要复制的文本 */ codeCopyInSessionStorage(codeText) { try { sessionStorage.setItem('other-copied-coupon', codeText); } catch (error) { console.error(error) } } } // 注册自定义元素 SPZ.defineElement('spz-custom-discount-code-model', SpzCustomDiscountCodeModel);
${function(){ return `
Discount code cannot be displayed here. Please move it to the product detail area. (This prompt will not be displayed on the client-side)
`; }()}
/** * Custom discount code component that handles displaying and managing discount codes * @extends {SPZ.BaseElement} */ class SpzCustomDiscountCode extends SPZ.BaseElement { constructor(element) { super(element); // API endpoint for fetching discount codes this.getDiscountCodeApi = "\/api\/storefront\/promotion\/code\/list"; // Debounce timer for resize events this.timer = null; // Current variant ID this.variantId = "5faf81b1-789d-4e63-b562-ee25b6c30a82"; // Store discount code data this.discountCodeData = {} } /** * Check if layout is supported * @param {string} layout - Layout type * @return {boolean} */ isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } /** * Initialize component after build */ buildCallback() { this.templates_ = SPZServices.templatesForDoc(); this.viewport_ = this.getViewport(); // Bind methods to maintain context this.render = this.render.bind(this); this.resize = this.resize.bind(this); this.switchVariant = this.switchVariant.bind(this); } /** * Setup component when mounted */ mountCallback() { this.getData(); // Add event listeners this.viewport_.onResize(this.resize); this.win.document.addEventListener('dj.variantChange', this.switchVariant); } /** * Cleanup when component is unmounted */ unmountCallback() { this.viewport_.removeResize(this.resize); this.win.document.removeEventListener('dj.variantChange', this.switchVariant); // 清除定时器 if (this.timer) { clearTimeout(this.timer); this.timer = null; } } /** * Handle resize events with debouncing */ resize() { if (this.timer) { clearTimeout(this.timer) this.timer = null; } this.timer = setTimeout(() => { if (appDiscountUtils.inProductBody(this.element)) { this.render(); } else { this.renderSkeleton(); } }, 200); } /** * Handle variant changes * @param {Event} event - Variant change event */ switchVariant(event) { const variant = event.detail.selected; if (variant.product_id == '9cfa47ac-7d77-400c-bf4b-e949b0e24cf8' && variant.id != this.variantId) { this.variantId = variant.id; this.getData(); } } /** * Fetch discount code data from API */ getData() { if (appDiscountUtils.inProductBody(this.element)) { const reqBody = { product_id: "9cfa47ac-7d77-400c-bf4b-e949b0e24cf8", variant_id: this.variantId, product_type: "default", } if (!reqBody.product_id || !reqBody.variant_id) return; this.discountCodeData = {}; this.win.fetch(this.getDiscountCodeApi, { method: "POST", body: JSON.stringify(reqBody), headers: { "Content-Type": "application/json" } }).then(async (response) => { if (response.ok) { let data = await response.json(); if (data.list && data.list.length > 0) { data.list[0].product_setting.template_config = JSON.parse(data.list[0].product_setting.template_config); // Format timestamps to local timezone const zone = this.win.SHOPLAZZA.shop.time_zone; data.list = data.list.map(item => { if(+item.ends_at !== -1) { item.ends_at = appDiscountUtils.convertTimestampToFormat(+item.ends_at, zone); } item.starts_at = appDiscountUtils.convertTimestampToFormat(+item.starts_at, zone); return item; }); } this.discountCodeData = data; this.render(); } else { this.clearDom(); } }).catch(err => { console.error("discount_code", err) this.clearDom(); }); } else { this.renderSkeleton(); } } /** * Clear component DOM except template */ clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } /** * Render discount codes with formatted dates */ render() { // Render using discount code model SPZ.whenApiDefined(document.querySelector('#spz_custom_discount_code_model')).then(renderApi => { renderApi.doRender_({ discountCodeData: this.discountCodeData }) }).catch(err => { this.clearDom(); }) } renderSkeleton() { // Render template for non-product pages this.templates_ .findAndRenderTemplate(this.element, { isMobile: appDiscountUtils.judgeMobile() }) .then((el) => { this.clearDom(); this.element.appendChild(el); }) .catch(err => { this.clearDom(); }); } } // Register custom element SPZ.defineElement('spz-custom-discount-code', SpzCustomDiscountCode);
Description
New arrivels
VIEW ALL
Organic Light Camel Asymmetrical Solid Cotton Knit Sweaters Spring
$65.00
Original Design Black Button Zippered Denim Beam Pants Summer
$58.00
Green Asymmetrical Solid Knit Sweater Turtleneck Winter
$55.00
Blue Zippered Pockets High Waist Denim Wide Leg Pants Button
$58.00
Stylish Blue Slash Neck Butterfly Front Open Denim Fish Tail Dress Sleeveless
$61.00
Modern Blue Pockets High Waist Denim Flare Bottoms Fall
$82.00
Fashion dresses
VIEW ALL
Elegant Plain High Neck Sleeveless Loose Maxi Tank Dress
$75.00
French Sky Blue Asymmetrical Print Chiffon Long Dresses Summer
$50.00
Unique White Tulle Patchwork Denim Strap Dress Summer
$65.00
French Black High Waist Patchwork Tulle Maxi Dresses Sleeveless
$50.00
Elegant Plain Boat Neck Flowy Hem Maxi Dress <Ship in 24 hours>
$65.00
French Colorblock V Neck Patchwork Maxi Dresses Sleeveless
$50.00
Accessories
VIEW ALL
SALE
2024 New Brown Large Capacity Capacity Handbag
$55.00
$81.00
Save 32%
Beautiful Black Large Capacity Faux Leather Satchel Handbag
$45.00
Fine Red Versatile Durable Leather Tote Handbag
$68.00
+2
Boho Gold Copper Alloy Zircon Pearl Gratuated Bead Necklace
$25.00
Beautiful Green Sterling Silver Overgild Jade Enamel Ping Buckle Hoop Earrings
$22.00
Casual Peacock Blue Large Capacity Leather Women Tote Handbag
$64.00
Shoes
VIEW ALL
Light Blue Sheepskin Splicing Hollow Out Slide Sandals
$65.00
Classy Brown Cowhide Leather Chunky Heel Splicing Boots Pointed Toe
$119.00
Pink Cowhide Leather Splicing Slide Sandals Peep Toe
$116.00
Silver Faux Leather Lace Up Splicing Fashion Sport Shoes Pointed Toe
$105.00
White Faux Fur Slippers Shoes Fashion Splicing Nail Bead
$39.00
Fashion Caramel Faux Leather Boots Fuzzy Wool Lined Splicing Zippered
$63.00
Winter coats
VIEW ALL
Stylish White V Neck Patchwork Mink Hair Coats Winter
$115.00
+1
Women Green V Neck Button Cotton Filled Parka Long Coats Winter
$79.00
Jacquard Grey Button Tie Waist Knit Coat Winter
$86.00
Casual rose warm winter coat Loose fitting womens parka hooded Chinese Button Warm outwear
$112.00
SALE
Boutique Red Print Pockets Thick Cotton Winter Long sleeve Coat
$85.00
$119.00
Save 29%
Boutique Green Print Pockets Thick Cotton Winter Long sleeve Coat
$85.00
Sign up and save
Subscribe to get discounts and news of new products
SUBSCRIBE
Thanks for subscribing
OPTIONAL BUTTON
No Thanks