Fall Halloween Floral Holde

$32.99
$44.99
-$12.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 = "031cf607-a759-4a4d-b499-be80c503d8a2"; // 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 == 'b0af2c26-e687-4c78-9bf4-c7df6360ebf4' && 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: "b0af2c26-e687-4c78-9bf4-c7df6360ebf4", 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);
Quantity
Free worldwide shipping
Free returns
Sustainably made
Secure payments

Description

The Fall Halloween Floral Holder is a charming seasonal tabletop decoration designed with a cute smiling ghost shape, black bow detail, soft cream finish, and a back basket for floral styling. It works beautifully as a Halloween ghost figurine, fall flower holder, tabletop accent, or cozy autumn home decoration.

Use it with faux flowers, dried florals, berry stems, autumn leaves, cream roses, black roses, orange mums, or small seasonal arrangements. Place it on a kitchen counter, coffee bar, mantel, entryway table, bookshelf, dining table, office desk, or shop display to create a warm and playful Halloween look.


Why You’ll Love Our Product ✨

1. Cute Ghost Design, Not Too Spooky

The smiling ghost shape feels sweet, friendly, and family-friendly. It adds Halloween charm without looking scary, making it perfect for cozy homes, kitchens, kids’ spaces, and warm seasonal displays.

2. Built-In Back Basket for Florals

The back basket lets you style the piece with faux flowers, dried stems, berries, leaves, or mini bouquets. Change the arrangement for Halloween, Thanksgiving, fall decorating, or everyday seasonal styling.

3. Perfect for Fall and Halloween

This piece works beyond Halloween night. Use it from early fall through October and even into Thanksgiving season by simply changing the flowers or surrounding décor.

4. Compact Tabletop Size

At approximately 25 × 20 × 18 cm / 9.8 × 7.9 × 7.1 in, it is easy to display on counters, mantels, shelves, entry tables, windowsills, and coffee bars without taking up too much space.

5. Easy to Match With Cozy Home Styles

The cream ghost body, black bow, and warm floral colors pair beautifully with farmhouse, cottagecore, neutral fall, vintage Halloween, cozy kitchen, and autumn mantel décor.

6. Great for Gifts and Bundles

A thoughtful seasonal gift for Halloween lovers, fall décor fans, flower lovers, moms, friends, coworkers, and anyone who enjoys cute home accents. It also pairs well with faux flowers, mini pumpkins, candles, trays, and Halloween table runners for bundle sales.


Product Specifications

Item Details
Product Name Fall Halloween Floral Holder
Product Type Ghost figurine / floral holder / fall tabletop décor
Theme Halloween, fall décor, cute ghost, cozy autumn
Main Colors Cream white, black, orange, warm fall tones
Design Details Smiling ghost, black bow, back basket, floral display style
Overall Size Approx. 25 × 20 × 18 cm / 9.8 × 7.9 × 7.1 in
Back Basket Size Approx. 12 × 10 × 8 cm / 4.7 × 3.9 × 3.1 in
Recommended Material Resin /
Recommended Florals Faux flowers, dried flowers, berry stems, autumn leaves, mini bouquets
Best Placement Kitchen counter, mantel, entryway, coffee bar, shelf, dining table, office
Best Season Fall décor, Halloween, Thanksgiving-season styling, themed parties
Package Quantity 1 ghost floral holder; 


What’s In The Box?

  • 1 × Fall Halloween Floral Holder
  • 1 × Attached back basket structure

How To Use ️

  1. Remove the floral holder carefully from the package.
  2. Check the ghost body, bow detail, and back basket.
  3. Place faux flowers, dried stems, berries, or autumn leaves into the back basket.
  4. Adjust the height and direction of the florals for a fuller look.
  5. Display it on a kitchen counter, coffee bar, mantel, shelf, entry table, or dining table.
  6. Pair it with mini pumpkins, LED candles, fall leaves, black cat accents, or Halloween trays.
  7. Wipe gently with a soft dry cloth when needed.

Customer Reviews ⭐

⭐⭐⭐⭐⭐ Perfect for my fall kitchen

Emily Carter|Verified Purchase
I placed it beside my coffee machine with orange berries and cream roses. It made my kitchen feel warm and festive without being too spooky.

⭐⭐⭐⭐⭐ Love the flower basket

Sarah Miller|Verified Purchase
This is more useful than a regular figurine because I can change the flowers. I used black roses for Halloween and fall leaves for Thanksgiving.

⭐⭐⭐⭐⭐ Great tabletop size

Jessica Brown|Verified Purchase
It looks perfect on my entry table. Not too big, but still noticeable. Guests keep asking where I found it.

⭐⭐⭐⭐⭐ Cozy Halloween style

Amanda Wilson|Verified Purchase
I do not like scary Halloween décor, so this little ghost is exactly my style. It looks adorable with my neutral fall decorations.

⭐⭐⭐⭐⭐ Cute gift idea

Laura Anderson|Verified Purchase
I bought it for a friend who loves Halloween. I added a small faux flower bundle, and it felt like a very thoughtful gift.


FAQ ❓

Q1: Is this a vase or a figurine?

It is a decorative ghost figurine with a back basket that can be used for floral styling.

Q2: Are flowers included?

Please confirm based on the final SKU. If flowers are not included, they should be listed as display inspiration only.

Q3: What size is it?

The overall size is approximately 25 × 20 × 18 cm / 9.8 × 7.9 × 7.1 in. The back basket is approximately 12 × 10 × 8 cm / 4.7 × 3.9 × 3.1 in.

Q4: Where can I display it?

It works well on kitchen counters, mantels, entry tables, shelves, dining tables, coffee bars, office desks, and shop displays.

Q5: Can it be used outdoors?

Indoor use is recommended. If used on a covered porch, keep it protected from rain, moisture, wind, and long-term direct sunlight.

Q6: Can I use fresh flowers?

Faux or dried flowers are recommended. If using fresh flowers, place them in a separate waterproof tube or liner and avoid letting water touch the holder.

Q7: How do I clean it?

Wipe gently with a soft dry cloth. Do not soak, rinse, or use harsh cleaning chemicals.


Final Call To Action

Style your fall home with a little ghostly sweetness.
The Fall Halloween Floral Holder blends cute Halloween charm, warm autumn florals, and easy tabletop styling—perfect for kitchens, mantels, entryways, coffee bars, and cozy seasonal displays.