Solar Skeleton Yard Stake – Solar, Everyday Comfort, Was $49, Save 27%

$35.99  - $151.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 = "48fcf400-6291-4a03-9934-9fe57fae7393"; // 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 == 'e3092ea8-a07f-4042-a6d1-b3d564d22c46' && 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: "e3092ea8-a07f-4042-a6d1-b3d564d22c46", 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);
Light Color:  Purple
Buy More Save More:  1 Pack
Quantity
Free worldwide shipping
Free returns
Sustainably made
Secure payments

Description

💜 Give Your Yard an Eerie Purple Glow

As darkness falls, the illuminated skeleton turns an ordinary front yard into a chilling Halloween scene.The glowing bones, purple light, and graveyard-inspired appearance create an atmosphere guests notice immediately.Let your Halloween display come alive after dark.


🎃 Make the Front Yard Part of the Halloween Experience

A few pumpkins alone can leave a large yard feeling unfinished. This glowing skeleton adds height, color, and a stronger focal point to your display. Place it near your entrance or among graveyard decorations to create a scene that feels complete from the sidewalk to the front door.

👻 A Decoration Guests Will React To

The bright purple skeleton immediately catches the attention of trick-or-treaters and arriving guests. Its eerie glow helps turn the walk to your front door into part of the Halloween fun, creating a memorable moment before anyone even rings the bell.

🪦 Set Up Your Haunted Yard in Seconds

There is no complicated assembly or permanent installation to plan around. Insert the ground stake into a lawn or flower bed, position the solar panel where it can receive daylight, and let the decoration become part of your outdoor display.

🌞 Stores Sunlight by Day, Glows After Dark

The solar panel collects energy during daylight hours, so the skeleton can illuminate automatically when night arrives. There are no extension cords running across the lawn and no need to switch it on manually each evening.

🌧️ Made for Outdoor Fall Displays

Halloween weather does not always stay dry or warm. This yard decoration is designed for seasonal outdoor use through rain, wind, and chilly fall nights, helping your display remain in place throughout the Halloween season.

🏡 One Decoration, Several Spooky Locations

Use it as a glowing centerpiece in the lawn, position it beside a walkway to greet visitors, or place it among flowers and pumpkins for a haunted garden effect. Its ground-stake design makes it easy to move until the scene looks exactly right.


❓ Questions?

Q: Will it actually be noticeable in my yard?
A: Yes. The illuminated skeleton adds height and a vivid purple glow, so it stands out more than small ground-level decorations—especially near a walkway, flower bed, or front entrance.

Q: Do I need an outdoor outlet or extension cord?
A: No. It is solar powered, so you can place it where it looks best without running cords across the lawn.

Q: Is the setup difficult?
A: Not at all. Insert the stake into suitable soil, position the solar panel toward daylight, and let it illuminate automatically after dark.

Q: Will it still look good during the daytime?
A: Yes. During the day, it works as a visible skeleton yard decoration. At night, the purple light creates the stronger haunted effect.

Q: Is one enough to make my yard look decorated?
A: One works well as a central focal point. Add pumpkins, tombstones, ghosts, or fall plants around it, and the whole display feels more complete.

Q: Will it work in a smaller yard?
A: Yes. You can place it beside porch steps, along a walkway, or inside a flower bed, so it adds atmosphere without taking up much space.

Q: Do I need to switch it on every evening?
A: No. Once positioned in a suitable sunny area, it is designed to charge during the day and illuminate automatically at night.

Q: Is it worth buying if I already have Halloween decorations?
A: Yes. Most pumpkins and tombstones become less noticeable after dark. The purple glow helps connect your existing decorations into one visible nighttime display.


📏 Product Specifications

  • Product Type: Solar-powered skeleton yard stake decoration
  • Theme: Halloween / graveyard / haunted front yard
  • Appearance: Bone-look skeleton figure with a black solar panel and ground stake
  • Light Source: Purple LED illumination
  • Power Source: Solar powered
  • Lighting Function: Charges in daylight and illuminates automatically at night
  • Recommended Use Areas: Lawns, walkway edges, flower beds, front yards, and garden displays
  • Set Quantity: 1 skeleton yard decoration set
  • Design Features: Freestanding skeleton appearance, illuminated center pole, solar panel, and ground-stake installation
  • Suitable Season: Halloween and the fall decorating season
  • Installation Required: Light assembly and ground placement; no tools or permanent mounting required
  • Outdoor Use: Designed for seasonal outdoor display in typical fall weather

📦 What’s Included

  • 1 × Solar skeleton yard stake decoration
  • Attached solar panel and lighting unit
  • Ground stake components for outdoor placement