DIY Haunted Castle Wall Decoration Set – Build a Spooky Halloween Castle at Home

$59.99 $92.99 Save $33.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 = "b6bd5338-7f90-4f58-ae5d-c4c804928ba1"; // 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 == 'edd2cd44-0e66-47bb-b6de-d4aa52a5ef14' && 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: "edd2cd44-0e66-47bb-b6de-d4aa52a5ef14", 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);
Design:  🌙 Moonlight Witch's Castle
📏 Finished Size::  ca. 1,2 m × 1,2 m
Quantity
Share the love
Free worldwide shipping
Free returns
Sustainably made
Secure payments
Description

🏰 Create your own haunted castle night

Bring the magic of Halloween to life with an impressive 3D felt wall scene of a castle. Layer each tower, window, and spooky detail by hand to create a decoration your family will remember. Transform your home into a haunted castle.


🏰 Transform your empty wall into a Halloween experience

Your home deserves more than ordinary Halloween decorations. This multi-layered felt castle transforms a blank wall into an impressive Gothic scene featuring turrets, glowing windows, bats, and spooky details. Create a Halloween atmosphere that feels like stepping into your own haunted tale.


✨ Everything you need to set the scene

A complete set includes all the pieces you need to create your haunted castle wall decoration. From castle towers and windows to bats, the moon, tree details, and decorative elements, every piece helps create a unique Halloween scene. Unpack the pieces and watch your castle come to life.


🖤 ​​Easy assembly, creative results

Assembling your haunted castle is part of the fun. Position the castle sections, add the layered details, and decorate with your favorite spooky elements. It’s a creative Halloween project that everyone can enjoy—not just the finished decoration.


🌑 Give any room a spooky atmosphere

A simple wall becomes the focal point of your Halloween décor. Perfect for creating an impressive display in your:

  • Living room
  • Fireplace area
  • Entrance
  • Halloween party area

Bring Gothic charm and seasonal atmosphere to the places where memories are made.


👨‍👩‍👧 A Halloween activity that everyone can enjoy

More than just a decoration—it’s an interactive holiday experience. Families can build, decorate, and customize the castle together, creating a special Halloween tradition. A fun craft project that transforms into a beautiful seasonal decoration.


🕸️ Designed for your spooky spaces

Create the perfect Halloween backdrop, no matter where you celebrate.

Use it to decorate:

  • Fireplace mantels
  • Living rooms
  • Party areas
  • Seasonal display corners

A reusable Halloween decoration that gives your space a whole new feel.

⭐ Customer Reviews

⭐⭐⭐⭐⭐
“I wanted something different from the usual Halloween decorations, and this castle wall set was exactly what I was looking for. Putting the pieces together was relaxing, and the finished castle completely transformed the atmosphere of my fireplace area. It feels like a real Halloween scene now.”

Emily R. + United States

⭐⭐⭐⭐⭐
“I bought this set as a Halloween activity for the whole family, and my kids had a lot of fun putting it together. Everyone got to decide where to place the details, and it became a lovely memory rather than just another decoration to be packed away after the season.”

Jessica M. + United States

⭐⭐⭐⭐⭐
“I was surprised by how much this set transformed a blank wall. The layered castle pieces, bats, moon, and windows create so much depth that guests notice it immediately when they walk into the room.”

Michael T. + United States

⭐⭐⭐⭐⭐
“This was such a lovely seasonal decoration for our home. I love that it looks handmade and unique, rather than like the same store-bought Halloween decorations everyone else has.”

Sarah L. + United States


❓ Questions?

Q: Is this just a flat wall decoration?

A: No. The multi-layered felt pieces create a three-dimensional castle scene complete with towers, windows, and decorative details. It gives your wall a more immersive Halloween look compared to a simple, flat decoration.

Q: Is assembly difficult?

A: Not at all. The pieces are designed for an easy DIY experience. You can assemble the castle step-by-step and enjoy the creative process without needing complicated tools.

Q: Is it suitable for families with children?

A: Yes. It’s a fun Halloween activity where kids can help arrange the pieces and work together to create their own spooky castle scene, turning decorating into a shared family experience.

Q: Will it really transform my home's Halloween decor?

A: Yes. This set is designed to turn ordinary walls, fireplace areas, or empty spaces into a Halloween focal point that instantly changes the room's atmosphere.

Q: Is it worth buying if I already have Halloween decorations?

A: Many conventional decorations just sit on tables or shelves. This set creates a larger wall display with a completely different visual impact, helping to refresh and reimagine your Halloween decor.

Q: Can I use it in different areas of my home?

A: Yes. It works beautifully on fireplace walls, in living rooms, entryways, as a party backdrop, or in other indoor spaces.

Q: Does it require special tools or crafting experience?

A: No. The set is designed for a beginner-friendly DIY experience, allowing you to create the finished castle without needing advanced crafting skills.

Q: Is it intended only for Halloween parties?

A: No. It can be enjoyed throughout the Halloween season as festive home decor and a fun family project.


📏 Product Information

  • Product Type: DIY Felt Haunted Castle Wall Decor Set

  • Theme: Gothic Haunted Castle / Halloween Wall Decoration

  • Material & Appearance: Multi-layered felt pieces with a handcrafted, three-dimensional look

  • Design Style: Dark Gothic castle design featuring turrets, windows, bats, a moon, a tree, and spooky decorative elements

  • Lighting Effect: Warm, glowing appearance created by the castle's window design

  • Usage Scenarios: Indoor Halloween home decor, fireplace walls, living rooms, entryways, party backdrops, seasonal decorations

  • Mounting Type: DIY peel-and-stick assembly

  • Installation: Requires assembling and arranging the included decorative pieces

  • Design Features: Multi-layered castle structure, customizable placement options, impressive 3D wall scene effect

  • Suitable Season: Halloween season and autumn home decor

  • Recommended Users: Families, DIY craft enthusiasts, Halloween decor fans, home decor lovers


📦 Box contents

  • DIY Felt Haunted Castle Wall Decor Pieces

  • Castle Structure Pieces

  • Tower and Roof Pieces

  • Window Detail Pieces

  • Moon and Tree Decor Pieces

  • Bat and Halloween Decor Elements

  • Spiderweb Decor Elements

  • Adhesive Pieces for Installation

  • Assembly Instructions

Create a Halloween wall scene that is more than just a decoration—a castle your family builds, displays, and remembers together.