/*!
 * TS Motion FX for Elementor — frontend styles
 * Hover effects, scroll-reveal animations, preloader, custom cursor.
 */

/* -------------------------------------------------------------------- */
/* Hover effects                                                        */
/* -------------------------------------------------------------------- */

.tsmfx-hover {
	--tsmfx-hover-duration: 400ms;
	--tsmfx-hover-easing: ease;
	--tsmfx-overlay-color: rgba(15, 15, 15, 0.45);
}

/* Zoom in / out on the first image inside the element */
.tsmfx-hover-zoom-in,
.tsmfx-hover-zoom-out {
	overflow: hidden;
}
.tsmfx-hover-zoom-in img,
.tsmfx-hover-zoom-out img {
	transition: transform var(--tsmfx-hover-duration) var(--tsmfx-hover-easing);
	will-change: transform;
}
.tsmfx-hover-zoom-in:hover img {
	transform: scale(1.08) !important;
}
.tsmfx-hover-zoom-out img {
	transform: scale(1.08);
}
.tsmfx-hover-zoom-out:hover img {
	transform: scale(1) !important;
}

/* Lift & shadow */
.tsmfx-hover-lift {
	transition: transform var(--tsmfx-hover-duration) var(--tsmfx-hover-easing),
		box-shadow var(--tsmfx-hover-duration) var(--tsmfx-hover-easing);
}
.tsmfx-hover-lift:hover {
	transform: translateY(-10px);
	box-shadow: 0 24px 48px -12px rgba(0, 0, 0, 0.25);
}

/* Overlay fade / slide (pseudo-element, no markup changes required) */
.tsmfx-hover-overlay-fade,
.tsmfx-hover-overlay-slide {
	position: relative;
	overflow: hidden;
}
.tsmfx-hover-overlay-fade::after,
.tsmfx-hover-overlay-slide::after {
	content: "";
	position: absolute;
	inset: 0;
	background: var(--tsmfx-overlay-color);
	pointer-events: none;
	z-index: 1;
}
.tsmfx-hover-overlay-fade::after {
	opacity: 0;
	transition: opacity var(--tsmfx-hover-duration) var(--tsmfx-hover-easing);
}
.tsmfx-hover-overlay-fade:hover::after {
	opacity: 1;
}
.tsmfx-hover-overlay-slide::after {
	transform: translateY(100%);
	transition: transform var(--tsmfx-hover-duration) var(--tsmfx-hover-easing);
}
.tsmfx-hover-overlay-slide:hover::after {
	transform: translateY(0);
}

/* Underline draw — best on text/links/buttons */
.tsmfx-hover-underline {
	position: relative;
	display: inline-block;
}
.tsmfx-hover-underline::after {
	content: "";
	position: absolute;
	left: 0;
	bottom: -0.15em;
	width: 100%;
	height: 2px;
	background: currentColor;
	transform: scaleX(0);
	transform-origin: right;
	transition: transform var(--tsmfx-hover-duration) var(--tsmfx-hover-easing);
}
.tsmfx-hover-underline:hover::after {
	transform: scaleX(1);
	transform-origin: left;
}

/* Dynamic tilt — base CSS transition; JS supplies live rotateX/Y via inline style */
.tsmfx-hover-tilt {
	transition: transform var(--tsmfx-hover-duration) var(--tsmfx-hover-easing);
	transform-style: preserve-3d;
	will-change: transform;
}

/* Grayscale to color */
.tsmfx-hover-grayscale img {
	filter: grayscale(100%);
	transition: filter var(--tsmfx-hover-duration) var(--tsmfx-hover-easing);
}
.tsmfx-hover-grayscale:hover img {
	filter: grayscale(0%) !important;
}

/* Brighten */
.tsmfx-hover-brightness img {
	transition: filter var(--tsmfx-hover-duration) var(--tsmfx-hover-easing);
}
.tsmfx-hover-brightness:hover img {
	filter: brightness(1.12) saturate(1.05) !important;
}

/* -------------------------------------------------------------------- */
/* Scroll-triggered reveal animations                                   */
/* -------------------------------------------------------------------- */

.tsmfx-scroll-init {
	--tsmfx-duration: 800ms;
	--tsmfx-delay: 0ms;
	--tsmfx-distance: 40px;
	--tsmfx-easing: cubic-bezier(0.16, 1, 0.3, 1);
}

