Women's Autumn And Winter Sports Casual Warm Velvet Suit

$65.99
Color:  Black
Size:  S
Quantity
/** * 优惠码组件模型类 * 处理优惠码的显示和交互逻辑 */ 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"]; // 跳转决策: is_redirection + link(可选覆盖) const setting = { is_redirection: item.dataset["redirection"] === "true", link: item.dataset["link"], }; const landingUrl = `/promotions/discount-default/${discountId}`; const finalUrl = appDiscountUtils.resolveDiscountHref(setting, landingUrl); if (finalUrl && appDiscountUtils.inProductBody(this.element)) { this.win.open(finalUrl, '_blank', 'noopener'); } } }) } } /** * 使用 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);
/** * 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 = "8911c64b-3762-404b-8f77-3e4771054558"; // 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 == '0fc881ce-a971-4515-80fd-906b0a77e0bc' && 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: "0fc881ce-a971-4515-80fd-906b0a77e0bc", 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

Description

Description

Women's Autumn And Winter Sports Casual Warm Velvet Suit

Wrap yourself in comfort and confidence this season with our Warm Velvet Suit, designed for the woman who loves cozy elegance and effortless style. Whether you’re stepping out for errands, lounging at home, or enjoying a morning jog, this set brings together warmth, flexibility, and chic simplicity.

Product Highlights

  • Premium Velvet Comfort: Made from soft Silver Fox or Gold Velvet that feels luxuriously smooth and keeps you warm from autumn to spring.

  • Practical Yet Polished: The stand collar, drawstring hood, and zip-up front make it easy to layer and perfect for all-day wear.

  • Streamlined Fit: A gently contoured design that flatters your figure without compromising on comfort.

  • Versatile for Every Setting: Ideal for home lounging, school days, outdoor strolls, or travel — a true all-weather essential.

  • Easy Maintenance: Machine washable fabric ensures lasting softness and color after every wash.

💫 Style Inspiration

For a chic athleisure vibe, pair this velvet set with white sneakers and a minimalist crossbody bag. For cooler days, layer with a puffer jacket or long coat — it’s the perfect mix of casual and polished that transitions seamlessly from indoors to outdoors.


📏 Size Guide (cm / inch)

SizeBust (cm/in)Waist (cm/in)Hips (cm/in)Shoulder (cm/in)Weight (kg)
S88 / 34.668 / 26.894 / 37.038 / 15.045–50
M93 / 36.673 / 28.799 / 39.039.25 / 15.455–60
L98 / 38.678 / 30.7104 / 40.940.5 / 15.960–65
XL103 / 40.683 / 32.7109 / 42.941.75 / 16.465–70
2XL108 / 42.588 / 34.6114 / 44.943 / 16.970–75
3XL113 / 44.593 / 36.6119 / 46.944.25 / 17.475–80
4XL118 / 46.598 / 38.6124 / 48.845.5 / 17.980–85
5XL123 / 48.4103 / 40.6129 / 50.846.75 / 18.485–90

💡 Tip: This set has a fitted design. For a looser, more relaxed fit, we recommend sizing up.

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.