Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes
Sunflower Season – Mandala Hand-Painted Thread Boxes

Sunflower Season – Mandala Hand-Painted Thread Boxes

const TAG = "spz-custom-product-automatic"; class SpzCustomProductAutomatic extends SPZ.BaseElement { constructor(element) { super(element); this.variant_id = '2fe9fa08-8fcc-4855-9341-444bc27cd2c4'; this.isRTL = SPZ.win.document.dir === 'rtl'; } 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 = '6fc79ca5-61f2-4fa3-89d0-898b3a7818f3'; 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 == '6fc79ca5-61f2-4fa3-89d0-898b3a7818f3' && 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(); }); } 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);

Price

$0.00 $83.00
Save $-83.00

summer

Please select a summer

Quantity

Free worldwide shipping
Sustainably made
Secure payments
SKU:

Brighten your stitching corner with this hand-painted sunflower mandala thread box – a beautiful blend of artful storage and seasonal joy. Each wooden box is lovingly crafted with a mandala-style sunflower design, perfect for crafters who love to stay organised in style.

This one-of-a-kind piece is available in one standard size and can be customised with thread bobbin inserts to help you keep embroidery floss and small tools neat and ready to go.

What makes it special:

  • Mandala-style sunflower design – uplifting and detailed
  • One size available – no guesswork, just perfect
  • Hand-painted – every box is unique
  • Great for crafters, stitchers & handmade gift lovers

Why customers love it:

  • Seasonal design adds warmth to any creative space
  • Handmade and one-of-a-kind – no mass production here
  • Keeps supplies tidy while looking beautiful on display
  • Supports slow crafting & meaningful gifts