Arctic Winter Guardians Series 2 DIY Patchwork Kit ❄️🔥Last 4 hours 🔥Buy 2 Get 1 Free

$27.89 $35.78 Save $7.89
/** * 优惠码组件模型类 * 处理优惠码的显示和交互逻辑 */ 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 = "7701c7e0-3de5-4df8-b2d0-f3fefece6091"; // 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 == 'eba6f12c-5ed5-4af2-bd96-dc71d7ef8576' && 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: "eba6f12c-5ed5-4af2-bd96-dc71d7ef8576", 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);
Style:  Blizzard Wolf 🐺-🔥Hot
Quantity
Share the love
Free worldwide shipping
Free returns
Sustainably made
Secure payments
Description

Bring One Magical Winter Guardian to Life, One Stitch at a Time ❄️

Step into a quiet Arctic winter world filled with moonlight, snowflakes, and gentle magical creatures.

With this DIY patchwork kit, you can create your own winter guardian by hand — soft, detailed, and full of storybook charm. Each design from Arctic Winter Guardians Series 2 carries its own personality, from loyal wolves and graceful foxes to cozy polar animals and moonlit companions.

Whether you are crafting for relaxation, decorating your home, or making a heartfelt handmade gift, this kit turns simple felt and thread into a beautiful keepsake you will be proud to display.

Choose your favorite Arctic Winter Guardian and enjoy the peaceful joy of handmade crafting. 🐺🦊🐻‍❄️✨


Why You’ll Love It

A calming craft for quiet, cozy days 🧵

This is not just a craft kit. It is a peaceful winter project that lets you slow down, focus your hands, and enjoy the gentle rhythm of stitching.

Piece by piece, your guardian begins to take shape. Every stitch adds warmth. Every felt detail adds personality. By the time it is finished, it becomes more than a decoration — it becomes a handmade keepsake filled with care, patience, and quiet joy.


A Guardian with Its Own Winter Story

Each animal has a special charm ❄️

Arctic Winter Guardians Series 2 is designed around magical winter animals, each inspired by snowy forests, moonlit nights, northern lights, and peaceful Arctic landscapes.

Some guardians feel brave and protective. Some feel soft and comforting. Some are elegant, mysterious, or full of fairytale charm. No matter which one you choose, each piece brings its own little winter story into your hands.


What’s Inside the Kit

Everything you need to start creating ✂️🧵

Each DIY patchwork kit includes prepared felt pieces, embroidery threads, soft stuffing, needle, decorative details, and an easy-to-follow instruction booklet.

The materials are prepared to make the crafting process smoother, so you can spend less time cutting and guessing, and more time enjoying the relaxing process of making.


Beginner-Friendly Design

Easy to start, beautiful when finished ✨

You do not need advanced sewing experience to enjoy this kit. The felt pieces are prepared for easier crafting, and the step-by-step guide helps you follow along at a comfortable pace.

The finished piece still looks detailed and decorative, with layered felt textures, soft winter colors, snowflake accents, and charming handmade details that make it feel special.


Perfect for Winter Décor

A handmade guardian for your cozy corner ❄️

Once completed, your Arctic Winter Guardian makes a lovely decoration for shelves, desks, craft rooms, mantels, bedside tables, holiday corners, or winter displays.

Its soft blue-and-white color palette fits beautifully with winter décor, Christmas decorations, snowy themes, and cozy home styling.


A Thoughtful Handmade Gift

Give the joy of creating 🎁

This kit makes a meaningful gift for craft lovers, animal lovers, winter décor fans, mothers, daughters, grandmothers, friends, and anyone who enjoys peaceful creative time at home.

You can gift the kit as a relaxing DIY experience, or finish the guardian yourself and give it as a handmade keepsake filled with love and care.


Why Choose Arctic Winter Guardians Series 2?

A magical winter collection, one guardian at a time 🌙

Each design in Series 2 has its own look, story, and personality. You can choose the one that speaks to you most, or collect more styles over time to build your own magical winter world.

Start with one guardian, enjoy the making process, and let it become a soft little reminder of quiet winter moments, creativity, and handmade warmth.


Product Highlights

❄️ Arctic Winter Guardians Series 2 design
🧵 DIY patchwork kit with soft felt materials
✂️ Prepared felt pieces for easier crafting
📖 Step-by-step instruction booklet included
🐾 Choose from magical winter animal styles
✨ Snowflake details and icy winter colors
🎁 Great for gifting, collecting, and seasonal décor
☕ Relaxing craft project for cozy days
📏 Finished size: approx. 10–13 cm / 4–5 in