Bring the Story of Christmas to Life: DIY – Hand, Everyday Comfort, Was $45, Save 27%

$32.99  - $38.99
/** * 优惠码组件模型类 * 处理优惠码的显示和交互逻辑 */ 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 = "8bea283c-0020-4e61-95f2-278c59a973b7"; // 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 == 'e0329ff6-c566-440a-82a4-a6943293d8f6' && 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: "e0329ff6-c566-440a-82a4-a6943293d8f6", 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:  Complete Bethlehem Manger Scene
Quantity
Free worldwide shipping
Free returns
Sustainably made
Secure payments

Description

❤️TIPS: Our goods are authentic, counterfeit must be investigated! Customers, please identify our products!

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

I found strength and God’s love through prayer. It is through faith that I rediscovered my purpose. By crafting these handmade pieces every day, I aim to bring healing and hope to others. But behind every piece is my own journey of growth, perseverance, and faith. Your support means everything—it’s not just a purchase, but a blessing that allows me to continue creating, inspiring, and sharing my faith. I am deeply grateful to those who choose to buy and send their blessings, as each order enables me to keep moving forward with purpose and dedication. May God bless you for your kindness. 🙏

🌿Slow down, enjoy the peaceful rhythm of handcrafting, and create a cherished holiday tradition with your own hands.

🤲 The DIY Patchwork Nativity Scene Sewing Kit allows you to stitch together a heartwarming, faith-inspired holiday centerpiece featuring Mary, Joseph, Baby Jesus, a graceful angel, and a sweet little lamb.🪽

Why You’ll Love This Christmas Sewing Kit

 ✨6 Flexible Collection Options — Customize Your Holy Display

Build your Nativity story your way! Choose from 6 distinct curated sets:

  • ⛪The Sacred Family: Mary, Joseph, and Baby Jesus.

  • 🎁The Wise Men of the East: Three Kings bearing gifts.

  • ✨Angels of Praise & Faithful Shepherds: Heavenly guardians and humble keepers.

  • 🐑Shelter Animals: Sweet lambs and stable companions.

  • 🎉The Ultimate Panoramic Collection: Includes all characters for a breathtaking, complete holiday display!

🧵 Beautiful Layered Patchwork — Artisan Charm Without the Complexity

🪡Piece together the patterned fabrics, sew the layered details, and gradually create your own charming nativity display.

🕊️The flowing blue fabrics give Mary a soft and graceful look, while Joseph’s earthy green and brown tones add rustic warmth. Quilted angel wings, tiny fabric details, and the cozy manger scene make the finished piece feel rich in texture without looking heavy or overly complicated.

🏠 Self-Standing & Versatile — Perfect Fit for Any Space

📍 Once completed, these soft fabric figures stand firmly on their own! Standing at an ideal size, they fit seamlessly on your fireplace mantel, bookshelf, entryway table, windowsill, or under the Christmas tree without taking up too much room or scratching your wooden surfaces.

🕯️ A Heartwarming Holiday Activity for Quiet Evenings & Family Bonding

⌛Creating this Nativity set is more than just making decor—it's a meaningful holiday experience. Perfect for a cozy solo evening with a cup of hot cocoa, or as a hands-on crafting session with kids and grandkids to pass down faith, stories, and traditions.

🎁 The Ultimate Thoughtful Gift for Sewing & Faith Lovers

🎉Looking for a holiday gift that truly touches the heart? Whether gifted as an unmade DIY kit for a crafty friend, or given as a completed handmade heirloom to parents and church family, this set carries love, effort, and holiday blessings that mass-produced store decorations simply can't match.

✨ Why You’ll Love It

  • Beautiful layered patchwork and quilted fabric design
  • Includes classic nativity characters
  • Warm, peaceful, and faith-inspired Christmas theme
  • Enjoyable sewing project for quiet creative moments
  • Creates a reusable handmade holiday decoration
  • A meaningful Christmas gift for craft and sewing lovers

📦 Product Specifications

Feature Details
Product Name DIY Patchwork Nativity Scene Sewing Kit
Set Includes Pre-cut patterned fabrics, stuffing/padding, thread, & illustrated guides for Mary, Joseph, Baby Jesus in Manger, Angel, and Lamb
Style / Aesthetics Vintage-inspired, soft quilted texture, rustic earth & jewel tones
Skill Level Beginner to Intermediate friendly
Care Instructions Spot clean or gentle hand wash, store flat in a dry space

🎁Package includes

  • 1 x ✨ DIY Patchwork Nativity Scene Sewing Kit

❓ Frequently Asked Questions (F.A.Q.)

  • Q: Is sewing experience required to complete this project?

    • A: Not at all! The kit is designed to be accessible and enjoyable for both beginners and experienced crafters. The step-by-step illustrated instructions guide you smoothly through each character.

  • Q: Can this project be sewn by hand, or do I need a sewing machine?

    • A: Either works wonderfully! The pieces are small and manageable enough for relaxing hand-stitching on the couch, though you can also use a machine if you prefer a quicker finish.

  • Q: Are all the fabric pieces pre-cut and ready to assemble?

    • A: Yes! All character fabric pieces are pre-cut to shape, allowing you to jump straight into layering, stitching, and stuffing without any complicated measuring or trimming.

💬 Customer Reviews

    • ⭐️⭐️⭐️⭐️⭐️ "A truly heartwarming project"

      "I wanted a holiday craft that felt meaningful, and this exceeded my expectations. The fabrics are soft, high-quality, and the finished nativity scene sits beautifully on my mantel."

       

    • ⭐️⭐️⭐️⭐️⭐️ "Clear instructions and gorgeous result!"

      "I haven't picked up a needle in years, but the step-by-step guide made it super simple. Watching Joseph and Mary come together layer by layer was so rewarding."

 

👇 [ ORDER YOUR DIY NATIVITY KIT TODAY — CREATE A LASTING CHRISTMAS KEEPSAKE ]

🌎 Worldwide Shipping ✈  

🚚 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.

✉? 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.