/**
 * GOXA Consent Manager — canonical Motion Contract.
 * One source owns mode, axis, duration and easing for every consent surface:
 * banner, Preference Center, privacy trigger entrance and trigger preview.
 */
:root {
	--goxa-cm-motion-duration: 1800ms;
	--goxa-cm-motion-ease: cubic-bezier(.22, 1, .36, 1);
}

/* Enter / exit primitive -------------------------------------------------- */
.goxa-cm-motion-entering,
.goxa-cm-motion-exiting {
	animation-duration: var(--goxa-cm-motion-duration, 1800ms);
	animation-timing-function: var(--goxa-cm-motion-ease, cubic-bezier(.22, 1, .36, 1));
	animation-fill-mode: both;
}
.goxa-cm-motion-exiting { animation-direction: reverse; }

.goxa-cm-motion--fade.goxa-cm-motion-entering,
.goxa-cm-motion--fade.goxa-cm-motion-exiting { animation-name: goxa-cm-motion-fade; }
.goxa-cm-motion--scale.goxa-cm-motion-entering,
.goxa-cm-motion--scale.goxa-cm-motion-exiting { animation-name: goxa-cm-motion-scale; }
.goxa-cm-motion--slide.goxa-cm-motion-entering,
.goxa-cm-motion--slide.goxa-cm-motion-exiting { animation-name: goxa-cm-motion-slide; }
.goxa-cm-motion--none.goxa-cm-motion-entering,
.goxa-cm-motion--none.goxa-cm-motion-exiting { animation: none; }

@keyframes goxa-cm-motion-fade {
	from { opacity: 0; }
	to { opacity: 1; }
}
@keyframes goxa-cm-motion-scale {
	from {
		opacity: 0;
		scale: var(--goxa-cm-motion-scale-from, .96);
		translate: var(--goxa-cm-motion-x, 0) var(--goxa-cm-motion-scale-y, 10px);
	}
	to { opacity: 1; scale: 1; translate: 0 0; }
}
@keyframes goxa-cm-motion-slide {
	from {
		opacity: var(--goxa-cm-motion-slide-opacity, .58);
		translate: var(--goxa-cm-motion-x, 0) var(--goxa-cm-motion-y, calc(100% + 34px));
	}
	to { opacity: 1; translate: 0 0; }
}

/* Expand / collapse primitive -------------------------------------------
 * Used by controls that reveal a secondary surface while staying mounted.
 * Geometry belongs to the component; motion semantics live here.
 */
.goxa-cm-motion-preview {
	opacity: 0;
	translate: 0 0;
	scale: 1;
	pointer-events: none;
	transition-property: opacity, translate, scale;
	transition-duration: var(--goxa-cm-motion-duration, 1800ms);
	transition-timing-function: var(--goxa-cm-motion-ease, cubic-bezier(.22, 1, .36, 1));
}
.goxa-cm-motion--fade .goxa-cm-motion-preview {
	opacity: 0;
	translate: 0 0;
	scale: 1;
}
.goxa-cm-motion--scale .goxa-cm-motion-preview {
	opacity: 0;
	translate: var(--goxa-cm-motion-preview-x, 0) var(--goxa-cm-motion-preview-scale-y, 8px);
	scale: var(--goxa-cm-motion-preview-scale-from, .94);
}
.goxa-cm-motion--slide .goxa-cm-motion-preview {
	/* Slide is pure spatial movement/reveal. Opacity must stay stable so a slow
	 * collapse never reads as a fade. Component geometry decides how it hides. */
	opacity: 1;
	translate: var(--goxa-cm-motion-preview-x, 0) var(--goxa-cm-motion-preview-y, 14px);
	scale: 1;
}
.goxa-cm-motion--none .goxa-cm-motion-preview {
	transition: none;
	opacity: 0;
	translate: 0 0;
	scale: 1;
}
.goxa-cm-motion-preview-host.is-expanded .goxa-cm-motion-preview {
	opacity: 1;
	translate: 0 0;
	scale: 1;
	pointer-events: auto;
}

@media (prefers-reduced-motion: reduce) {
	.goxa-cm-motion-entering,
	.goxa-cm-motion-exiting {
		animation: none !important;
		opacity: 1 !important;
		translate: 0 0 !important;
		scale: 1 !important;
	}
	.goxa-cm-motion-preview {
		transition: none !important;
	}
}
