Taste has reasons

Compare variants, pick one, and name why: easing, timing or properties.

Emil Kowalski@emilkowalski
Most animations don't feel off because of the code. They feel off because of the decisions behind them: the easing, the timing, or the properties you chose to animate.
Aug 25, 2026View on X ↗
Emil Kowalski@emilkowalski
Great animations aren't magic. Almost every taste decision has a logical reason, the course teaches you those reasons.
Aug 25, 2026View on X ↗
Emil Kowalski@emilkowalski
I often ask my coding agent to come up with a few different variants and add a switcher so I can easily swap between them.
Jul 24, 2026View on X ↗
Emil KowalskiDeveloping taste
…it’s a trained instinct. The ability to see beyond the obvious and recognize what elevates.
emilkowal.skiRead article ↗

From emil-design-eng, “Taste is trained, not innate”.

Pick one, say why

Play both, pick one, name the difference, then reveal.

A?
hidden
B?
hidden
Your pick
/* revealed after you answer */

Switch variants, share a link

Pick a variant (or press 1–4), then copy the link.

Variant
CompareBaseline
ChosenChosen
const VARIANTS = {
  c: { props: "opacity, transform", dur: "200ms", ease: "var(--ease-out)", from: "scale(0.95)" },
  d: { props: "opacity, transform", dur: "200ms", exit: "120ms", ease: "var(--ease-out)",
       from: "scale(0.95)", origin: "top left" },
};

const params = new URLSearchParams(location.search);
let current = params.get("v") in VARIANTS ? params.get("v") : "d";

function choose(key, why) {
  current = key;
  params.set("v", key);
  if (why) params.set("why", why);
  history.replaceState(null, "", `?${params}`);
  apply(VARIANTS[key]);
}

.popover {
  opacity: 0; transform: scale(0.95); transform-origin: top left;
  transition: opacity 120ms var(--ease-out), transform 120ms var(--ease-out);
}
.popover.open {
  opacity: 1; transform: none;
  transition-duration: 200ms;
}

Why it matters, pros and cons

Why it matters

Motion feels off because of decisions, not code. A named reason transfers.

Pros

  • Side by side reveals hidden differences.
  • Named reasons become reusable rules.
  • A URL switcher makes preference checkable.

Cons

  • Building variants costs time for rarely seen motion.
  • Some calls have no formula and stay trial and error.
  • Delete the switcher before shipping.