⏳ Last Day 49% OFF – 🚒 Beginner-Friendly Vintage Firehouse Mosaic Light DIY Kit Collection | Complete Kit with Mosaic Pieces, LED Lights & Step-by-Step Guide Included 💕

$38.99 $45.99 Save $7.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 = "975e7aa3-2dc7-427f-873d-a17de684324b"; // 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 == 'c96391d4-0061-4cb9-abf0-256c7bb7a5b3' && 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: "c96391d4-0061-4cb9-abf0-256c7bb7a5b3", 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:  Firehouse Bell Tower
Quantity
Share the love
Free worldwide shipping
Free returns
Sustainably made
Secure payments
Description

❤️TIPS: All goods are authentic, with genuine patents, counterfeit must be investigated! Customers, please identify our products!

SHIPPING WORLDWIDE. 
💯Payments Via PayPal® and CreditCard.
⭐Fast refund Guarantee>> Partial or full refund depends on the situation.
📦Orders will not incur additional customs duties.

🎁Don't forget to buy some for your family or friends as it's a unique gift idea.❤️❤️❤️


preview 
🚒Bring warmth, courage, and nostalgic firehouse charm into your home with this 3D Mosaic Firehouse Light DIY Kit.

✨This is more than a craft project — it is a meaningful decorative piece that celebrates bravery, service, protection, and homegrown vintage charm.
💛Piece by piece, light by light, this DIY kit lets you create a miniature firehouse world full of warmth and meaning.
❤️When finished, it becomes a glowing reminder of courage, protection, service, and handmade love.
Place it on a mantel.
Gift it with meaning.
Light it at night.
👨‍🚒Let it bring vintage firehouse charm into your home.

preview
Inspired by classic fire stations, bell towers, lookout towers, firefighter memorial beacons, and vintage fire hydrants, each design is built with glowing LED lights, sea-glass-style mosaic pieces, rustic details, and a beautiful handmade display look.

🔥 A Handmade Tribute Full of Warmth & Meaning

There is something deeply comforting about a glowing firehouse tower.

The warm windows, tiny bell tower, vintage red accents, fire helmets, hydrants, ropes, ladders, and mosaic stone texture make each piece feel like a miniature story.

Whether displayed on a mantel, shelf, entryway table, craft room, memorial corner, or cozy cabin space, it becomes a small glowing reminder of courage, protection, and handmade care.

🎁 A Thoughtful Gift With Meaning

This kit makes a heartfelt gift for:

🚒 Firefighters
👨‍🚒 Firefighter families
❤️ First-responder supporters
🕯️ Memorial keepsake collectors
🏡 Rustic home décor lovers
🧩 DIY craft lovers
🎄 Holiday village collectors
🎁 Anyone who loves meaningful handmade gifts

It is thoughtful, personal, and more special than ordinary store-bought décor.

🌟 Product Highlights

🚒 Firehouse-inspired 3D design
💡 Warm glowing LED effect
🧩 Mosaic sea-glass-style texture
🏡 Vintage handmade display look
🎁 Meaningful gift for firefighter families
🛠️ Beginner-friendly DIY process
🔥 Great for home, holiday, cabin, and memorial décor
✨ Unique collectible style

preview

✨ Why You’ll Love It

🚒 Vintage Firehouse-Inspired Design
Classic red-and-cream firehouse colors, tower windows, bell details, hydrant accents, and old-fashioned rescue décor create a nostalgic collectible look.

💡 Warm LED Glow
Built-in warm lights shine through the mosaic windows and translucent pieces, giving the tower a cozy lantern-like effect.

🧩 3D Mosaic Craft Experience
Place each sea-glass-style piece by hand to build a textured, dimensional tower full of character.
preview

🏡 Display-Worthy Home Décor
Perfect for shelves, mantels, entry tables, cabins, firehouse-themed rooms, or seasonal winter décor.

🎁 Meaningful Gift Idea
A thoughtful choice for DIY lovers, firefighters, firefighter families, first-responder supporters, memorial gifts, and collectors of unique handmade décor.

🛠️ Beginner-Friendly Kit
Designed with guided steps so crafters can enjoy the process without needing advanced skills.

🧱 Beautiful 3D Mosaic Texture

Each tower is decorated piece by piece with translucent mosaic stones in warm firehouse tones:

❤️ Deep red
🤍 Creamy white
🩶 Smoky gray
🧡 Amber gold
🌲 Forest green accents on lookout styles

The uneven mosaic surface creates a handcrafted stained-glass effect. When the lights turn on, the tower feels warm, layered, and full of life.

🏡 Perfect For Displaying In

🔥 Fireplace mantel
🚪 Entryway table
🪵 Cabin shelf
📚 Bookcase or reading nook
🎄 Christmas village display
🧵 Craft room
🕯️ Memorial corner
🏠 Rustic farmhouse décor
🎁 Gift table or holiday display
🚒 Firefighter family home décor

The warm light makes it especially beautiful at night, while the mosaic texture gives it a handmade collectible look during the day.

preview

🚒 Choose Your Favorite Style
🔔 Firehouse Bell Tower

A tall vintage bell tower with glowing windows, red-and-cream mosaic walls, a classic bell room, and firehouse accessories.

🌲 Fire Lookout Tower

A wilderness-inspired lookout tower with earthy green, amber, gray, and cream mosaic pieces, perfect for cabin, woodland, and rustic décor.

🕯️ Firefighter Memorial Tower

A meaningful tribute beacon with deep red and smoky gray tones, memorial details, warm lighting, and a respectful display feel.

🏛️ Vintage Fire Station

A charming old-fashioned fire station building with glowing windows, garage doors, firehouse signs, and nostalgic miniature details.

🚰 3D Mosaic Fire Hydrant Lantern

A bold glowing hydrant design with red mosaic panels, bronze-style hardware, chains, hose details, and firefighter-themed accents.

🪡 Create It in Four Simple Steps

  1. Arrange the mosaic pieces and plan your color placement
  2. Attach and layer the pieces across the tower or hydrant surface
  3. Add the firefighter-themed details and decorative accents
  4. Install the warm LED lights and display your finished creation

Work at your own pace and enjoy watching the structure gradually transform into a glowing miniature scene.
preview

📦 What’s Included

✅ Tower structure / base pieces
✅ Sea-glass-style mosaic pieces
✅ Decorative shells, pearls, pebbles, or accent pieces
✅ Craft adhesive
✅ Warm LED light string
✅ Wood base details
✅ Mini firefighter-themed accessories
✅ Step-by-step instruction guide

preview

🎁Package Includes

  • 1 x   🚒✨ Create Your Own Vintage Firehouse Light Tower