/* * 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 ); Men – Garokik https://garokik.com Fri, 05 Sep 2025 08:40:01 +0000 en-US hourly 1 https://garokik.com/wp-content/uploads/2025/07/cropped-garokik_favicon_1-32x32.png Men – Garokik https://garokik.com 32 32 Handmade Wax Air Freshener | Fragrance wax Sachets | Wax Tablet https://garokik.com/product/handmade-wax-air-freshener-fragrance-wax-sachets-wax-tablet-2/ https://garokik.com/product/handmade-wax-air-freshener-fragrance-wax-sachets-wax-tablet-2/#respond Sat, 02 Aug 2025 10:41:10 +0000 https://garokik.com/product/handmade-wax-air-freshener-fragrance-wax-sachets-wax-tablet-2/ Handmade Wax Wardrobe Air Freshener Bar Aromatherapy Wardrobe Fragrance Sachets Wax Tablet for Drawers, Shoe Rack (set of 3 - Lavender Fragrance)

]]>
ELEVATE YOUR AMBIENCE WITH NATURAL FRAGRANCE – Transform any space into a serene haven with the calming, all-natural fragrances of the Hello Handmade Wax Wardrobe Air Freshener Bars. Crafted from premium, eco-friendly materials, these wax tablets scented release a gentle, long-lasting aroma that naturally elevates your home’s ambiance. Whether you’re unwinding after a long day or setting a relaxing atmosphere for guests, the scents of Macaron Almond, Orange Cinnamon, and Lavender create a peaceful, welcoming environment that refreshes and soothes.
Convenient and mess-free: No need for sprays or liquids—simply place the wax tablet in your desired location and let the fragrance unfold.
Thoughtful gift: Share the gift of luxurious fragrance with friends and loved ones, perfect for any occasion.

]]>
https://garokik.com/product/handmade-wax-air-freshener-fragrance-wax-sachets-wax-tablet-2/feed/ 0
Home Decor | wall decor | Lipan Art | Mirror Art https://garokik.com/product/home-decor-wall-decor-lipan-art-mirror-art-2/ https://garokik.com/product/home-decor-wall-decor-lipan-art-mirror-art-2/#respond Wed, 16 Jul 2025 12:30:51 +0000 https://garokik.com/product/home-decor-wall-decor-lipan-art-mirror-art-2/ Handcrafted Lipan Art Wall Hanging | Traditional Kutch Mirror Work Décor | Mandala Design on MDF | Ethnic Clay Art Panel for Home & Office | Ready to Hang

]]>
Handcrafted Lipan-Mirror Art Wall Décor

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

]]>
https://garokik.com/product/home-decor-wall-decor-lipan-art-mirror-art-2/feed/ 0
Mysticoal Analog 30 cm X 30 cm Wall Clock https://garokik.com/product/mysticoal-analog-30-cm-x-30-cm-wall-clock/ https://garokik.com/product/mysticoal-analog-30-cm-x-30-cm-wall-clock/#respond Sun, 06 Jul 2025 04:39:03 +0000 https://garokik.com/?post_type=product&p=384 Self-adhesive

This wall clock has a self-adhesive backing, making it easy to hang without the use of nails or hooks. The clock components have an adhesive backing, so you can easily peel off a paper layer and fix them to the wall. This means you won’t have to deal with intricate installations or drill holes in your walls, making for a simple and clean operation.

]]>
https://garokik.com/product/mysticoal-analog-30-cm-x-30-cm-wall-clock/feed/ 0
TAPUJI Dancing Cactus https://garokik.com/product/tapuji-dancing-cactus/ https://garokik.com/product/tapuji-dancing-cactus/#respond Sun, 06 Jul 2025 04:27:08 +0000 https://garokik.com/?post_type=product&p=378

]]>
  • USB Charging Dancing Talking Cactus Toy For Kids 120 Songs Wiggle Recording &Singing Musical Toy With Colourful Lights Education Toys for Babies with LED Light for Home Decor
  • Unique Design: This indoor plant features colourful ceramic catcus with movable arms that dance in the breeze.
  • Decor Accent: Adds a fun element to any room with its quirky dancing motions. Sure to spark smiles and conversations.
  • Safe for Home: Non-toxic and pet-friendly for safe display around kids and pets. Stands about 15 cm tall
  • Gift Idea: Makes for an unconventional yet charming gift option for plant or cat lovers. Presented ready to brighten up any space.
  • Unique Design: This indoor plant features colourful ceramic catcus with movable arms that dance in the breeze.
]]>
https://garokik.com/product/tapuji-dancing-cactus/feed/ 0