🎃 Beginner-Friendly Moonlit Wooden Cottage 3D Pearl Art Kit Collection | Complete Kit with All Tools & Step-by-Step Guide Included 💕

$33.99 $45.07 Save $11.08
/** * 优惠码组件模型类 * 处理优惠码的显示和交互逻辑 */ 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 = "6bcddd1c-9025-400b-b021-88963869ab26"; // 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 == '02b4b06a-908c-4e69-8975-1913dab10541' && 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: "02b4b06a-908c-4e69-8975-1913dab10541", 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🎁Buy 2— Save 10% Off & Free Shipping:  👻 Ghost
Quantity
Share the love
Free worldwide shipping
Free returns
Sustainably made
Secure payments
Description

💎 Decorate the wooden panels with sparkling rhinestones and pearl-style beads, assemble your three-dimensional haunted cottage, then display it on a tabletop, mantel, shelf, or inside a miniature Halloween village. 🏚️✨


🌟 Why This Halloween Cottage Kit Is Worth It

🏚️ Turn Flat Wooden Panels Into a 3D Haunted Cottage

This is more than an ordinary flat diamond-art project.

Decorate the individual walls, roof, doors, windows, and seasonal details before connecting the finished panels into a freestanding three-dimensional Halloween house.

Watching the separate pieces become a complete little haunted cottage is one of the most satisfying parts of the project.
preview


💎 Add Sparkle One Detail at a Time

Colorful rhinestones, pearl-style beads, and raised decorative accents bring texture and spooky character to every side of the cottage.

Complete the pumpkins, ghosts, witch hats, lanterns, moons, stars, black cats, skulls, flowers, and other Halloween details one piece at a time.

Place the finished house near candles or seasonal lights and watch the reflective decorations catch the surrounding glow.
preview


🔢 A Guided Design Makes Creating Easier

The prepared wooden panels feature numbered sections that guide the placement of the different rhinestones, beads, and decorations.

Simply match the materials to the corresponding areas and complete one panel at a time.

No drawing or painting experience is required.
preview


🧘 A Relaxing Halloween Craft Experience

Picking up each gem, matching the colors, and gradually completing the panels creates a calm and satisfying creative rhythm.

Enjoy it during spooky movie nights, quiet autumn evenings, family craft sessions, Halloween parties, or whenever you want a relaxing screen-free seasonal activity.


🎃 Make It, Display It, or Build a Haunted Village

Once completed, your handmade cottage becomes a versatile Halloween decoration.

Place it on a mantel, bookshelf, desk, entryway table, windowsill, side table, or party display—or combine several designs to create a miniature sparkling haunted village.

Unlike flat diamond paintings, the three-dimensional house can be admired from different angles while the rhinestones and pearl details reflect the surrounding light.

You are not simply adding another decoration to your home—you are displaying something you created yourself.
preview


🎁 A Creative Gift and Handmade Keepsake

Give the unopened kit to someone who enjoys crafting, or complete the cottage yourself as a personal handmade gift.

It is a thoughtful choice for mothers, grandmothers, friends, teenagers, Halloween collectors, and anyone who loves spooky seasonal traditions.

The recipient receives both an enjoyable activity and a decoration they can display every Halloween.


🧙 Choose Your Halloween Cottage

Available designs include:

👻 Ghost House
🎃 Pumpkin Cottage
🧙 Witch House
💀 Skull Cabin
🐈⬛ Black Cat House
🥀 Gothic Floral House

Choose one favorite design or collect all six to create a complete handmade Halloween village.
preview


📏 Product Specifications

Product Name: Halloween Wooden House 3D Rhinestone Diamond Art DIY Kit
Product Type: Three-dimensional wooden cottage gem-art kit
Theme: Halloween / Autumn / Ghost / Pumpkin / Witch / Skull / Black Cat / Haunted Cottage
Materials: Pre-cut wooden panels, rhinestones, beads, pearl-style decorations, and gem-art materials
Finished Size: Approx. 14.5 × 11.8 × 13.5 cm / 5.7 × 4.7 × 5.3 in
Available Styles: Ghost House / Pumpkin Cottage / Witch House / Skull Cabin / Black Cat House / Gothic Floral House
Skill Level: Beginner-friendly
Recommended Use: Tabletop décor, mantel display, shelf ornament, Halloween party centerpiece, or handmade seasonal gift
Quantity: Makes 1 three-dimensional Halloween cottage in the selected design

Exact colors, patterns, and decorative components vary according to the selected style.
preview


🎁📦 Package Includes

✅ 1 × Set of pre-cut wooden cottage panels
✅ 1 × Coordinated rhinestone and bead set
✅ 1 × Pearl-style decoration set
✅ 1 × Applicator pen
✅ 1 × Bead tray
✅ 1 × Wax pad
✅ 1 × Set of assembly components and accessories
✅ 1 × Step-by-step instruction guide

Complete Village Option: Includes six individual cottage kits—one in each available design.

preview


🛠️ How to Create Your Halloween Cottage

1. Prepare the Materials

Lay out the wooden panels, rhinestones, pearl-style pieces, applicator pen, tray, wax, and instructions on a clean workspace.

Keep each color and shape separated for easier placement.

2. Decorate Each Panel

Pour a small number of gems into the tray, load the applicator pen with wax, and place each piece onto its corresponding numbered section.

3. Complete the Details and Assemble

Finish the walls, roof, doors, windows, borders, and Halloween accents. Gently press the decorations into place, then connect the completed panels according to the guide.

4. Display Your Haunted Cottage

Place the finished house on a mantel, shelf, desk, entryway table, party centerpiece, or miniature Halloween village display.


❓ Frequently Asked Questions

Is This a Flat Diamond Painting?

No. You decorate several individual wooden panels and then assemble them into a freestanding three-dimensional Halloween cottage.

Is It Suitable for Beginners?

Yes. The numbered design guides the placement of the rhinestones and beads, so no drawing or painting experience is required.

Are the Tools Included?

Yes. The selected kit includes the wooden panels, decorative materials, applicator pen, bead tray, wax, and assembly accessories.

Can It Stand on Its Own?

Yes. The assembled cottage is designed for tabletop, mantel, bookshelf, desk, windowsill, or Halloween village display.

Can I Combine Different Designs?

Yes. Choose several styles and arrange them together to create a sparkling miniature haunted village.

Does It Have Built-In Lights?

No. The sparkling effect comes from the rhinestones, beads, and pearl-style details reflecting nearby natural or decorative light.


🎃 Make Something Worth Displaying Every Halloween

At first, they are simply flat wooden panels and bags of colorful gems.

Then the roof begins to sparkle.

The windows gain detail.

The ghosts, pumpkins, moons, black cats, skulls, and spooky flowers appear one piece at a time.

Finally, the completed panels connect—and a tiny haunted cottage stands in front of you.

The Halloween Wooden House 3D Rhinestone Diamond Art DIY Kit gives you more than another seasonal decoration.

It gives you the satisfaction of creating every sparkling detail yourself.

Build it during a quiet autumn evening.

Display it on your mantel.

Or collect several designs and create a handmade haunted village your family can enjoy every Halloween. ✨