.fdm-box {
	--fdm-c1: #1d3557;
	--fdm-c2: #e63946;
	font-weight: 600;
	line-height: 1.35;
	opacity: 0;
	transition: opacity .7s ease, transform .7s ease, filter .7s ease, letter-spacing .7s ease;
}
.fdm-box.fdm-in { opacity: 1; }
.fdm-box .fdm-text { display: inline-block; color: var(--fdm-c1); }
.fdm-w { display: inline-block; white-space: nowrap; }

/* 1. Slide */
.fdm-fx-slide { transform: translateY(40px); }
.fdm-fx-slide.fdm-in { transform: none; }

/* 2. Zoom */
.fdm-fx-zoom { transform: scale(.6); }
.fdm-fx-zoom.fdm-in { transform: none; }

/* 3. Blur reveal */
.fdm-fx-blur { filter: blur(14px); letter-spacing: .25em; transition: opacity 1.2s ease, filter 1.2s ease, letter-spacing 1.4s ease; }
.fdm-fx-blur.fdm-in { filter: none; letter-spacing: normal; }

/* 4. Macchina da scrivere */
.fdm-fx-typewriter .fdm-ch { opacity: 0; }
.fdm-fx-typewriter.fdm-in .fdm-ch { animation: fdm-show .01s forwards; animation-delay: calc(var(--i) * 45ms + .4s); }
.fdm-fx-typewriter .fdm-text::after {
	content: ""; display: inline-block; width: 2px; height: 1em; margin-left: 4px;
	background: var(--fdm-c2); vertical-align: -.12em; animation: fdm-blink 1s steps(1) infinite;
}
@keyframes fdm-show { to { opacity: 1; } }
@keyframes fdm-blink { 50% { opacity: 0; } }

/* 5. Onda */
.fdm-fx-wave .fdm-ch { display: inline-block; }
.fdm-fx-wave.fdm-in .fdm-ch { animation: fdm-wave 2.2s ease-in-out infinite; animation-delay: calc(var(--i) * 70ms); }
@keyframes fdm-wave {
	0%, 60%, 100% { transform: none; color: inherit; }
	30% { transform: translateY(-.35em); color: var(--fdm-c2); }
}

/* 6. Parola per parola */
.fdm-fx-words .fdm-wd { display: inline-block; opacity: 0; transform: translateY(24px); }
.fdm-fx-words.fdm-in .fdm-wd { animation: fdm-word .7s ease forwards; animation-delay: calc(var(--i) * 260ms); }
@keyframes fdm-word { to { opacity: 1; transform: none; } }

/* 7. Gradiente animato */
.fdm-fx-gradient .fdm-text {
	background: linear-gradient(90deg, var(--fdm-c1), var(--fdm-c2), var(--fdm-c1));
	background-size: 200% auto;
	-webkit-background-clip: text; background-clip: text;
	-webkit-text-fill-color: transparent; color: transparent;
	animation: fdm-grad 4s linear infinite;
}
@keyframes fdm-grad { to { background-position: 200% center; } }

/* 8. Neon */
.fdm-fx-neon .fdm-text {
	color: var(--fdm-c1);
	animation: fdm-neon 2s ease-in-out infinite alternate;
}
@keyframes fdm-neon {
	from { text-shadow: 0 0 4px var(--fdm-c2), 0 0 10px var(--fdm-c2); }
	to   { text-shadow: 0 0 8px var(--fdm-c2), 0 0 22px var(--fdm-c2), 0 0 44px var(--fdm-c2), 0 0 70px var(--fdm-c2); }
}

/* 9. Shimmer */
.fdm-fx-shimmer .fdm-text {
	background: linear-gradient(110deg, var(--fdm-c1) 38%, var(--fdm-c2) 50%, var(--fdm-c1) 62%);
	background-size: 250% 100%;
	-webkit-background-clip: text; background-clip: text;
	-webkit-text-fill-color: transparent; color: transparent;
	animation: fdm-shimmer 2.8s linear infinite;
}
@keyframes fdm-shimmer { from { background-position: 150% 0; } to { background-position: -100% 0; } }

/* Effetti di uscita */
.fdm-box.fdm-in.fdm-out-fade { opacity: 0; }
.fdm-box.fdm-in.fdm-out-up   { opacity: 0; transform: translateY(-40px); }
.fdm-box.fdm-in.fdm-out-blur { opacity: 0; filter: blur(12px); }

/* Accessibilità: niente animazioni per chi le ha disattivate */
@media (prefers-reduced-motion: reduce) {
	.fdm-box, .fdm-box * { animation: none !important; transition: opacity .3s ease !important; }
	.fdm-box { transform: none !important; filter: none !important; letter-spacing: normal !important; }
	.fdm-fx-typewriter .fdm-ch, .fdm-fx-words .fdm-wd { opacity: 1 !important; transform: none !important; }
}
