Vintage Blue Suede Lace Trim Mini Dress

const TAG = "spz-custom-product-automatic"; class SpzCustomProductAutomatic extends SPZ.BaseElement { constructor(element) { super(element); this.variant_id = '87c4a137-93a5-4cc9-a1d8-ea5d9f699946'; this.isRTL = SPZ.win.document.dir === 'rtl'; this.isAddingToCart_ = false; // 加购中状态 } static deferredMount() { return false; } buildCallback() { this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); this.setupAction_(); this.viewport_ = this.getViewport(); } mountCallback() { this.init(); // 监听事件 this.bindEvent_(); } async init() { this.handleFitTheme(); const data = await this.getDiscountList(); this.renderApiData_(data); } async getDiscountList() { const productId = '73b67e44-21bf-46cf-b701-975447798492'; const variantId = this.variant_id; const productType = 'default'; const reqBody = { product_id: productId, variant_id: variantId, discount_method: "DM_AUTOMATIC", customer: { customer_id: window.C_SETTINGS.customer.customer_id, email: window.C_SETTINGS.customer.customer_email }, product_type: productType } const url = `/api/storefront/promotion/display_setting/text/list`; const data = await this.xhr_.fetchJson(url, { method: "post", body: reqBody }).then(res => { return res; }).catch(err => { this.setContainerDisabled(false); }) return data; } async renderDiscountList() { this.setContainerDisabled(true); const data = await this.getDiscountList(); this.setContainerDisabled(false); // 重新渲染 抖动问题处理 this.renderApiData_(data); } clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } async renderApiData_(data) { const parentDiv = document.querySelector('.automatic_discount_container'); const newTplDom = await this.getRenderTemplate(data); if (parentDiv) { parentDiv.innerHTML = ''; parentDiv.appendChild(newTplDom); } else { console.log('automatic_discount_container is null'); } } doRender_(data) { const renderData = data || {}; return this.templates_ .findAndRenderTemplate(this.element, renderData) .then((el) => { this.clearDom(); this.element.appendChild(el); }); } async getRenderTemplate(data) { const renderData = data || {}; return this.templates_ .findAndRenderTemplate(this.element, { ...renderData, isRTL: this.isRTL }) .then((el) => { this.clearDom(); return el; }); } setContainerDisabled(isDisable) { const automaticDiscountEl = document.querySelector('.automatic_discount_container_outer'); if(isDisable) { automaticDiscountEl.setAttribute('disabled', ''); } else { automaticDiscountEl.removeAttribute('disabled'); } } // 绑定事件 bindEvent_() { window.addEventListener('click', (e) => { let containerNodes = document.querySelectorAll(".automatic-container .panel"); let bool; Array.from(containerNodes).forEach((node) => { if(node.contains(e.target)){ bool = true; } }) // 是否popover面板点击范围 if (bool) { return; } if(e.target.classList.contains('drowdown-icon') || e.target.parentNode.classList.contains('drowdown-icon')){ return; } const nodes = document.querySelectorAll('.automatic-container'); Array.from(nodes).forEach((node) => { node.classList.remove('open-dropdown'); }) // 兼容主题 this.toggleProductSticky(true); }) // 监听变体变化 document.addEventListener('dj.variantChange', async(event) => { // 重新渲染 const variant = event.detail.selected; if (variant.product_id == '73b67e44-21bf-46cf-b701-975447798492' && variant.id != this.variant_id) { this.variant_id = variant.id; this.renderDiscountList(); } }); } // 兼容主题 handleFitTheme() { // top 属性影响抖动 let productInfoEl = null; if (window.SHOPLAZZA.theme.merchant_theme_name === 'Wind' || window.SHOPLAZZA.theme.merchant_theme_name === 'Flash') { productInfoEl = document.querySelector('.product-info-body .product-sticky-container'); } else if (window.SHOPLAZZA.theme.merchant_theme_name === 'Hero') { productInfoEl = document.querySelector('.product__info-wrapper .properties-content'); } if(productInfoEl){ productInfoEl.classList.add('force-top-auto'); } } // 兼容 wind/flash /hero 主题 (sticky属性影响 popover 层级展示, 会被其他元素覆盖) toggleProductSticky(isSticky) { let productInfoEl = null; if (window.SHOPLAZZA.theme.merchant_theme_name === 'Wind' || window.SHOPLAZZA.theme.merchant_theme_name === 'Flash') { productInfoEl = document.querySelector('.product-info-body .product-sticky-container'); } else if (window.SHOPLAZZA.theme.merchant_theme_name === 'Hero') { productInfoEl = document.querySelector('.product__info-wrapper .properties-content'); } if(productInfoEl){ if(isSticky) { // 还原该主题原有的sticky属性值 productInfoEl.classList.remove('force-position-static'); return; } productInfoEl.classList.toggle('force-position-static'); } } setupAction_() { this.registerAction('handleDropdown', (invocation) => { const discount_id = invocation.args.discount_id; const nodes = document.querySelectorAll('.automatic-container'); Array.from(nodes).forEach((node) => { if(node.getAttribute('id') != `automatic-${discount_id}`) { node.classList.remove('open-dropdown'); } }) const $discount_item = document.querySelector(`#automatic-${discount_id}`); $discount_item && $discount_item.classList.toggle('open-dropdown'); // 兼容主题 this.toggleProductSticky(); }); // 加购事件 this.registerAction('handleAddToCart', (invocation) => { // 阻止事件冒泡 const event = invocation.event; if (event) { event.stopPropagation(); event.preventDefault(); } // 如果正在加购中,直接返回 if (this.isAddingToCart_) { return; } const quantity = invocation.args.quantity || 1; this.addToCart(quantity); }); } // 加购方法 async addToCart(quantity) { // 设置加购中状态 this.isAddingToCart_ = true; const productId = '73b67e44-21bf-46cf-b701-975447798492'; const variantId = this.variant_id; const url = '/api/cart'; const reqBody = { product_id: productId, variant_id: variantId, quantity: quantity }; try { const data = await this.xhr_.fetchJson(url, { method: 'POST', body: reqBody }); // 触发加购成功提示 this.triggerAddToCartToast_(); return data; } catch (error) { error.then(err=>{ this.showToast_(err?.message || err?.errors?.[0] || 'Unknown error'); }) } finally { // 无论成功失败,都重置加购状态 this.isAddingToCart_ = false; } } showToast_(message) { const toastEl = document.querySelector("#apps-match-drawer-add_to_cart_toast"); if (toastEl) { SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast(message); }); } } // 触发加购成功提示 triggerAddToCartToast_() { // 如果主题有自己的加购提示,则不显示 const themeAddToCartToastEl = document.querySelector('#add-cart-event-proxy'); if (themeAddToCartToastEl) return; // 显示应用的加购成功提示 this.showToast_("Added successfully"); } triggerEvent_(name, data) { const event = SPZUtils.Event.create(this.win, `${ TAG }.${ name }`, data || {}); this.action_.trigger(this.element, name, event); } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } } SPZ.defineElement(TAG, SpzCustomProductAutomatic);
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);
Price
$63.88
color
Midnight blue
size
S
M
L
XL
2XL
3XL
Quantity
Description

Description

Description

💙 Vintage Blue Suede Lace Trim Mini Dress

Chic suede meets delicate lace for timeless style.

Step out in elegance with the Vintage Blue Suede Lace Trim Mini Dress, crafted from soft blue suede and accented with feminine lace trim. The flared sleeves and mermaid-inspired mini silhouette create graceful movement, making this piece perfect for fall and winter outings, from casual meet-ups to evening parties.

Blend comfort, warmth, and vintage charm in a dress designed to carry you effortlessly from day to night.


Product Info

Style: Vintage / Elegant / Feminine
Material: Soft suede with lace trim
Season: Fall & Winter
Occasion: Casual outings, parties, special events
Design Details: Flared sleeves, mermaid hem, lace trim, mini length


Design Highlights

💙 Blue Suede Texture — soft, cozy, and luxurious to the touch.
🌸 Lace Trim Accents — adds delicate, romantic detailing.
💃 Flared Sleeves — graceful movement for a feminine flair.
Mermaid Mini Silhouette — flattering and playful for all occasions.


Styling Tips

Pair with ankle boots and a wool coat for cozy daytime elegance,
or strappy heels and statement jewelry for an evening-ready look. 💫


💖 Why You’ll Love It

• Flared sleeves add sophistication and movement.
• Mermaid mini silhouette highlights your curves beautifully.
• Suede and lace bring together cozy texture and delicate femininity.
• Versatile for day-to-night styling in cooler months.


📏 Size Guide

SizeUKUSEUBust (cm / inch)Waist (cm / inch)Hips (cm / inch)Shoulder (cm / inch)Weight (kg)
S8/104/636/3888 / 34.6568 / 26.7794 / 37.0138 / 14.9645–50
M12/148/1040/4293 / 36.6173 / 28.7499 / 38.9839.3 / 15.4755–60
L16124498 / 38.5878 / 30.71104 / 40.9441.5 / 16.3460–65
XL181446103 / 40.5583 / 32.68109 / 42.9141.8 / 16.4665–70
2XL201648108 / 42.5288 / 34.65114 / 44.8843 / 16.9370–75
3XL221850113 / 44.4993 / 36.61119 / 46.8544.3 / 17.4475–80
4XL242052118 / 46.4698 / 38.58124 / 48.8245.5 / 17.9180–85
5XL262254123 / 48.43103 / 40.55129 / 50.7946.8 / 18.4385–90

💡 Tip: Choose your regular size for a fitted look, or size up for a softer, layered feel with tights or boots.

Shipping & Handling

Shipping & Handling

We’re so excited to get your ubuntumini order to you! Here’s everything you need to know about how we ship and handle your pieces.

Processing Time
All orders are processed within 1–5 business days (Monday to Friday, excluding public holidays). Please note that orders placed after 11 AM GMT+8 or on weekends will be processed the next business day.

Shipping Destinations
We currently ship internationally to over 30 countries, including most regions in North America, Europe, Australia, and parts of Asia.

Shipping Methods & Costs

Standard Shipping: Typically 7–15 business days | $8.99 USD

Express Shipping: Estimated 4–10 business days | $14.99 USD

Free shipping on orders over $119.99.

Please note: The above are estimated times and are for reference only. Actual delivery may vary slightly due to holidays, weather, customs clearance, carrier delays, or other unforeseen factors. We will provide a tracking number so you can check the latest progress at any time. You will receive a confirmation email once your order has been shipped.

Prices may vary slightly depending on your location. You’ll see the exact shipping cost at checkout based on your address.

Tracking Your Order
Once your order ships, you’ll receive a confirmation email with a tracking number and a link to follow your package’s journey.

Delivery Times
Please note that delivery times are estimates and may be affected by holidays, weather, or customs processing. While most orders arrive on time, occasional delays can happen that are outside of our control.

Customs & Import Taxes
International orders may be subject to customs fees, import duties, or taxes. These charges are the responsibility of the customer and are not included in the product or shipping cost. For more details, check with your local customs office.

Missing or Damaged Package?
If your order hasn’t arrived within the estimated timeframe or appears damaged, please contact us at ubuntumini01@outlook.com. We’ll do everything we can to help resolve the issue.

Thank you for choosing ubuntumini — we can’t wait for you to wear your story!

Payment Method

Secure & Convenient Payment Options
At ubuntumini, we make checkout effortless and secure. All transactions are encrypted using SSL technology, and we never store your full payment details.

Accepted Payment Methods
✅ Credit/Debit Cards:
Visa, Mastercard, American Express
✅ Digital Wallets:
PayPal, Apple Pay, Google Pay
🌐 More methods coming soon!

Your Payment Security
🔒 Bank-Level Encryption: All payments processed via PCI-DSS compliant gateways.
🔒 Fraud Protection: Advanced monitoring for suspicious activity.
🔒 Guaranteed Safety: Dispute an unauthorized charge? We’ll assist instantly.

Common Questions
🔸 Is my card data stored?
No. We only retain transaction IDs—never your full card number or CVV.
🔸 Currency options?
All prices in USD (auto-converted for international cards).
🔸 Payment declined?
Contact your bank or try another method. Still stuck? Email us: ubuntumini01@outlook.com

Order Confirmation & Tracking
Instant email receipt upon payment.

Production starts within 24 hours (M-F).

Track shipments via Order Status Portal.

Need Help?
Contact us for billing/payment support:
📧 Email: ubuntumini01@outlook.com

Refund/ Retum Policy

Return Policy:

For products purchased from ubuntumini, you are entitled to a 14-day no-reason return period, calculated from the date of receipt of the goods. If the product has quality issues, you can contact us via the following email:

ubuntumini01@outlook.com

Return Conditions:

Keep the product in its original condition, unworn, unwashed, and undamaged, and it should not affect secondary sales.

Please return the product with the complete original packaging, accessories, product labels, invoices, and other items.

If there are quality issues with the product, please provide clear photos or videos as evidence.

Custom-made items (such as embroidered, tailored, or personalized items) are final sale and cannot be returned, exchanged, or refunded.

Friendly Reminder:

Thank you for shopping with us. Due to the nature of our products, we do not accept returns or offer refunds in the following cases:

Final Sale/Discounted Items: All items purchased during promotional periods or with significant discounts are final sale and cannot be returned or refunded.

Jewelry & Accessories: For hygiene and safety reasons, all jewelry, accessories, and personalized items are non-returnable and non-refundable.

Return Shipping Costs to Be Paid by the Buyer:

If the return is due to personal reasons (such as changing your mind, incorrect size, or dislike of the color), the return shipping cost will be borne by the buyer. We recommend using a trackable shipping method to monitor the return shipment.

Return Process:

Within the specified return period, submit a return request via email or online customer service, including the order number, reason for return, and other relevant information.

After customer service approves the return, we will provide the return address and return instructions.

Follow the instructions for returning the product, and we recommend using a trackable shipping method to track the logistics.

Once we receive and verify the returned item, we will process the refund according to your original payment method. The refund processing time is typically 5-7 business days.