A timing chart as the blueprint for SMIL animation in SVG
On August 20 at Smashing Magazine, Johan Grobler described a method in which a complex SMIL animation is first drawn as a timing chart and only then written in markup. Every bar on the chart corresponds to one animate element, and its length and position become the values of the dur and begin attributes. Because a single animate changes exactly one property of one element, the count climbs fast: a three-dot loader takes six of them. The piece also covers synchronizing to another animation's start or end through the begin attribute, and honoring prefers-reduced-motion through the picture element.
Source
Timing Charts: A Blueprint For SMIL AnimationsSmashing Magazine · Original published August 20, 2026
On August 20 at Smashing Magazine, Johan Grobler described a working habit rather than a new technology. Before a single animate element is written, the animation is drawn as a timing chart, one bar per movement. Once the chart holds, writing the markup becomes transcription rather than guesswork.
Why the chart comes before the code
A SMIL animation in SVG has no single place where you see the whole. Every animate element carries its own dur and begin, so the arrangement gets assembled in your head out of scattered numbers. A timing chart returns that arrangement to one picture: the horizontal axis is time, each bar is one movement, and its length and start are exactly what goes into dur and begin.
One element, one property
The constraint the piece keeps returning to is that a single animate element changes exactly one property of one element. That makes the count climb faster than you expect. A three-dot loader, where each dot fades in and then out, takes six of them. To return a property to its starting state you use the set element.
attributeNamenames the property being changed.- from and to set the range of values.
- dur carries the duration, and fill decides what remains after it ends.
- href ties an animation to an element that is not its parent.
Synchronizing without manual arithmetic
Instead of computing every animation's offset from zero by hand, you tie a start to another animation's start or end. Writing begin="colorChange.end - 300ms" means the movement begins three tenths of a second before the named animation finishes. A positive offset pushes it later, a negative one earlier. Move one bar on the chart and the rest follow on their own, so a revision comes down to a single number.
Masking and honoring the user's setting
The piece also shows how animating a rectangle inside clipPath produces the impression of movement the shape itself does not make, separating opacity from fill-opacity for a finer fade. For users who asked their system for less motion, it suggests the picture element, which delivers a still image instead of an animated SVG under prefers-reduced-motion.
Related

A class prefix selector is now spec text in Selectors Level 5
The draft of August 18 adds section 2.1, Class Prefix Selectors, defining .foo-* to match any class beginning with that prefix. It replaces the attribute-selector workarounds every design system carries. Nothing implements it yet, and the matching rule has an edge that will catch people: .foo-* does not match foo--bar.
CSS Working Groupverified

Put Baseline in CI so the browser stops deciding for you
Three packages and about 20 minutes. One config tells your build which browsers you target, a linter warns when a stylesheet reaches past that line, and CI says it on the pull request instead of a user saying it in a bug report six weeks later.
web.dev, npmverified
Firefox 154 brings sibling-index(), sibling-count(), and text-box-trim
The August 18 release adds three CSS features you can use right away. sibling-index() and sibling-count() give an element's position among its siblings and their total, directly in CSS and without a line of JavaScript, which ends the need to hand-write variables like --i for staggered animation delays. Alongside them come text-box-edge, text-box-trim, and the text-box shorthand, which remove the extra space above and below text so headings finally sit in the grid the way they look in the design. On the JavaScript side, includes(), join(), chunks(), and windows() were added to the iterator prototype.
MDNverified