🎃 Pre-Lit Drippy Halloween Garland | 100 Orange Lights

$42.99
const TAG = "spz-custom-product-automatic"; class SpzCustomProductAutomatic extends SPZ.BaseElement { constructor(element) { super(element); this.variant_id = 'ba5f352c-a02e-46f6-b6d9-e03aad15504c'; 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 = '2168c8f4-59bd-4ece-b17c-5191bd66ee66'; 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 == '2168c8f4-59bd-4ece-b17c-5191bd66ee66' && 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 = '2168c8f4-59bd-4ece-b17c-5191bd66ee66'; 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);
Quantity

Description

🎃 BACK BY POPULAR DEMAND

Remember This Garland?
It’s Finally Back.

Turn an ordinary mantel, doorway or porch into a dramatic Halloween focal point with cascading black strands and 100 glowing orange lights.

✨ 100 Orange Lights  📏 9-Foot Length ↪️ Bendable Wired Base

THE LOOK YOU SAW IN THE VIDEO

From Plain Mantel to Halloween Showpiece

Drape it across your space, shape the flexible base and switch on the warm orange glow.

One Garland Creates Big Visual Impact

The generous 9-foot length helps fill wide mantels and entryways, while the layered strands create the full, dramatic look shown in the video.

Beautiful by Day. Haunting After Dark.

The dense black texture adds dimension during the day, while 100 orange mini lights create a warm, eerie glow when the room gets dark.

WHY HALLOWEEN LOVERS WANT IT

Maximum Spooky Atmosphere, Minimal Effort

🕸️

Full, Cascading Appearance

Long strands of black PVC and gauze create a layered, dripping silhouette that makes empty spaces look instantly decorated.

🧡

100 Lights Already Included

No need to purchase or wrap a separate light string—the orange mini lights are distributed throughout the garland.

↪️

Shape It Around Your Space

A flexible wire runs through the base, helping the garland follow mantel edges, curves, arches, corners and banisters.

🍂

Rustling Haunted Effect

The dangling PVC strands can rustle like dry leaves in the breeze, adding sound and movement to covered outdoor displays.

SEE THE DIFFERENCE

Why This Garland Stands Out on Video

It delivers the three things that make seasonal decor visually satisfying.

✅ Noticeable Before-and-After Transformation

A plain fireplace becomes a complete Halloween centerpiece without replacing your existing room decor.

✅ Thick, Full Coverage

The long, reaching strands help eliminate the sparse appearance often seen with ordinary decorative garlands.

✅ Warm Nighttime Glow

Orange lighting complements pumpkins, lanterns, skeletons and other classic Halloween decorations.

DRAPE. SHAPE. GLOW.

Three Simple Styling Steps

1

Drape It Across Your Space

Position it across a mantel, doorway, staircase, porch railing or sheltered entryway.

2

Shape the Wired Base

Bend the flexible base around edges and curves, then spread the strands to create your preferred fullness.

3

Plug In the Orange Lights

Connect the 4-foot cord to a standard outlet and enjoy the finished Halloween atmosphere.

★★★★★

Made to Become Part of Your Halloween Tradition

Customers highlight its dramatic appearance, sturdy materials and ability to fill larger decorating areas.

★★★★★

Looks Great and Feels Sturdy

“Looks great and materials are sturdy. Very happy with this purchase.”

★★★★★

Perfect for Framing a Porch

“This is my third strand of the Pre-lit Drippy Garland and I love it. I now have enough to frame my porch.”

★★★★★

Creates a Full Fireplace Look

“I absolutely love this garland. Purchased two to give our fireplace a full look.”


STYLE MORE THAN A MANTEL

One Garland, Multiple Decorating Ideas

✅ Fireplace Mantels: Recreate the full, glowing look shown in the video.

✅ Front Doors: Build a dramatic entrance for trick-or-treaters.

✅ Porches: Pair it with pumpkins, lanterns, skeletons and signs.

✅ Staircases: Bend it along banisters and curved railings.

✅ Covered Patios: Add texture, movement and orange light to sheltered areas.

PRODUCT DETAILS

Specifications

Product Pre-Lit Drippy Garland
Dimensions 9 ft. L × 36 in. W
Weight 3 lbs.
Cord Length 4 ft.
Lighting 100 orange mini lights
Materials PVC strands and black gauze
Base Flexible wired construction
Power Standard electrical outlet
Recommended Use Indoor or covered outdoor areas
Included 2 replacement bulbs and 2 spare fuses

🏠 Indoor & Covered Outdoor Use

Keep the garland and electrical connection protected from direct rain, heavy moisture and standing water.

Shop With Confidence

Seasonal decor supported by secure ordering and helpful customer service.

🔒
Secure Checkout

Protected payment processing

📦
Careful Handling

Orders prepared with care

💬
Helpful Support

Assistance when you need it

🎃

THE FAN-FAVORITE LOOK IS BACK

Create the Halloween Mantel Everyone Remembers

Add full cascading texture, warm orange lights and unmistakable Halloween atmosphere to your favorite space.

GET YOUR GARLAND