Women's Solid Color Round Neck Long Sleeve Casual Loose Dress

$70.99
color:  Red
size:  XL
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 = "6fcb240e-0620-4a58-b878-4fa71e2fe47e"; // 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 == 'be3bcfe3-94b4-434d-be6f-fc9653463660' && 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: "be3bcfe3-94b4-434d-be6f-fc9653463660", 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 Solid Color Round Neck Long Sleeve Casual Loose Dress

Effortless comfort meets everyday chic.

Step into cozy style with the Women's Solid Color Round Neck Casual Loose Dress. Crafted from soft cotton knitted fabric, this dress combines comfort and timeless simplicity. Perfect for daily wear, casual outings, or cozy work-from-home days, it’s your go-to piece for relaxed elegance. 🌸


Product Info

Style: Casual / Everyday / Comfortable / Minimalist
Material: Cotton knitted fabric
Applicable Season: Autumn, Winter, Early Spring
Occasions: Daily wear, casual outings, work-from-home, relaxed gatherings
Design Details: Round neckline, long sleeves, loose fit, regular length


Design Highlights

🌿 Soft Cotton Fabric — breathable, comfortable, and ideal for layering.
💃 Loose Relaxed Fit — flattering for all body types with effortless movement.
Classic Round Neck — minimalistic yet chic for versatile styling.
🌸 Long Sleeves & Regular Length — easy to wear solo or layered with jackets.


Styling Tips

Pair with sneakers or ankle boots for casual outings,
or style with flats and a crossbody bag for a simple, polished look. 💖


💖 Why You’ll Love It

• Soft knitted fabric keeps you cozy all day.
• Relaxed silhouette ensures comfort without compromising style.
• Minimal design allows endless layering and outfit possibilities. 🌼


📏 Size Guide

SizeUKUSEULength (cm)Chest (cm)Hip (cm)
S8–104–634–36124102104
M12–148–1038–40125108110
L161242–44126114116
XL181446127120122
2XL2016–1848127130132
3XL2620–2250–52127140142

💡 Tip: Wear loose for cozy comfort or layer with a jacket for a more structured look.

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.