/*
* By Elementor Team
*/
( function( $ ) {
var Sticky = function( element, userSettings ) {
var $element,
isSticky = false,
isFollowingParent = false,
isReachedEffectsPoint = false,
elements = {},
settings,
elementOffsetValue,
elementWidth;
var defaultSettings = {
to: 'top',
offset: 0,
effectsOffset: 0,
parent: false,
classes: {
sticky: 'sticky',
stickyActive: 'sticky-active',
stickyEffects: 'sticky-effects',
spacer: 'sticky-spacer',
},
isRTL: false,
isScrollSnapActive: false,
handleScrollbarWidth: false,
};
var initElements = function() {
$element = $( element ).addClass( settings.classes.sticky );
elements.$window = $( window );
elements.$body = $( document ).find( 'body' );
if ( settings.parent ) {
elements.$parent = $element.parent();
if ( 'parent' !== settings.parent ) {
elements.$parent = elements.$parent.closest( settings.parent );
}
}
};
var initSettings = function() {
settings = jQuery.extend( true, defaultSettings, userSettings );
};
var bindEvents = function() {
elements.$window.on( 'resize', onWindowResize );
if ( settings.isScrollSnapActive ) {
elements.$body.on( 'scroll', onWindowScroll );
} else {
elements.$window.on( 'scroll', onWindowScroll );
}
};
var unbindEvents = function() {
elements.$window
.off( 'scroll', onWindowScroll )
.off( 'resize', onWindowResize );
elements.$body.off( 'scroll', onWindowScroll );
};
var init = function() {
initSettings();
initElements();
bindEvents();
checkPosition();
};
var backupCSS = function( $elementBackupCSS, backupState, properties ) {
var css = {},
elementStyle = $elementBackupCSS[ 0 ].style;
properties.forEach( function( property ) {
css[ property ] = undefined !== elementStyle[ property ] ? elementStyle[ property ] : '';
} );
$elementBackupCSS.data( 'css-backup-' + backupState, css );
};
var getCSSBackup = function( $elementCSSBackup, backupState ) {
return $elementCSSBackup.data( 'css-backup-' + backupState );
};
const updateElementSizesData = () => {
elementWidth = getElementOuterSize( $element, 'width' );
elementOffsetValue = $element.offset().left;
if ( settings.isRTL ) {
// `window.innerWidth` includes the scrollbar while `document.body.offsetWidth` doesn't.
const documentWidth = settings.handleScrollbarWidth ? window.innerWidth : document.body.offsetWidth;
elementOffsetValue = Math.max( documentWidth - elementWidth - elementOffsetValue, 0 );
}
}
var addSpacer = function() {
elements.$spacer = $element.clone()
.addClass( settings.classes.spacer )
.css( {
visibility: 'hidden',
transition: 'none',
animation: 'none',
} );
$element.after( elements.$spacer );
};
var removeSpacer = function() {
elements.$spacer.remove();
};
var stickElement = function() {
backupCSS( $element, 'unsticky', [ 'position', 'width', 'margin-top', 'margin-bottom', 'top', 'bottom', 'inset-inline-start' ] );
const css = {
position: 'fixed',
width: elementWidth,
marginTop: 0,
marginBottom: 0,
};
css[ settings.to ] = settings.offset;
css[ 'top' === settings.to ? 'bottom' : 'top' ] = '';
if ( elementOffsetValue ) {
css[ 'inset-inline-start' ] = elementOffsetValue + 'px';
}
$element
.css( css )
.addClass( settings.classes.stickyActive );
};
var unstickElement = function() {
$element
.css( getCSSBackup( $element, 'unsticky' ) )
.removeClass( settings.classes.stickyActive );
};
var followParent = function() {
backupCSS( elements.$parent, 'childNotFollowing', [ 'position' ] );
elements.$parent.css( 'position', 'relative' );
backupCSS( $element, 'notFollowing', [ 'position', 'inset-inline-start', 'top', 'bottom' ] );
const css = {
position: 'absolute',
};
elementOffsetValue = elements.$spacer.position().left;
if ( settings.isRTL ) {
const parentWidth = $element.parent().outerWidth(),
elementOffsetValueLeft = elements.$spacer.position().left;
elementWidth = elements.$spacer.outerWidth();
elementOffsetValue = Math.max( parentWidth - elementWidth - elementOffsetValueLeft, 0 );
}
css[ 'inset-inline-start' ] = elementOffsetValue + 'px';
css[ settings.to ] = '';
css[ 'top' === settings.to ? 'bottom' : 'top' ] = 0;
$element.css( css );
isFollowingParent = true;
};
var unfollowParent = function() {
elements.$parent.css( getCSSBackup( elements.$parent, 'childNotFollowing' ) );
$element.css( getCSSBackup( $element, 'notFollowing' ) );
isFollowingParent = false;
};
var getElementOuterSize = function( $elementOuterSize, dimension, includeMargins ) {
var computedStyle = getComputedStyle( $elementOuterSize[ 0 ] ),
elementSize = parseFloat( computedStyle[ dimension ] ),
sides = 'height' === dimension ? [ 'top', 'bottom' ] : [ 'left', 'right' ],
propertiesToAdd = [];
if ( 'border-box' !== computedStyle.boxSizing ) {
propertiesToAdd.push( 'border', 'padding' );
}
if ( includeMargins ) {
propertiesToAdd.push( 'margin' );
}
propertiesToAdd.forEach( function( property ) {
sides.forEach( function( side ) {
elementSize += parseFloat( computedStyle[ property + '-' + side ] );
} );
} );
return elementSize;
};
var getElementViewportOffset = function( $elementViewportOffset ) {
var windowScrollTop = elements.$window.scrollTop(),
elementHeight = getElementOuterSize( $elementViewportOffset, 'height' ),
viewportHeight = innerHeight,
elementOffsetFromTop = $elementViewportOffset.offset().top,
distanceFromTop = elementOffsetFromTop - windowScrollTop,
topFromBottom = distanceFromTop - viewportHeight;
return {
top: {
fromTop: distanceFromTop,
fromBottom: topFromBottom,
},
bottom: {
fromTop: distanceFromTop + elementHeight,
fromBottom: topFromBottom + elementHeight,
},
};
};
var stick = function() {
updateElementSizesData();
addSpacer();
stickElement();
isSticky = true;
$element.trigger( 'sticky:stick' );
};
var unstick = function() {
unstickElement();
removeSpacer();
isSticky = false;
$element.trigger( 'sticky:unstick' );
};
var checkParent = function() {
var elementOffset = getElementViewportOffset( $element ),
isTop = 'top' === settings.to;
if ( isFollowingParent ) {
var isNeedUnfollowing = isTop ? elementOffset.top.fromTop > settings.offset : elementOffset.bottom.fromBottom < -settings.offset;
if ( isNeedUnfollowing ) {
unfollowParent();
}
} else {
var parentOffset = getElementViewportOffset( elements.$parent ),
parentStyle = getComputedStyle( elements.$parent[ 0 ] ),
borderWidthToDecrease = parseFloat( parentStyle[ isTop ? 'borderBottomWidth' : 'borderTopWidth' ] ),
parentViewportDistance = isTop ? parentOffset.bottom.fromTop - borderWidthToDecrease : parentOffset.top.fromBottom + borderWidthToDecrease,
isNeedFollowing = isTop ? parentViewportDistance <= elementOffset.bottom.fromTop : parentViewportDistance >= elementOffset.top.fromBottom;
if ( isNeedFollowing ) {
followParent();
}
}
};
var checkEffectsPoint = function( distanceFromTriggerPoint ) {
if ( isReachedEffectsPoint && -distanceFromTriggerPoint < settings.effectsOffset ) {
$element.removeClass( settings.classes.stickyEffects );
isReachedEffectsPoint = false;
} else if ( ! isReachedEffectsPoint && -distanceFromTriggerPoint >= settings.effectsOffset ) {
$element.addClass( settings.classes.stickyEffects );
isReachedEffectsPoint = true;
}
};
var checkPosition = function() {
var offset = settings.offset,
distanceFromTriggerPoint;
if ( isSticky ) {
var spacerViewportOffset = getElementViewportOffset( elements.$spacer );
distanceFromTriggerPoint = 'top' === settings.to ? spacerViewportOffset.top.fromTop - offset : -spacerViewportOffset.bottom.fromBottom - offset;
if ( settings.parent ) {
checkParent();
}
if ( distanceFromTriggerPoint > 0 ) {
unstick();
}
} else {
var elementViewportOffset = getElementViewportOffset( $element );
distanceFromTriggerPoint = 'top' === settings.to ? elementViewportOffset.top.fromTop - offset : -elementViewportOffset.bottom.fromBottom - offset;
if ( distanceFromTriggerPoint <= 0 ) {
stick();
if ( settings.parent ) {
checkParent();
}
}
}
checkEffectsPoint( distanceFromTriggerPoint );
};
var onWindowScroll = function() {
checkPosition();
};
var onWindowResize = function() {
if ( ! isSticky ) {
return;
}
unstickElement();
removeSpacer();
updateElementSizesData();
addSpacer();
stickElement();
if ( settings.parent ) {
// Force recalculation of the relation between the element and its parent.
isFollowingParent = false;
checkParent();
}
};
this.destroy = function() {
if ( isSticky ) {
unstick();
}
unbindEvents();
$element.removeClass( settings.classes.sticky );
};
init();
};
$.fn.sticky = function( settings ) {
var isCommand = 'string' === typeof settings;
this.each( function() {
var $this = $( this );
if ( ! isCommand ) {
$this.data( 'sticky', new Sticky( this, settings ) );
return;
}
var instance = $this.data( 'sticky' );
if ( ! instance ) {
throw Error( 'Trying to perform the `' + settings + '` method prior to initialization' );
}
if ( ! instance[ settings ] ) {
throw ReferenceError( 'Method `' + settings + '` not found in sticky instance' );
}
instance[ settings ].apply( instance, Array.prototype.slice.call( arguments, 1 ) );
if ( 'destroy' === settings ) {
$this.removeData( 'sticky' );
}
} );
return this;
};
window.Sticky = Sticky;
} )( jQuery );
Elevate your living space with these stunning handmade Lipan art pieces — a perfect blend of traditional craftsmanship and modern elegance. Inspired by the rich artistic heritage of Kutch, Gujarat, this wall décor set is meticulously crafted on 7mm MDF boards using clay work and embedded mirror designs.
Product Details:
Design Type:
Traditional Mandala-style Lipan Art with intricate geometric & floral patterns and mirror work detailing.
Material:
•Base: Premium quality 7mm MDF board
•Artwork: White clay & mirror work
•Finish: Smooth matte acrylic paint with protective varnish coating
Size : 20 inches diameter
Features:
Lightweight & ready to hang with sturdy hooks
•Eco-friendly and made with non-toxic materials
•Adds a spiritual and aesthetic vibe to living rooms, hallways, or meditation spaces
Product Details:
Design Type:
Traditional Mandala-style Lipan Art with intricate geometric & floral patterns and mirror work detailing.
Material:
•Base: Premium quality 7mm MDF board
•Artwork: White clay & mirror work
•Finish: Smooth matte acrylic paint with protective varnish coating
Size : Each panel 10 x 16 inches
2 panels
Features:
•Lightweight & ready to hang with sturdy hooks
•Eco-friendly and made with non-toxic materials
•Adds a spiritual and aesthetic vibe to living rooms, hallways, or meditation spaces
Elevate your living space with these stunning handmade Lipan art pieces — a perfect blend of traditional craftsmanship and modern elegance. Inspired by the rich artistic heritage of Kutch, Gujarat, this wall décor set is meticulously crafted on 7mm MDF boards using clay work and embedded mirror designs.
Product Details:
Design Type:
Traditional Mandala-style Lipan Art with intricate geometric & floral patterns and mirror work detailing.
Material:
•Base: Premium quality 7mm MDF board
•Artwork: White clay & mirror work
•Finish: Smooth matte acrylic paint with protective varnish coating
Size:10 x 20 inches
Usage:
•Ideal for gifting on festive occasions
•Perfect for home, studio, or gallery décor
•A captivating statement piece for your walls
Elevate your living space with these stunning handmade Lipan art pieces — a perfect blend of traditional craftsmanship and modern elegance. Inspired by the rich artistic heritage of Kutch, Gujarat, this wall décor set is meticulously crafted on 7mm MDF boards using clay work and embedded mirror designs.
Traditional Mandala-style Lipan Art with intricate geometric & floral patterns and mirror work detailing.
Material:
•Base: Premium quality 7mm MDF board
•Artwork: White clay & mirror work
•Finish: Smooth matte acrylic paint with protective varnish coating
Color Palette:
•Shades of Teal, Ocean Blue, Deep Maroon, and Natural Wood
•Highlights in White Clay and Reflective Glass Mirrors
Size:24x 24inches
Usage:
•Ideal for gifting on festive occasions
•Perfect for home, studio, or gallery décor
•A captivating statement piece for your walls
Lipan art | Dreamcatcher wall hanging | Mud mirror art | Mandala wall décor | Ethnic handmade décor | Boho wall hanging | Gujarati art | Traditional home décor
]]>Add a touch of timeless tradition and vibrant artistry to your home with these exquisite Lipan Art Dreamcatchers, beautifully blending the cultural heritage of Gujarat’s Lippan Kaam (mud mirror work) with the elegance of contemporary décor.
Material & Finish:
•Made on a premium MDF base
•Adorned with tiny decorative mirrors
•Painted with vibrant acrylic colors
•Sealed with a protective glossy coat for longevity
White Floral Pattern with elegant tassels – minimalist and serene.
]]>Add a touch of timeless tradition and vibrant artistry to your home with these exquisite Lipan Art Dreamcatchers, beautifully blending the cultural heritage of Gujarat’s Lippan Kaam with the elegance of contemporary décor.
Material & Finish:
•Made on a premium MDF base
•Adorned with tiny decorative mirrors
•Painted with vibrant acrylic colors
•Sealed with a protective glossy coat for longevity
Rainbow Theme with colorful wool tassels – vibrant and joyful
]]>Add a touch of timeless tradition and vibrant artistry to your home with these exquisite Lipan Art Dreamcatchers, beautifully blending the cultural heritage of Gujarat’s Lippan Kaam with the elegance of contemporary décor.
2. Material & Finish:
• Made on a premium MDF base
• Adorned with tiny decorative mirrors
• Painted with vibrant acrylic colors
• Sealed with a protective glossy coat for longevity
Peacock Motif with feather-inspired hangings – rich and regal.
Add a touch of timeless tradition and vibrant artistry to your home with these exquisite Lipan Art Dreamcatchers, beautifully blending the cultural heritage of Gujarat’s Lippan Kaam with the elegance of contemporary décor.
]]>Made by : Happy Handz
Materials: epoxy resin, sand, stones
Size : 18 inch
Radiant Seascape – Glowing Wave Epoxy Resin Artwork.
Immerse yourself in the enchanting glow of the ocean with our captivating wall decor.
This mesmerizing seascape painting, elegantly framed in minimalist black, features luminous ocean waves and a sandy shore crafted from radiant quartz sand and dragonstone fragments, resembling fossilized clay formations. Inspired by the luminous beaches of the Maldives, where bioluminescent plankton creates an otherworldly glow at night, our artwork brings that magical essence into your home.
Crafted with a luminous pigment based on aluminum oxide, the ocean wave illuminates in darkness, casting a spellbinding glow. Rest assured, our artwork is non-toxic and completely safe.
Materials: Epoxy resin, luminous pigment, quartz sand, dragonstone fragments
Care Instructions:
Preserve the luminous effect by keeping your artwork away from direct sunlight, as UV radiation may diminish its glow. Our non-toxic composition ensures peace of mind for all.
Equipped with a built-in mount, effortlessly hang your artwork on the wall or display it on a shelf. Let the radiance of the glowing ocean wave transform your space into a serene haven of beauty and wonder.
Illuminate your surroundings with the captivating allure of our radiant seascape. Bring home your own masterpiece today.
ORDER PRODUCTION TIME: 10-15 days.
DELIVERY TIME: 1 weeks.
If you could give me a positive feedback, I would appreciate it. Do not hesitate to contact me in case of any questions. For custom orders please message the shop owner (me 
Thank you for your time.
Sincerely,
your – Happy Handz