.tsmfx-scroll-init[data-tsmfx-type="fade-up"],
.tsmfx-scroll-init[data-tsmfx-type="fade-down"],
.tsmfx-scroll-init[data-tsmfx-type="fade-left"],
.tsmfx-scroll-init[data-tsmfx-type="fade-right"],
.tsmfx-scroll-init[data-tsmfx-type="zoom-in"],
.tsmfx-scroll-init[data-tsmfx-type="zoom-out"] {
	opacity: 0;
	transition: opacity var(--tsmfx-duration) var(--tsmfx-easing) var(--tsmfx-delay),
		transform var(--tsmfx-duration) var(--tsmfx-easing) var(--tsmfx-delay);
}

.tsmfx-scroll-init[data-tsmfx-type="fade-up"] { transform: translateY(var(--tsmfx-distance)); }
.tsmfx-scroll-init[data-tsmfx-type="fade-down"] { transform: translateY(calc(var(--tsmfx-distance) * -1)); }
.tsmfx-scroll-init[data-tsmfx-type="fade-left"] { transform: translateX(var(--tsmfx-distance)); }
.tsmfx-scroll-init[data-tsmfx-type="fade-right"] { transform: translateX(calc(var(--tsmfx-distance) * -1)); }
.tsmfx-scroll-init[data-tsmfx-type="zoom-in"] { transform: scale(0.92); }
.tsmfx-scroll-init[data-tsmfx-type="zoom-out"] { transform: scale(1.08); }

.tsmfx-scroll-init.tsmfx-in-view[data-tsmfx-type="fade-up"],
.tsmfx-scroll-init.tsmfx-in-view[data-tsmfx-type="fade-down"],
.tsmfx-scroll-init.tsmfx-in-view[data-tsmfx-type="fade-left"],
.tsmfx-scroll-init.tsmfx-in-view[data-tsmfx-type="fade-right"] {
	opacity: 1;
	transform: translate(0, 0);
}
.tsmfx-scroll-init.tsmfx-in-view[data-tsmfx-type="zoom-in"],
.tsmfx-scroll-init.tsmfx-in-view[data-tsmfx-type="zoom-out"] {
	opacity: 1;
	transform: scale(1);
}

/* Mask reveal up — wraps content visually with overflow-hidden + inner slide */
.tsmfx-scroll-init[data-tsmfx-type="mask-up"] {
	overflow: hidden;
}
.tsmfx-scroll-init[data-tsmfx-type="mask-up"] > .elementor-widget-container,
.tsmfx-scroll-init[data-tsmfx-type="mask-up"].elementor-widget-container {
	transition: transform var(--tsmfx-duration) var(--tsmfx-easing) var(--tsmfx-delay),
		opacity var(--tsmfx-duration) var(--tsmfx-easing) var(--tsmfx-delay);
	transform: translateY(100%);
	opacity: 0;
}
.tsmfx-scroll-init.tsmfx-in-view[data-tsmfx-type="mask-up"] > .elementor-widget-container,
.tsmfx-scroll-init.tsmfx-in-view[data-tsmfx-type="mask-up"].elementor-widget-container {
	transform: translateY(0);
	opacity: 1;
}

/* Stagger: direct children get their own reveal state, driven by JS-assigned
   inline transition-delay + the parent's [data-tsmfx-stagger] toggling class */
.tsmfx-scroll-init[data-tsmfx-stagger="true"] > .elementor-element {
	opacity: 0;
	transform: translateY(var(--tsmfx-distance, 30px));
	transition: opacity var(--tsmfx-duration) var(--tsmfx-easing),
		transform var(--tsmfx-duration) var(--tsmfx-easing);
}
.tsmfx-scroll-init.tsmfx-in-view[data-tsmfx-stagger="true"] > .elementor-element {
	opacity: 1;
	transform: translate(0, 0);
}

/* Text reveal (word by word) */
.tsmfx-text-reveal-word-wrap {
	display: inline-block;
	overflow: hidden;
	vertical-align: top;
}
.tsmfx-text-reveal-word {
	display: inline-block;
	transform: translateY(110%);
	transition: transform var(--tsmfx-duration) var(--tsmfx-easing);
	will-change: transform;
}
.tsmfx-scroll-init.tsmfx-in-view .tsmfx-text-reveal-word {
	transform: translateY(0);
}

