/**
 * GOXA Consent Manager — canonical Motion Contract.
 * One source owns mode, axis, duration and easing for every consent surface:
 * banner and Preference Center.
 */
:root {
	--goxa-cm-motion-duration: 1800ms;
	--goxa-cm-motion-exit-duration: 1200ms;
	--goxa-cm-motion-preview-duration: 1800ms;
	--goxa-cm-motion-handoff-duration: 180ms;
	--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;
	animation-duration: var(--goxa-cm-motion-exit-duration, 1200ms);
}
.goxa-cm-motion-entering,
.goxa-cm-motion-exiting { will-change: opacity, translate, scale; }

.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-preview-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;
}

/* Surface handoff: banner yields to Preference Center without replaying its full exit. */
.goxa-cm-handoff-out {
	animation: goxa-cm-motion-handoff-out var(--goxa-cm-motion-handoff-duration, 180ms) ease-out both !important;
	will-change: opacity;
}
@keyframes goxa-cm-motion-handoff-out { from { opacity: 1; } to { opacity: 0; } }

@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;
	}
}
