<div class="no-support" data-support="css-animation-composition"><p>🚨 Your browser does not support CSS <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/animation-composition" target="_top"><code>animation-composition</code></a>. Therefore, this demo will not work properly. Please try Chrome 112, Firefox Nightly, or Safari 16.</p></div>

<main>
	<div class="box" data-method="replace">replace</div>
	<div class="box" data-method="add">add</div>
	<div class="box" data-method="accumulate">accumulate</div>
</main>

<footer>
	<p>Demo for <a href="https://developer.chrome.com/articles/css-animation-composition" target="_top">https://developer.chrome.com/articles/css-animation-composition</a></p>
</footer>
.box {
	display: block;
	width: 5em;
	aspect-ratio: 1;
	display: grid;
	position: relative;

	place-content: center;
	outline: 1px dashed #333;
	margin: 0 auto;
}

.box::after, .box::before {
	content: '';
	display: block;
	width: 5em;
	aspect-ratio: 1;
	position: absolute;
	
	transform-origin: 50% 50%;
	transform: translateX(50px) rotate(45deg);
	z-index: -1; /* Make sure text is on top */
}

.box::after {
	background: lightseagreen;
	animation: adjust 5s linear infinite alternate;
}

.box::before {
	background: #ccc;
}

@keyframes adjust {
	to {
		transform: translateX(100px);
	}
}

.box[data-method="replace"]::after {
	animation-composition: replace;
}

.box[data-method="add"]::after {
	animation-composition: add;
}

.box[data-method="accumulate"]::after {
	animation-composition: accumulate;
}

main {
	display: grid;
	place-content: center;
	gap: 5em;
}

/* Non-demo styles below */
@layer base {
	@layer reset {
		* {
			box-sizing: border-box;
		}
		body {
			margin: 0;
			padding: 0;
		}
		html, body {
			height: 100%;
		}
	}
	@layer layout {
		html {
			max-width: 84ch;
			padding: 3rem 2rem;
			margin: auto;
		}

		html {
			--font-sans: system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif;
			--font-serif: ui-serif,serif;
			--font-mono: Dank Mono,Operator Mono,Inconsolata,Fira Mono,ui-monospace,SF Mono,Monaco,Droid Sans Mono,Source Code Pro,monospace;
		}
		body {
			font-family: var(--font-sans);
		}
		pre, code {
			font-family: var(--font-mono);
		}
		
		body {
			display: grid;
			place-content: safe center;
			gap: 3rem;
		}

		a,
		a:visited {
			color: blue;
		}
		
		h2 {
			margin-top: 2em;
		}

		summary {
			cursor: pointer;
		}

		dd + dt {
			margin-top: 0.5em;
		}

		button {
			cursor: pointer;
		}
		
		footer {
			text-align: center;
			font-style: italic;
		}
	}

	@layer support {
		.no-support,
		.has-support {
			margin: 1em 0;
			padding: 1em;
			border: 1px solid #ccc;
		}

		.no-support {
			background-color: #ff00002b;
		}
		.no-support[data-level="warn"] {
			background-color: #ffff002b;
		}
		.has-support {
			background-color: #00ff002b;
		}
		.no-support, [data-show-when-no-support] {
			display: block !important;
		}
		.has-support, [data-show-when-has-support] {
			display: none !important;
		}
		:is(.has-support, .no-support) > :first-child {
			margin-top: 0;
		}
		:is(.has-support, .no-support) > :last-child {
			margin-bottom: 0;
		}
		
		@property --supports-at-property {
			syntax: "*";
			initial-value: ;
			inherits: true;
		}
		.no-support[data-support="at-property"], [data-no-support="at-property"] {
			--value-when-supported: var(--supports-at-property) none;
			--value-when-not-supported: block;
			display: var(--value-when-supported, var(--value-when-not-supported)) !important;
		}
		.has-support[data-support="at-property"], [data-has-support="at-property"] {
			--value-when-supported: var(--supports-at-property) block;
			--value-when-not-supported: none;
			display: var(--value-when-supported, var(--value-when-not-supported)) !important;
		}

		@supports (transform: scaleX(cos(360deg))) {
			.no-support[data-support="css-trig-fns"] {
				display: none !important;
			}
			.has-support[data-support="css-trig-fns"], [data-show-when-has-support="css-trig-fns"] {
				display: block !important;
			}
		}

		@supports (animation-composition: replace) {
			.no-support[data-support="css-animation-composition"] {
				display: none !important;
			}
			.has-support[data-support="css-animation-composition"], [data-show-when-has-support="css-animation-composition"] {
				display: block !important;
			}
		}
	}
}

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.