🧚‍♀️🌸 Premium Fairy Patchwork DIY Kit | High-Quality Layered Fabric with Floral Wings DIY Handmade Fantasy Wall Decor ✨

$29.99 $39.99 Save $10.00
/** * 优惠码组件模型类 * 处理优惠码的显示和交互逻辑 */ 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 = "0c42451f-5148-4296-8b90-62e19cd00cd0"; // 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 == '592a3226-032c-4b7e-9e83-7455485b2e63' && 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: "592a3226-032c-4b7e-9e83-7455485b2e63", 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);
Color🎁Buy 3— Save 15% Off & Free Shipping:  Flower Color
Quantity
Share the love
Free worldwide shipping
Free returns
Sustainably made
Secure payments
Description

SHIPPING WORLDWIDE. 
💯Payments Via PayPal® and CreditCard.
⭐Fast refund Guarantee>> Partial or full refund depends on the situation.

🎁Don't forget to buy some for your family or friends as it's a unique gift idea.❤️❤️❤️


preview
🧚‍♀️🌸✨ Turn beautiful fabric scraps into an enchanting fairy filled with layered wings, flowing textures, and delicate floral details. Each piece adds depth and personality, creating a relaxing DIY experience and a breathtaking handmade artwork you’ll be proud to display. Perfect for fairy lovers, creative crafters, and anyone drawn to a little everyday magic. 💜🧵🌿

Create Your Own Handmade Fabric Fairy Wall Decor

Bring a little magic, softness, and handmade beauty into your home with this Color Fairy Patchwork DIY Kit.
Layer by layer, each floral fabric piece becomes a flowing dress, delicate wings, soft hair, and a dreamy fairy full of personality.

This is not just a craft project. It is a peaceful creative moment, a beautiful handmade decoration, and a meaningful gift for anyone who loves florals, fantasy, sewing, and cozy handmade art.

preview

 🌟 Why This Fairy Patchwork DIY Kit Is Worth It

🧚‍♀️ Build A Fairy One Layer At A Time

Coordinated fabric pieces gradually form the fairy’s flowing dress, wings, hair, flowers, and decorative details.

As each layer is added, the design develops more texture, depth, and handmade personality.

preview

🌸 Real Fabric Creates Beautiful Dimension

Unlike a flat printed picture, the overlapping fabric pieces create soft folds and petal-like layers.

The finished fairy looks detailed from different angles, with a rich textile appearance that invites a closer look.

preview

🪟 Display It As A Hanging Ornament

Once completed, the fairy can be displayed as a decorative hanging piece instead of remaining flat on a table.

Hang it near a window, on a wall hook, in a bedroom, craft room, nursery, reading corner, or seasonal display.

No traditional picture frame is needed.

preview

🎨 Choose Your Favorite Color Story

Select the fairy design that best matches your home or personality:

  • Multicolor Floral
  • Yellow
  • Purple
  • Red
  • Pink
  • White
  • Green
  • Blue
  • Deep Purple

Each style uses a different combination of coordinated colors and patterned fabrics.

preview

🧘 A Relaxing Screen-Free Project

Arranging and securing each fabric piece creates a calm, satisfying crafting rhythm.

Enjoy it during a quiet evening, weekend craft session, family activity, or whenever you want a peaceful break from screens.

preview

🎁 A Meaningful Gift For Creative Souls

Give the unopened kit as a relaxing creative experience, or complete the fairy yourself as a handmade keepsake.

It is a thoughtful gift for mothers, grandmothers, daughters, friends, crafters, fairy collectors, and cottagecore décor lovers.

preview


🎁📦 Package Includes

1 × Fairy Patchwork DIY Kit

Each kit includes the coordinated materials needed to create your selected fairy design.
preview


📏 Product Details

Product Name: Fairy Patchwork DIY Kit

Theme: Fairy / Floral / Fantasy / Handmade Fabric Art

Style: DIY patchwork fabric décor kit

Color Options: Blush Pink / Lavender Purple / Blue Sky / Woodland Green / Sunflower / Christmas Fairy

Finished Look: Layered handmade-style fairy wall décor with flowing fabric texture

Use Scene: Bedroom / nursery / craft room / reading corner / seasonal display / handmade gift

Skill Level: Beginner-friendly


FAQ

Q1: Is this kit suitable for beginners?
A: Yes. The kit is designed to be relaxing and easy to enjoy, even if you are new to fabric crafts.

Q2: Can the finished fairy be displayed?
A: Yes. Once completed, it becomes a beautiful handmade-style decoration for bedrooms, craft rooms, nurseries, reading corners, or seasonal displays.

Q3: What styles can I choose from?
A: Available styles include Blush Pink, Lavender Purple, Blue Sky, Woodland Green, Sunflower, and Christmas Fairy.

Q4: Is this a good gift?
A: Absolutely. It’s a thoughtful gift for fairy lovers, craft lovers, moms, daughters, friends, and anyone who enjoys handmade décor.


💬 Customer Reviews

⭐⭐⭐⭐⭐ “The fabric layers make the wings look beautiful.”

I chose the deep purple design, and the different floral patterns gave the wings and dress much more texture than I expected.

— Lauren M., Colorado

⭐⭐⭐⭐⭐ “I love that the finished fairy can be hung up.”

After completing it, I placed it near the window in my craft room. It looks much more special than an ordinary flat decoration.

— Susan R., Pennsylvania

⭐⭐⭐⭐⭐ “A peaceful project for quiet evenings.”

I worked on it a little at a time while listening to music. Watching the dress and wings slowly take shape was very relaxing.

— Amanda K., Oregon

⭐⭐⭐⭐⭐ “A lovely gift for my mother.”

My mother enjoys fabric crafts and fantasy décor, so this felt very personal. She especially loved choosing her favorite color.

— Jessica T., Texas


🧚‍♀️ Create A Little Handmade Magic

A little flower.
A little fantasy.
A little handmade joy.

Choose your favorite fairy and create a beautiful fabric artwork filled with charm, color, and imagination. 🌸✨
preview


🎁Don't forget to buy some for your family or friends as it's a unique gift idea.❤️❤️❤️

WHY US?

  • We work directly with manufacturers all over the world to ensure the best quality of our products. We have Quality Control department which help us to keep our promise!
  • Price is always competitive.
  • Awesome Customer Service
  • Amazing products along with High Quality
  • Read reviews from our lovely customers

⚡️Stock Sells Fast!⚡️

Click On "ADD TO CART" To Get Yours Now!

Certification

WHY US?

  • We work directly with manufacturers all over the world to ensure the best quality of our products. We have Quality Control department which help us to keep our promise!
  • Price is always competitive.
  • Awesome Customer Service
  • Amazing products along with High Quality
  • Read reviews from our lovely customers

OUR GUARANTEE

📦 Insured Worldwide Shipping: Each order includes real-time tracking details and insurance coverage in the unlikely event that a package gets lost or stolen in transit.

💰 Money-Back Guarantee: If your items arrive damaged within 90 days of normal usage, we will gladly issue out a replacement or refund.

✉️ 24/7 Customer Support: We have a team of live reps ready to help and answer any questions you have within a 24-hour time frame, 7 days a week.

🔒 Safe & Secure Checkouts: We use state-of-the-art SSL Secure encryption to keep your personal and financial information 100% protected.

🔒 100% Risk-Free Purchase: If you bought it and felt that it is not for you, don't worry. Just hit the Contact us button and send us a message, and we will make it right by offering you a replacement or refund. 100% Simple & Risk-Free process.