/* -------------------------------------------------------------------- */
/* Preloader                                                            */
/* -------------------------------------------------------------------- */

.tsmfx-preloader {
	position: fixed;
	inset: 0;
	z-index: 999999;
	display: flex;
	align-items: center;
	justify-content: center;
	background: var(--tsmfx-preloader-bg, #fff);
	transition: opacity 500ms ease, visibility 500ms ease;
}
.tsmfx-preloader.tsmfx-preloader-hidden {
	opacity: 0;
	visibility: hidden;
	pointer-events: none;
}

.tsmfx-preloader-logo {
	max-width: 140px;
	max-height: 140px;
	display: block;
	margin: 0 auto 20px;
}

.tsmfx-preloader-spinner {
	display: block;
	width: 36px;
	height: 36px;
	margin: 0 auto;
	border-radius: 50%;
	border: 2px solid rgba(0, 0, 0, 0.15);
	border: 2px solid color-mix(in srgb, var(--tsmfx-preloader-accent, #111) 20%, transparent);
	border-top-color: var(--tsmfx-preloader-accent, #111);
	animation: tsmfx-spin 800ms linear infinite;
}

@keyframes tsmfx-spin {
	to { transform: rotate(360deg); }
}

/* Curtain style: two panels that slide apart */
.tsmfx-preloader-curtain {
	background: transparent;
	pointer-events: none;
}
.tsmfx-preloader-panel {
	position: fixed;
	top: 0;
	bottom: 0;
	width: 50%;
	background: var(--tsmfx-preloader-bg, #fff);
	transition: transform 700ms cubic-bezier(0.83, 0, 0.17, 1);
}
.tsmfx-preloader-panel-left { left: 0; }
.tsmfx-preloader-panel-right { right: 0; }
.tsmfx-preloader-curtain.tsmfx-preloader-hidden .tsmfx-preloader-panel-left {
	transform: translateX(-100%);
}
.tsmfx-preloader-curtain.tsmfx-preloader-hidden .tsmfx-preloader-panel-right {
	transform: translateX(100%);
}

/* -------------------------------------------------------------------- */
/* Custom cursor                                                        */
/* -------------------------------------------------------------------- */

#tsmfx-cursor {
	position: fixed;
	top: 0;
	left: 0;
	width: 14px;
	height: 14px;
	margin: -7px 0 0 -7px;
	border-radius: 50%;
	background: currentColor;
	color: #111;
	pointer-events: none;
	z-index: 999998;
	opacity: 0;
	mix-blend-mode: difference;
	transition: opacity 200ms ease, width 250ms ease, height 250ms ease, margin 250ms ease;
}
#tsmfx-cursor.tsmfx-cursor-visible {
	opacity: 1;
}
#tsmfx-cursor.tsmfx-cursor-hover {
	width: 44px;
	height: 44px;
	margin: -22px 0 0 -22px;
	background: rgba(255, 255, 255, 0.9);
	mix-blend-mode: difference;
}

/* -------------------------------------------------------------------- */
/* Reduced motion override                                              */
/* -------------------------------------------------------------------- */

html.tsmfx-reduced-motion .tsmfx-scroll-init,
html.tsmfx-reduced-motion .tsmfx-scroll-init[data-tsmfx-stagger="true"] > .elementor-element,
html.tsmfx-reduced-motion .tsmfx-text-reveal-word,
html.tsmfx-reduced-motion .tsmfx-hover,
html.tsmfx-reduced-motion .tsmfx-hover * {
	transition-duration: 1ms !important;
	animation-duration: 1ms !important;
}
html.tsmfx-reduced-motion .tsmfx-scroll-init,
html.tsmfx-reduced-motion .tsmfx-scroll-init > .elementor-widget-container,
html.tsmfx-reduced-motion .tsmfx-scroll-init[data-tsmfx-stagger="true"] > .elementor-element,
html.tsmfx-reduced-motion .tsmfx-text-reveal-word {
	opacity: 1 !important;
	transform: none !important;
}
html.tsmfx-reduced-motion #tsmfx-cursor,
html.tsmfx-reduced-motion .tsmfx-preloader {
	display: none !important;
}
