Thanksgiving Quilt Bow DIY Sewing Kit

$29.99  - $39.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 = "8108b591-0ab2-434f-b31a-07af0c925ebc"; // 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 == '24e7589e-bbb8-45e1-b08a-32c6ecc23fb7' && 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: "24e7589e-bbb8-45e1-b08a-32c6ecc23fb7", 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:  Turkey
Finished size:  14 IN
Quantity
The current produc does not participate any Rebate. Switch the participating product to check the design.
(This prompt will not be displayed on the client-side.)
var theme = window.C_SETTINGS && C_SETTINGS.theme && C_SETTINGS.theme.merchant_theme_name; var isFlash = /Flash/gi.test(theme); var isGeek = /Geek/gi.test(theme); var isNova23 = /Nova 2023/gi.test(theme); var isWind = /Wind/gi.test(theme); var isOnePage = /OnePage/gi.test(theme); var isHero = /Hero/gi.test(theme); var isBoost = /Boost/gi.test(theme); var isEva = /Eva/gi.test(theme); var isFarida = /Farida/gi.test(theme); var isPluto = /Pluto/gi.test(theme); var isLifeStyle = /Life Style/gi.test(theme); if(window.self === window.top) { (window.disabled_exts ||=[]).push('product_detail_rebate'); } class SpzRebateComponent extends SPZ.BaseElement { constructor(element) { super(element); } xhr_ = SPZServices.xhrFor(this.win); viewport_ = this.getViewport(); action_ = null; lang = document.documentElement.lang || 'en-US'; landPage = "\/promotions\/rebate\/"; pageType = 1; cart = []; initData = null; rebateInfo = null; renderData = null; footerImage = `${this.win.SHOPLAZZA["image_domain"]}oss/operation/e8ebb03dbb710457ca3b4b6a70898ab2.svg`; isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } buildCallback() { this.initData = this.getProduct(); this.action_ = SPZServices.actionServiceForDoc(this.element); this.registerAction("triggerGetRenderData", () => { const event = SPZUtils.Event.create(this.win, "triggerGetRenderData", this.renderData); this.action_.trigger(this.element, "getRenderData", event); }); this.registerAction("bindPropagation", () => { document.querySelector(".product_detail_rebate_list").addEventListener("click", e => { e.stopPropagation(); this.win.sa && this.win.sa.track("plugin_rebate_promotion_click", { plugin_timestamp: Date.now(), plugin_location: "info", product_id: this.initData.product.id, discount_id: this.rebateInfo.discount_list.map((item) => item.discount_id)[0], }); }); }); } async mountCallback() { document.addEventListener("dj.variantChange", e => { const data = e.detail; if (document.querySelector("#product-select-modal.show")) return; this.initData = this.getProductJson(data); if (this.initData && this.initData.product && data.product && this.initData.product.id === data.product.id) { this.initRebate(this.initData, true); } else { this.getRebateInfo(); } }); document.addEventListener("dj.addToCart", e => { const v = e.detail; this.rebateInfo && this.win.sa && this.win.sa.track("plugin_rebate_atc", { variant_discount_id: this.getVariantDiscountId(v.variant_id).map(item => item.discount_id), discount_ids: this.rebateInfo.discount_list.map(item => item.discount_id), variant_id: v.variant_id, product_id: v.product_id, price: v.item_price, number: v.number, }); }); await this.getRebateInfo(); setTimeout(()=>{ if (document.querySelector(".plugin-container__bottom-fixed")) { this.showDiscountPopupsInfoBar(); } else { this.win.addEventListener("extloaded", () => { this.showDiscountPopupsInfoBar(); }); } },1000) } getProductJson = (mergeData = {}) => { const productJson = document.querySelector("#product-json"); let productJsonData = {}; if (productJson && productJson.textContent) { try { productJsonData = JSON.parse(productJson.textContent); } catch (e) {} } // 深度合并函数 const deepMerge = (target, source) => { if (source === null || source === undefined) { return target; } if (typeof source !== 'object' || Array.isArray(source)) { return source; } const result = { ...target }; for (const key in source) { if (source.hasOwnProperty(key)) { if ( typeof source[key] === 'object' && source[key] !== null && !Array.isArray(source[key]) && typeof target[key] === 'object' && target[key] !== null && !Array.isArray(target[key]) ) { result[key] = deepMerge(target[key], source[key]); } else { result[key] = source[key]; } } } return result; }; return deepMerge(productJsonData, mergeData); } getProduct = (() => { document.addEventListener("dj.variantChange", e => { if (!e.detail || !e.detail.product) return; let productJsonData = getProductJson(e.detail); if (this.win.jQuery && this.win.jQuery.fn && this.win.jQuery(document).data("djproduct") && productJsonData) { this.win.jQuery(document).data("djproduct", productJsonData); } }); return () => { let productData = null; if (this.win.jQuery && this.win.jQuery.fn) { try { let product = this.win.jQuery(document).data("djproduct"); if (product) { productData = JSON.parse(JSON.stringify(product)); } else { productData = null; } } catch (error) { productData = null; } } if (!productData) { const productJson = document.querySelector("#product-json"); productData = (productJson && productJson.textContent && JSON.parse(productJson.textContent)) || null; } return productData; }; })(); clearRebateInfoDom = () => { // 1. 清除 apis.render 渲染的 DOM (app_rebate_section) const rebateSection = document.getElementById('app_rebate_section'); if (rebateSection) { const rebateRuleSection = rebateSection.querySelector('.rebate_rule_section'); if (rebateRuleSection) { rebateRuleSection.remove(); } } // 2. 清除 templates_.renderTemplate 渲染的 DOM (app_rebate_block) const rebateBlock = document.getElementById('app_rebate_block'); if (rebateBlock) { const appRebateList = rebateBlock.querySelector('.app_rebate_list'); if (appRebateList) { appRebateList.remove(); } } // 3. 清除 insertProductDetailRebateTag 插入的 DOM // 清除所有 rebate-tag 元素 document.querySelectorAll('.slider-discount-tag.dj_skin_product_title.rebate-tag').forEach(tag => { tag.remove(); }); // 移除 data-rebate-tag 属性 const productContainer = document.querySelector('.product-details, .product-details, .page_container, .product-images, [data-section-type="product"]'); if (productContainer && productContainer.hasAttribute('data-rebate-tag')) { productContainer.removeAttribute('data-rebate-tag'); } }; initRebate = this.win.SPZCore.Types.debounce( this.win, (async (data) => { let discount_list = Object.assign([], this.rebateInfo?.discount_list); /* 按子商品的多少对优惠信息进行排序 */ discount_list && discount_list.sort((a, b) => { return b.variant_ids.length - a.variant_ids.length; }); /* 选中子商品时 筛选子商品的优惠信息 */ if (data.selected && data.selected.id) { discount_list = this.getVariantDiscountId(data.selected.id); } /* 无满减信息 */ if (!(discount_list && discount_list.length)) { this.clearRebateInfoDom(); return; } const isSection = !!document.querySelector( `div[data-section-type^="shoplazza://apps/publicapp/blocks/rebate"] #rebate_custom_component` ); if ( (this.rebateInfo.rebate_type == "sku" && data && data.selected && data.selected.id) || this.rebateInfo.rebate_type == "spu" ) { let nowLandpage = this.landPage; if (discount_list[0]) { nowLandpage = this.landPage + discount_list[0].discount_id || ""; } const info = { rebate: discount_list[0], maxShowCount: this.win.innerWidth > 768 ? 3 : 1, landPage: nowLandpage, modalFooterImg: `url(${`${this.win.SHOPLAZZA["image_domain"]}oss/operation/e8ebb03dbb710457ca3b4b6a70898ab2.svg`})`, }; this.renderData = info; if(isSection) { SPZ.whenApiDefined( document.getElementById("app_rebate_section") ).then(apis => { apis.render(info, true); }); } else { // 重新渲染 抖动问题处理 this.templates_ = SPZServices.templatesForDoc(); const newTplDom = await this.templates_.renderTemplate(document.querySelector('#appRebateBlockTpl'), info) const parentDiv = document.querySelector('#app_rebate_block'); const oldDom = parentDiv.querySelector('.app_rebate_list'); if(oldDom){ parentDiv.replaceChild(newTplDom, oldDom); } else { parentDiv.appendChild(newTplDom); } } } this.insertProductDetailRebateTag(this.rebateInfo.tag); var pluginCurrencyEvent = new CustomEvent("plugin_currency_update"); document.dispatchEvent(pluginCurrencyEvent); }).bind(this), 10 ); getRebateInfo = async () => { if (this.initData && this.initData.product && this.initData.product.id) { var variant_ids = this.initData.product.variants.map(variant => variant.id); const res = await this.xhr_.fetchJson( "\/api\/discount-rebate\/product-discount", { method: "POST", body: { product_id: this.initData.product.id, product_type: this.initData.product.product_type, variant_ids: variant_ids, }, } ); if (!SPZCore.Types.isEmptyObject(res.rebate_info)) { res.rebate_info.tag = res.tag; res.rebate_info.rebate_type = res.rebate_type; this.rebateInfo = res.rebate_info; this.initRebate(this.initData); } else { if (this.win.top !== this.win.self) { const noActivity = document.getElementById("no-rebate-activity"); noActivity && (noActivity["style"].display = "block"); } } } }; getVariantDiscountId = (variant_id) => { if (!variant_id || !this.rebateInfo) return []; var rebateId = this.rebateInfo.variant_discount_map[variant_id]; return this.rebateInfo.discount_list.filter(item => item.discount_id == rebateId) || []; }; insertProductDetailRebateTag = (tag) => { if (!tag) return // 旧判断逻辑 const productSelectModal = document.querySelector('#product-select-modal'); if (productSelectModal && productSelectModal.classList.contains('show')) { return; } setTimeout(() => { var $tag_container = []; if (isNova23) { $tag_container = document.querySelectorAll('.product-details .product-images-container'); } else if (isFlash) { $tag_container = document.querySelectorAll('.product-detail .product-images .product-main-images-container'); } else if (isGeek) { $tag_container = document.querySelectorAll('.product-images #product-images-inner-container spz-carousel .i-spzhtml-slide-item'); } else if (isWind) { $tag_container = document.querySelectorAll('.product-detail .product-images-container .i-spzhtml-slides-container'); } else if (isOnePage) { $tag_container = document.querySelectorAll('.product-details .product-main-images'); } else if (isHero) { $tag_container = document.querySelectorAll('.product-detail #product-images-container #product-images-carousel .spz-carousel-slide'); } else if (isBoost) { $tag_container = document.querySelectorAll('.boost-product-detail .product-image__layout-list .slides .slides-item .product-info__slide .slider-zoom'); } else if (isEva) { $tag_container = document.querySelectorAll('.page_container [data-section-type="product"] .support-slick'); } else if (isFarida) { $tag_container = document.querySelectorAll('.product-details .product-images-container'); } else if (isLifeStyle) { $tag_container = document.querySelectorAll('.page_container [data-section-type="product_detail"] .sep-slider,.support-slick'); } else if (isPluto) { $tag_container = document.querySelectorAll('.page_container [data-section-type="product_detail"] .sep-slider,.support-slick'); } if($tag_container.length === 0) return; // 给商祥页添加满送插件的标识属性 const $product_container = document.querySelector('.product-details, .product-details, .page_container, .product-images, [data-section-type="product"]') if($product_container) { $product_container.setAttribute('data-rebate-tag', 'true'); } // 部分主题需要调整样式 if (isWind) { Array.from($tag_container).forEach(container => { container.style.position = 'relative'; }); } document.querySelectorAll('.slider-discount-tag.dj_skin_product_title.rebate-tag').forEach(tag => tag.remove()); // 遍历所有容器并插入标签 Array.from($tag_container).forEach(container => { container.insertAdjacentHTML('beforeend', `<div class="slider-discount-tag dj_skin_product_title rebate-tag">${tag}</div>`); }); }, 1000) }; fetchInfoBar = async () => { let discount_ids = []; if (this.pageType === 1) { discount_ids = this.rebateInfo && this.rebateInfo.discount_list.map(item => item.discount_id); } else if (this.pageType === 38) { discount_ids = [this.win.rebateObj.rebateCollection_id] || []; } const productObj = this.getProduct(); const { cart } = await this.xhr_.fetchJson('/api/cart') return this.xhr_.fetchJson("\/api\/discount-rebate\/global-text", { method: "POST", body: { product_type: productObj && productObj.product && productObj.product.product_type, line_items: (cart?.line_items || []).map(item => ({ variant_id: item.variant_id, product_id: item.product_id, quantity: item.quantity, price: item.price, selected: !item.unchecked, })), discount_ids: discount_ids, }, }); }; renderBottomBanner = res => { if (!res.tips) return; document.querySelector(".discount__info-bar")?.remove(); var bar_style = `background:linear-gradient(90deg,${res.config.background_color_start},${res.config.background_color_end}); color:${res.config.color};`; let data = { tips: res.tips, landPage: this.landPage + res.id, bar_style }; const html = SPZCore.Dom.htmlFor(this.element); const banner = html([ `<a impr="1" imprevt="1" id="rebate_bottom_bar" href=${data.landPage} class="discount__info-bar text-truncate" data-activity-type="rebate" style="${data.bar_style}">${data.tips}</a>`, ]); document.querySelector(".plugin-container__bottom-fixed").appendChild(banner); const pluginCurrencyEvent = new CustomEvent("plugin_currency_update"); document.dispatchEvent(pluginCurrencyEvent); if (res.id) { var trackParams = { page: this.pageType, discount_id: res.id, product_id: this.getProduct()?.product.id, }; banner.addEventListener("click", () => { this.win.sa && this.win.sa.track("plugin_rebate_promotion_click", { plugin_timestamp: Date.now(), plugin_location: "bottom_bar", product_id: trackParams.product_id, discount_id: trackParams.discount_id, }); }); this.win.sa && this.win.sa.track("plugin_rebate_banner_pv", trackParams); } }; showDiscountPopupsInfoBar = () => { if ([13, 14, 19, 30, 31].includes(this.pageType)) return; if (document.querySelector(".plugin-container__bottom-fixed .discount__info-bar")) return; this.fetchInfoBar().then(this.renderBottomBanner); document.addEventListener("dj.cartChange", () => { this.fetchInfoBar().then(this.renderBottomBanner); }); }; } SPZ.defineElement("spz-custom-rebate", SpzRebateComponent);
const TAG = "spz-custom-product-automatic"; class SpzCustomProductAutomatic extends SPZ.BaseElement { constructor(element) { super(element); this.variant_id = '8108b591-0ab2-434f-b31a-07af0c925ebc'; this.isRTL = SPZ.win.document.dir === 'rtl'; this.isAddingToCart_ = false; // 加购中状态 } 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 = '24e7589e-bbb8-45e1-b08a-32c6ecc23fb7'; 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 == '24e7589e-bbb8-45e1-b08a-32c6ecc23fb7' && 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(); }); // 加购事件 this.registerAction('handleAddToCart', (invocation) => { // 阻止事件冒泡 const event = invocation.event; if (event) { event.stopPropagation(); event.preventDefault(); } // 如果正在加购中,直接返回 if (this.isAddingToCart_) { return; } const quantity = invocation.args.quantity || 1; this.addToCart(quantity); }); } // 加购方法 async addToCart(quantity) { // 设置加购中状态 this.isAddingToCart_ = true; const productId = '24e7589e-bbb8-45e1-b08a-32c6ecc23fb7'; const variantId = this.variant_id; const url = '/api/cart'; const reqBody = { product_id: productId, variant_id: variantId, quantity: quantity }; try { const data = await this.xhr_.fetchJson(url, { method: 'POST', body: reqBody }); // 触发加购成功提示 this.triggerAddToCartToast_(); return data; } catch (error) { error.then(err=>{ this.showToast_(err?.message || err?.errors?.[0] || 'Unknown error'); }) } finally { // 无论成功失败,都重置加购状态 this.isAddingToCart_ = false; } } showToast_(message) { const toastEl = document.querySelector("#apps-match-drawer-add_to_cart_toast"); if (toastEl) { SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast(message); }); } } // 触发加购成功提示 triggerAddToCartToast_() { // 如果主题有自己的加购提示,则不显示 const themeAddToCartToastEl = document.querySelector('#add-cart-event-proxy'); if (themeAddToCartToastEl) return; // 显示应用的加购成功提示 this.showToast_("Added successfully"); } 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);
class SpzCustomDiscountBundle extends SPZ.BaseElement { constructor(element) { super(element); } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } mountCallback() { // 同一页可能有多个 block 各自渲染本 snippet,导致逻辑元素 spz-custom-discount-toast(#appsAddCartToastFunc) 重复。 // 仅保留 DOM 中第一个实例,其余重复实例移除自身,保证逻辑元素及其 action 引用(appsAddCartToastFunc)唯一。 const funcs = document.querySelectorAll('#appsAddCartToastFunc'); if (funcs.length > 1 && this.element !== funcs[0]) { this.element.remove(); return; } // 全局折扣 toast 的弹出点分散在多个模板/组件里(含声明式 @atcError),无法逐一在弹出前前置, // 故挂载时幂等地去重并挂到 body;加购 toast 改为弹出前按需去重(见 showAddToCartToast) this.ensureSingleToastInBody_('cart_match_discount_toast_wrap'); } unmountCallback() {} // 同一页面可能有多个 block 各自渲染本 toast snippet(如商详的 discount_automatic + 购物车抽屉里的折扣横幅), // 导致 toast 外层出现重复 id。重复 id 下 getElementById/querySelector 及 SPZ 动作引用都只命中第一个, // 且被关进抽屉的那份会被抽屉的 transform/overflow 裁剪/错位。这里在挂载时幂等去重: // 只保留一份、移除多余的,并把保留的挂到 body(body 是 position:fixed 最安全的落点,避免被任何祖先裁剪)。可反复调用。 ensureSingleToastInBody_(id) { const els = Array.from(document.querySelectorAll('#' + id)); if (!els.length) return; els.slice(1).forEach((el) => el.remove()); const keep = els[0]; if (keep.parentNode !== document.body) { document.body.appendChild(keep); } } // 主题购物车抽屉是否打开 isInCartDrawer_() { return !!document.querySelector('[data-section-type="cart_drawer"] spz-sidebar[open]'); } setupAction_() { this.registerAction('showAddToCartToast', () => { // 抽屉内加购:主题本就不会有加购效果,统一弹插件自己的 toast // 非抽屉:主题有加购代理则沿用主题加购效果,否则插件兜底 const proxyEl = document.getElementById('add-cart-event-proxy'); const inDrawer = this.isInCartDrawer_(); if (!inDrawer && proxyEl) { return; } // 弹出前按需去重并挂到 body(幂等),避免重复 id 命中错对象或被抽屉裁剪/错位 this.ensureSingleToastInBody_('apps_add_cart_toast_wrap'); const toastEl = document.querySelector('#apps-match-drawer-add_to_cart_toast') SPZ.whenApiDefined(toastEl).then((apis) => { apis.showToast("Added successfully"); }); }); } buildCallback() { this.setupAction_(); }; } SPZ.defineElement('spz-custom-discount-toast', SpzCustomDiscountBundle);
Shipping Policy

Processing Time:

Once your order has been confirmed, our team will begin processing it. The processing time typically includes order verification, quality checks, and packaging. Please allow 2 business days for us to prepare your items for shipment. Customized or special-order items may require additional processing time.

Shipping Time:

After your order leaves our facility, the shipping time depends on the delivery method you have chosen and your location. Below are the estimated delivery times for each shipping option:

Standard Shipping: 14 to 21 business days

Express Shipping: 10 to 15 business days

International Shipping: 14 to 21 business days (Please note that international orders may be subject to customs clearance, which can delay delivery.)

Currently unavailable for delivery to the following countries/regions:

India, Egypt, Ethiopia, Saudi Arabia, Bangladesh, Singapore, Philippines, Iraq, Pakistan, Albania, Ecuador, Guatemala, Algeria, Myanmar, Thailand, Tunisia, Morocco, Kenya, Palestine, Iran, Uganda

Special Circumstances:

1. During peak seasons or holidays, processing and shipping times may be extended. We recommend placing your order well in advance to avoid delays. If there are any unexpected delays due to supplier issues or other unforeseen circumstances, we will notify you via email with an updated timeline.

2. Custom-Made Apparel: Extended Processing Time Notice

We are committed to offering high-quality, personalized clothing that fits your unique style. As many of our garments are custom-made to order—including adjustments for size, color, or design—each piece requires additional time for careful production and quality checks.

Please note that custom apparel typically takes 5-10 business days for processing before it is shipped. This is longer than standard ready-to-wear items due to the handmade nature of our products. Once your order is dispatched, you will receive a shipping confirmation email with tracking information.

We appreciate your patience and understanding. Creating something special takes time, and we're dedicated to delivering a product that's worth the wait.

For any questions about your order timeline, feel free to contact our customer service team— we're here to help!

For the most accurate information regarding your specific order, please contact our customer service team.

1. Global express partners: At Tucsonakka, we know that global customers have high standards for fast, safe, and transparent transportation services. Therefore, we have carefully selected several well-known international logistics companies as our partners, including but not limited to DHL, FedEx, UPS, and Postal Express, to ensure that your order can reach your destination most efficiently. No matter where you are, we promise to provide you with a high-quality service experience.

2. Global delivery range: Our delivery service covers many countries and regions worldwide. Whether it is a bustling city or a remote village, we are committed to delivering your favorite products. Please visit our official website to view the specific list of supported countries/regions and confirm whether your delivery address is included. We will regularly update the delivery area and strive to expand the service scope so that more international friends can enjoy the exquisite works of Tucsonakka.

3. Shipping cost calculation: We provide a real-time shipping cost estimation function on the website's checkout page. The cost is accurately calculated based on your delivery location, package weight, and size. This way, you can know the postage you must pay in advance to avoid any unexpected expenses.

4. Tracking and tracking: Once your order is shipped, we will email you a shipping notification with a tracking number. You can check the status of your package at any time through the link provided to stay up to date. Our customer service team will also be on call to answer any questions you encounter during the shipping process to ensure that you have a worry-free shopping experience.

5. Customs duties and import taxes: Please note that your package may be subject to certain import taxes or tariffs depending on the laws and regulations of the destination country. These fees are usually not borne by the seller and must be paid by the recipient to the local customs upon receipt. To avoid unnecessary trouble, please understand the relevant regulations of your country in advance and be prepared.

6. Returns and exchanges: If the goods you received have quality problems or do not match the description, we promise to provide return and exchange services. Please get in touch with us within seven days of receiving the goods with detailed reasons and photo evidence. We will process your request and arrange the return process as soon as possible. However, the buyer will bear additional costs incurred due to international transportation if product quality issues are not addressed.

Return Policy

Introduction

At Tucsonakka, we want every customer to feel confident and happy with their purchase. We take great pride in the quality and craftsmanship of our clothing and accessories. However, we understand that sometimes an item may not be exactly what you expected — and that's okay.

Our Return Policy is designed to make the process simple, fair, and transparent. Please take a few minutes to review the following details before initiating a return.

1. Eligibility for Returns

We accept returns or exchanges under the following conditions:

  • The item must be unused, unworn, and unwashed.
  • The original packaging, including tags, labels, and protective wrapping, must be intact and undamaged.
  • The request for return or exchange must be made within 30 days of the purchase date.
  • A valid proof of purchase (such as an order confirmation or receipt) is required.

For hygiene and safety reasons, certain items — such as underwear, socks, or accessories that come into direct contact with the skin — may not be eligible for return unless defective.

If an item does not meet the above conditions, Tucsonakka reserves the right to decline the return or issue only a partial refund.

If the return is caused by the consumer, the consumer should be responsible for the shipping fee. The specific fee should be based on the express company you choose.

If, due to our reasons, the goods received are damaged or incorrect, the consumer is not required to bear the shipping fee for this reason.

Points to note:

  • The period within which orders may be canceled is 7 working days of receiving the goods.
  • Following a successful purchase, our order processing timeframe is 5-7 days.
  • Orders may be canceled provided the cancellation request is submitted prior to dispatch and within the timeframe stipulated by the website for initiating order cancellations.

2. Return Period

All return or exchange requests must be made within 30 calendar days of receiving your order.

After this period, we regret that we cannot accept any returns or exchanges.

We recommend inspecting your items immediately upon delivery to ensure everything meets your expectations.

3. How to Initiate a Return or Exchange

We've made the process easy and customer-friendly. If you wish to return or exchange a product, follow these steps:

  • Contact Our Customer Service Team
  • Reach out to us within 30 days of receiving your order using one of the following methods:
    • Phone: +86 13955692055
    • Email:tucsonakka@hotmail.com
  • Please include your order number, product details, and a brief explanation of your reason for return.
  • Follow the Provided Instructions
  • Our team will review your request and provide you with detailed return instructions, including the return address and any necessary documentation.
  • Please do not send any items back before receiving confirmation from our customer service team, as unauthorized returns may not be accepted.
  • Pack and Ship the Item
  • Securely pack the unused product in its original packaging, including all tags and accessories, and send it back to us using a reliable courier.
  • We recommend using a trackable shipping service to ensure safe and verifiable delivery.

4. Return Shipping Costs

  • Customers are responsible for the return shipping costs, except in cases where the product is defective, damaged upon arrival, or shipped incorrectly.
  • If the return is due to a Tucsonakka error (wrong item, defective product, etc.), we will cover the shipping costs or provide a prepaid return label.

Shipping fees paid initially at checkout are non-refundable, unless the return is due to an error on our part.

5. Inspection and Refund Process

Once your returned item is received, our quality inspection team will carefully review it to ensure it meets our return conditions.

  • If approved, your refund will be processed within 7–10 business days and automatically applied to your original payment method.
  • If you have requested an exchange, we will ship the replacement product as soon as possible, subject to availability.

Please note:

  • Refund times may vary depending on your bank or payment provider's processing times.
  • Items that do not meet our return requirements may be refused or returned to the customer at their expense.

6. Damaged or Defective Items

We take quality control seriously; however, if you receive a defective or damaged product, please get in touch with us immediately.

Provide the following details via Email:

  • Your order number
  • Clear photos of the damaged or defective area
  • A brief description of the issue

We will promptly arrange for a replacement, exchange, or full refund, depending on your preference and product availability.

7. Non-Returnable Items

For health and safety reasons, certain products cannot be returned or exchanged unless they are defective or incorrect. These include:

  • Intimate apparel (such as underwear or socks)
  • Gift cards
  • Personalized or customized items
  • Clearance or final-sale items

8. Exchanges

If you would like to exchange an item for a different size, color, or product, please get in touch with our customer service team. We will guide you through the exchange process.

Please note that exchanges are subject to product availability. If the requested replacement is unavailable, a refund will be issued in its place.

9. Cancellations

If you wish to cancel your order before it ships, please get in touch with us as soon as possible.

Once the order has been processed and dispatched, it cannot be canceled. You may still proceed with a return after receiving your package by following the steps outlined above.

10. Contact Us

Our customer service team is here to help make your shopping experience worry-free.

If you have any questions or need assistance with a return, please reach out to us at:

📞 Phone: +86 13955692055

📧 Email:tucsonakka@hotmail.com

We aim to respond to all return or exchange requests within 24–48 business hours.

Return address :

Yunting Ceng

Room 201, NO.179, Xinhe Road, Buyong Community, Shajing Street, Bao'an District

City: Shenzhen

Province: Guangdong

Country: China

518125

Phone: 18676363540

11. Final Notes

At Tucsonakka, customer satisfaction is at the heart of everything we do. We want every parent to feel confident when choosing our products, and we stand behind the quality of everything we make.

Thank you for your trust and understanding. We appreciate your continued support and look forward to bringing more comfort, care, and joy to your family.

Description

Every Option Includes A Complete Patchwork Ornament DIY Kit (Includes Ornament Form, Fabric Pieces, Decorative Materials & Instructions)

Create A Cozy Thanksgiving Quilt Bow At Home

Bring handmade harvest charm into your home with the Thanksgiving Quilt Bow DIY Sewing Kit.

Each kit includes coordinated fall fabrics, templates, step-by-step instructions, and essential materials to help you sew and assemble a dimensional quilted bow decor piece for your door, wall, fireplace, entryway, dining room, craft room, or seasonal display.

Choose from heartwarming fall designs including Harvest Scarecrow, Thankful Maple Leaf, Pumpkin Harvest, and Thankful Turkey.

  • Complete DIY Sewing Kit: includes coordinated fall fabrics, templates, instructions, needles, thread, and decorative materials.
  • Beginner Friendly: step-by-step guidance makes the project easy to follow and enjoyable to complete.
  • Cozy Thanksgiving Designs: choose from Scarecrow, Maple Leaf, Pumpkin Harvest, or Turkey styles.
  • Handmade Fall Home Decor: create a quilted bow for your front door, wall, fireplace, entryway, dining room, or harvest display.
  • Relaxing Creative Project: enjoy a cozy, screen-free sewing activity during the fall season.
  • Thoughtful Gift For Crafters: perfect for quilters, sewing lovers, moms, grandmas, DIY makers, and Thanksgiving decor collectors.

Everything You Need In One Box

No more searching for matching fabrics, templates, or small finishing pieces.

Each kit is thoughtfully prepared with coordinated fall materials so you can focus on the joy of sewing. From warm autumn fabrics to printed templates and step-by-step instructions, the essentials are included to help you move from fabric pieces to finished Thanksgiving decor with confidence.

Inside The Kit

  • Coordinated fall fabric pieces
  • Printed bow and petal templates
  • Step-by-step instruction guide
  • Sewing needles
  • Matching thread
  • Decorative finishing materials
  • Bow components
  • Tassel / hanging accent details
  • Gift-ready packaging box

Please note: basic sewing tools such as scissors, measuring tape, pins, clips, iron, or a sewing machine may be helpful depending on your preferred sewing method.

Beginner-Friendly & Easy To Follow

You do not need to be an expert quilter to enjoy this project.

The included templates and step-by-step instructions guide you through the process of tracing, cutting, sewing, quilting, layering, and assembling your Thanksgiving bow. It is simple enough for beginners and still satisfying for experienced makers who love detailed seasonal projects.

Perfect for:

  • Sewing beginners
  • Quilting hobbyists
  • DIY craft lovers
  • Fabric art enthusiasts
  • Handmade fall decor makers
  • Thanksgiving crafters
  • Anyone looking for a relaxing autumn project

A Handmade Decoration For A Warm Fall Home

This is more than a box of craft supplies.

Once completed, your Thanksgiving quilt bow becomes a beautiful dimensional decor piece with layered quilted petals, warm harvest colors, detailed autumn patterns, and a charming seasonal centerpiece. It adds texture, warmth, and handmade personality to your fall home.

Display it on:

  • Front door
  • Interior door
  • Living room wall
  • Fireplace mantel area
  • Entryway
  • Dining room
  • Kitchen wall
  • Sewing room
  • Craft room
  • Covered porch
  • Thanksgiving dinner backdrop
  • Seasonal harvest display

Choose Your Favorite Thanksgiving Design

Harvest Scarecrow Quilt Bow

A warm and charming fall design featuring a cheerful scarecrow, sunflowers, pumpkins, autumn leaves, rustic harvest colors, and layered quilted petals.

Best for: farmhouse fall decor, harvest displays, front door decorating, rustic Thanksgiving homes, scarecrow collectors.

Thankful Maple Leaf Quilt Bow

A classic Thanksgiving design featuring a large maple leaf centerpiece with Give Thanks lettering, rich autumn leaves, warm cream tones, orange accents, and layered fall colors.

Best for: Thanksgiving wall decor, dining room displays, elegant fall homes, Give Thanks decorations, family gathering decor.

Pumpkin Harvest Quilt Bow

A cozy harvest design featuring a dimensional pumpkin centerpiece, fall leaves, sunflowers, warm orange tones, cream fabrics, and rustic green accents.

Best for: pumpkin lovers, fall porch decor, harvest home styling, September-to-November seasonal decorating.

Thankful Turkey Quilt Bow

A festive Thanksgiving design featuring a cute turkey centerpiece, harvest leaves, pumpkins, warm brown-orange fabrics, and traditional Thanksgiving charm.

Best for: Thanksgiving dinner decor, family homes, kitchen displays, kids-friendly Thanksgiving decorations, turkey collectors.

Made For People Who Love Handmade Fall Decor

This kit is a wonderful choice for anyone who enjoys slowing down, sewing with beautiful fabrics, and creating something meaningful for the fall and Thanksgiving season.

Great for:

  • Quilters
  • Sewing lovers
  • Crafters
  • DIY hobbyists
  • Moms
  • Grandmas
  • Retirees
  • Handmade decor lovers
  • Fall decor collectors
  • Thanksgiving hosting enthusiasts
  • Craft club members
  • Anyone who loves cozy autumn projects

A Thoughtful Gift For Crafters & Thanksgiving Lovers

Looking for a gift that feels personal, creative, and seasonal?

The Thanksgiving Quilt Bow DIY Sewing Kit makes a thoughtful gift for birthdays, Thanksgiving, fall craft exchanges, quilting groups, sewing friends, hostess gifts, or anyone who loves handmade seasonal decor.

Unlike ordinary gifts, this kit gives the recipient:

  • A relaxing creative experience
  • Beautiful coordinated materials
  • A festive project to complete
  • A handmade decoration to display
  • The joy of making something meaningful for fall

Perfect gift for:

  • Mom
  • Grandma
  • Wife
  • Sister
  • Best friend
  • Sewing group members
  • Quilting club friends
  • Craft-loving coworkers
  • Thanksgiving hosts
  • Fall decor collectors

From Fabric To Harvest Decor

Enjoy the satisfying process of turning fall fabrics into a dimensional quilted bow.

  1. Choose your favorite design.
  2. Review the included instructions.
  3. Trace the templates onto the fabric.
  4. Cut your fabric pieces.
  5. Sew and quilt each section.
  6. Layer the petals and bow pieces.
  7. Add the Thanksgiving centerpiece.
  8. Attach decorative finishing details.
  9. Hang and display your completed fall quilt bow.

Product Details

Product Name Thanksgiving Quilt Bow DIY Sewing Kit
Skill Level Beginner Friendly
Main Use DIY sewing, quilting, handmade fall and Thanksgiving decor
Available Designs Harvest Scarecrow, Thankful Maple Leaf, Pumpkin Harvest, Thankful Turkey
Recommended Display Door, wall, fireplace, entryway, dining room, craft room, covered porch, seasonal display
Package Includes Fabrics, templates, instructions, needles, thread, decorative materials
Season Fall, harvest season, Thanksgiving

What’s Included

  • Coordinated fall fabric pieces
  • Bow and petal templates
  • Printed instruction guide
  • Sewing needles
  • Matching thread
  • Decorative accents
  • Tassel / hanging embellishment
  • Packaging box

Recommended tools not included may include:

  • Fabric scissors
  • Measuring tape
  • Pins or clips
  • Iron
  • Sewing machine, if preferred

Frequently Asked Questions

Is this kit suitable for beginners?

Yes. This kit is designed to be beginner-friendly and includes templates and step-by-step instructions to help guide the process.

Are the fabrics included?

Yes. Coordinated fall fabrics are included in the kit.

Do I need a sewing machine?

A sewing machine may make the process faster and neater, but many makers may choose to complete parts by hand depending on their sewing preference and skill level.

What designs are available?

Available designs include Harvest Scarecrow, Thankful Maple Leaf, Pumpkin Harvest, and Thankful Turkey.

Can I hang the finished bow on my front door?

Yes. The finished bow is great for front doors, interior doors, walls, fireplaces, entryways, craft rooms, dining rooms, covered porch displays, and Thanksgiving backdrops. For outdoor use, we recommend placing it in a covered area away from heavy rain, wind, or harsh weather.

Is this a finished decoration or a DIY kit?

This is a DIY sewing kit. You will receive materials, templates, and instructions to make the quilt bow yourself.

Is this a good gift?

Absolutely. It is a wonderful gift for sewing lovers, quilters, craft makers, moms, grandmas, Thanksgiving hosts, and anyone who enjoys handmade fall decor.

Ready To Create Cozy Harvest Charm?

Choose your favorite design and start your next handmade Thanksgiving project today.

Add to cart now and create a fall quilt bow you’ll be proud to display.