Arctic Winter Guardians Series 2 DIY Felt Sewing Kit

$29.99 $31.99 Save $2.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 = "794b44ab-39cd-415f-864f-e2a23d4d0f3c"; // 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 == '16d94119-f621-4bc0-986c-98a2b68a1d26' && 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: "16d94119-f621-4bc0-986c-98a2b68a1d26", 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 🐺
Quantity
Share the love
Free worldwide shipping
Free returns
Sustainably made
Secure payments
Description

🔥Arctic Winter Guardians Series 2 Has Arrived ❄️

❄️🧵The magical winter collection continues with 13 new guardians to make, gift, and collect.❄️🧵

Loved Series 1? Series 2 brings new Arctic animals, icy colors, and storybook details into the same relaxing DIY felt craft experience.

❄️🧵Series 2 Launch Deal❄️🧵
❄️🧵Buy 3 Get 1 Free❄️🧵

Mix your favorite guardians and build your own magical winter collection.


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


Who Is This Kit For?

This kit is perfect for anyone who loves peaceful crafts, winter animals, handmade décor, soft textures, and meaningful DIY projects.

It is especially lovely for people who enjoy slow creative time at home, collecting seasonal decorations, or making handmade gifts for loved ones.


FAQ

Is this suitable for beginners?
Yes. The kit includes prepared felt pieces and step-by-step instructions, making it friendly for beginners.

Do I receive a finished animal?
No. This is a DIY patchwork kit. You will receive the materials and instructions to make it yourself.

How many animals are included?
Each kit makes one selected animal design.

Can I collect more designs from the series?
Yes. Arctic Winter Guardians Series 2 includes multiple magical winter animal styles, so you can choose your favorite or collect more over time.

What can I do with the finished piece?
You can display it as winter décor, place it on a shelf or desk, use it as seasonal decoration, or give it as a handmade gift.

What is the finished size?
The finished size is approximately 10–13cm / 4–5 in, depending on the final handmade result.


⚡️Stock Sells Fast!⚡️

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


Why Customers Trust Us


Why Shop With Us

Quality products, fair prices, and support that actually cares.

🏭 Direct from Manufacturers

Curated suppliers + in-house QC for consistent quality.

🔥 Competitive Pricing

No middlemen. Just great value on every order.

😊 Friendly Support 24/7

Real people, real help. We reply within 2–12h (Mon–Sun).

🏆 Loved by Customers

Hundreds of 5-star reviews on quality and service.

🚚 Shipping & Tracking
  • Worldwide shipping with insured parcels.
  • Tracking number is emailed as soon as your order ships.
  • You may receive your items earlier depending on the route and carrier.

Heads-up: holidays, customs, or weather may impact delivery timelines.

🔒 100% Risk-Free Purchase

If your item arrives damaged or not as described, just contact us for a replacement or refund—simple and hassle-free.

🏢 Our Warehouse & Processing

Please allow for processing time and consider holidays or unforeseen events that may affect shipping.