opacity
Fades out on hover.
A focused reference for the standard CSS transition feature set: properties, duration, timing
functions, delay, multi-property shorthand, triggers (:hover, :focus,
:active, class toggles), transform variety, and interruption/reversal behavior.
The same hover trigger, applied to a different CSS property each time. Hover any card.
Fades out on hover.
Fill color crossfades.
Text/border color crossfades.
Lifts and scales up — the example named in the original request.
Square morphs into a circle.
Shadow grows and tints.
Two length properties animating together.
Two properties on one selector, same duration.
Identical transform, three different transition-duration values. Hover each box.
Same 120px translate, same .9s duration, seven curves. Hover each track to compare acceleration.
lineareaseease-inease-outease-in-outcubic-bezier()steps(6, end)transition-delay offsets when a property's animation starts. A per-child delay ramp produces a cascade effect.
Hover the row — each box's transform starts 60ms after the previous one.
Nothing happens for 500ms after hover starts, then it animates.
One rule, four properties, each with its own duration/easing/delay — the general form of the transition shorthand.
Transitions fire on any computed-style change, not just :hover — including keyboard focus and pointer-down.
Pointer over the element.
Click or Tab into the input.
Press and hold the mouse button down.
Every transform function type, transitioned. All use the same underlying transform property.
Pivot is offset to 15% 85% instead of center.
Move the pointer on and off quickly. A spec-correct transition reverses smoothly from whatever position it is currently at — it never jumps back to the start before reversing.
Transitions aren't limited to pseudo-classes — any computed-style change triggers them, including a class added/removed by JavaScript.
Every individual CSS transform function, hover-triggered in isolation, auditing exactly which ones
Fold's matrix decomposition (cssTransform.service.ts's decomposeMatrix16)
can faithfully reproduce in the 3D scene. The browser always resolves any transform list to
a single matrix()/matrix3d() before Fold ever sees it, so every card below
is really testing the same decomposition step — just fed a different resulting matrix shape.
Legend:
supported
edge case
not supported
*Exact when the matrix is a pure translate+rotate+scale composite — this example is rotate(15deg) translate(20px,-10px) pre-multiplied. A hand-authored matrix with shear or a projective row inherits the skew/perspective gaps below.
*Same caveat as matrix() above — this example is rotateY(25deg) translateZ(15px), no shear/perspective.
The projective row of the resolved matrix is never read by decomposeMatrix16 at all — no depth-foreshortening is applied, silently. Expect this to look identical to a plain rotateY(40deg).
2-D rotation (Z-axis) — exact.
Fixed: the tween now interpolates rotation via quaternion slerp (FoldGroupElement.tsx) instead of independent per-axis Euler lerp, matching how the CSS spec itself resolves a multi-axis rotation transition — correct at every frame, including through gimbal-lock-adjacent orientations. (Previously: per-axis lerp only coincidentally matched slerp for single-axis rotation; combined-axis frames could visibly diverge mid-transition.)
Single-axis 3-D rotation — exact.
Single-axis 3-D rotation — exact.
Single-axis rotation, same as rotate() — exact.
Pure translation is read directly off the matrix's translation column — always exact.
Same as translate() with an explicit Z — exact.
Positive uniform/non-uniform scale — exact.
Fixed: decomposition now checks the transform matrix's determinant sign and folds it into scaleX (same convention as Three.js's own Matrix4.decompose()) instead of losing it to sqrt(). Reconstructs the exact same final matrix — e.g. this decomposes to scaleX=-1 + rotateZ=180°, which recomposes to the identical mirror. (Previously: sign was silently dropped, misread as an implicit ~180° rotation — visibly wrong for asymmetric content like text.)
Per-axis scale including Z — exact.
Single-axis scale — exact.
Single-axis scale — exact.
Combined with rotateX so a pure Z-scale has a visible effect on a flat plane — exact.
ParsedCssTransform has no shear field at all. The decomposition doesn't ignore skew — it misreads it: a shear column gets measured as if it were rotation + scale, so this renders as a rotated/stretched rectangle rather than a slanted parallelogram.
Same underlying gap as skew() above.
Same underlying gap as skew() above.