🎁Free Shipping on Orders Over $59🎉
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
1 / 10
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
🐱Handcrafted Metal Cat and Fish Wind Chime🎏
54% OFF
Fnkus

🐱Handcrafted Metal Cat and Fish Wind Chime🎏

$22.96 $49.99
0 sold
Quantity
Qty 1000 in stock

😍😍As you can see, our feline friend has rounded up quite the catch for himself. And based on the bones, he's already gobbled up some of his bounty. The metal is treated with a weathered bronze finish and the fish in shades of orange, red and white give the piece an autumnal feel

🐱🎁The perfect gift for any fan of felines, this lovely chime will amuse they eyes and soothe the ears wherever it's displayed. Comes with a 10" line and hook for easy hanging

🐱🐱This wind chimes is a symbol of freedom, the vintage and unique design is perfect fo routdoor porch decor, add beautiful melodies to your environment.

🐱🐱Light weighted and easy to hang. If the garden in your mind is becoming dull and trivial, our wind chimes are able to offer your a vibrant place.

Product Detail Drawing

  • Metal cat and fish wind chime
  • Handcrafted by Balinese artisans
  • metal is hand cut, welded and painted
  • 10" line with hook for easy hanging
  • Size:19.7"H x 5.3"D

 

const TAG = 'spz-custom-painter-button-animation'; const MAX_ITERATION_COUNT = 99999999; const SITE = (window.C_SETTINGS && window.C_SETTINGS.routes && window.C_SETTINGS.routes.root) || ''; const ADD_TO_CART_ANIMATION_SETTING = `${SITE}/api/marketing_atmosphere_app/add_to_cart_btn_animation/setting`; class SpzCustomPainterButtonAnimation extends SPZ.BaseElement { /**@override */ static deferredMount() { return false; } /** @param {!SpzElement} element */ constructor(element) { super(element); /** @private {!../../src/service/xhr-impl.Xhr} */ this.xhr_ = SPZServices.xhrFor(this.win); /** @private {Object} */ this.data_ = null; /** @private {Element} */ this.addToCartButton_ = null; /** @private {boolean} */ this.productAvailable_ = true; /** @private {number} */ this.timerId_ = null; /** @private {number} */ this.animationExecutionCount_ = 0; /** @private {boolean} */ this.selectedVariantAvailable_ = true; /** @private {number} */ this.delay_ = 5000; /** @private {number} */ this.iterationCount_ = 5; /** @private {string} */ this.animationClass_ = ''; } /** @override */ isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } /** @override */ buildCallback() { this.productAvailable_ = this.element.hasAttribute('product-available'); this.selectedVariantAvailable_ = this.element.hasAttribute('selected-variant-available'); } /** @override */ mountCallback() { this.render_(); } /** @private */ render_() { if (!this.productAvailable_) { return; } this.fetch_().then((data) => { if (!data) { return; } this.data_ = data; this.animationClass_ = `painter-${data.animation_name}-animation`; this.iterationCount_ = data.animation_iteration_count === 'infinite' ? MAX_ITERATION_COUNT : data.animation_iteration_count; const animationDuration = 1; const animationDelay = data.animation_delay || 5; this.delay_ = (animationDuration + animationDelay) * 1000; this.handleButtonEffect_(); }); } /** * @param {JsonObject} data * @return {(null|Object)} * @private */ parseJson_(data) { try { return JSON.parse(data); } catch (e) { return null; } } /** * @return {Promise} * @private */ fetch_() { return this.xhr_.fetchJson(ADD_TO_CART_ANIMATION_SETTING).then((data) => { if (!data || !data.enabled) { return null; } return this.parseJson_(data.detail); }); } /** @private */ getAddToCartButton_() { this.addToCartButton_ = SPZCore.Dom.scopedQuerySelector( document.body, '[data-section-type="product"] [role="addToCart"], [data-section-type="product_detail"] [role="addToCart"], [data-section-type="product_detail"] [data-click="addToCart"], [data-section-type="product"] [data-click="addToCart"]' ); } /** @private */ restartAnimation_() { this.addToCartButton_.classList.remove(this.animationClass_); this.addToCartButton_./* OK */ offsetWidth; this.addToCartButton_.classList.add(this.animationClass_); this.animationExecutionCount_++; } /** @private */ clearTimer_() { this.win.clearInterval(this.timerId_); this.timerId_ = null; } /** @private */ setupTimer_() { this.timerId_ = this.win.setInterval(() => { this.restartAnimation_(); if (this.animationExecutionCount_ >= this.iterationCount_) { this.removeAnimationClass_(); this.clearTimer_(); } }, this.delay_); } /** @private */ restartTimer_() { if (this.animationExecutionCount_ >= this.iterationCount_) { this.removeAnimationClass_(); return; } this.setupTimer_(); } /** @private */ listenVariantChange_() { SPZUtils.Event.listen(self.document, 'dj.variantChange', (e) => { const selectedVariant = e.detail && e.detail.selected; if (!selectedVariant) { return; } const {available} = selectedVariant; if (this.selectedVariantAvailable_ !== available) { this.selectedVariantAvailable_ = available; this.clearTimer_(); if (available) { this.restartTimer_(); } } }); } /** @private */ removeAnimationClass_() { this.win.setTimeout(() => { this.addToCartButton_.classList.remove(this.animationClass_); }, 1000); } /** @private */ handleButtonEffect_() { this.getAddToCartButton_(); if (!this.addToCartButton_) { return; } if (this.selectedVariantAvailable_) { ++this.animationExecutionCount_; this.addToCartButton_.classList.add(this.animationClass_); if (this.iterationCount_ === 1) { this.removeAnimationClass_(); return; } this.setupTimer_(); } this.listenVariantChange_(); } } SPZ.defineElement(TAG, SpzCustomPainterButtonAnimation);