CSS is a declarative stylesheet language, this means you describe the result you want to see rather than the steps the browser would need to take to arrive at that result. You can write CSS selectors that target tags matching a certain description in a certain state, and then you declare the values that different styling properties should have at that time.
There are a few aspects of imperative programming living within CSS too. Animations that define sequences of keyframes, media queries, and feature queries are all examples of imperative programming features that are embedded inside the declarative language of CSS.
Custom properties (commonly called “CSS variables”) expand CSS to include the reactive programming paradigm as well. Any time a CSS variable is changed, the new values are updated live in your styles everywhere they have been used. So it's possible for CSS to declare a value that represents a stream of data.
Have you ever felt like CSS was too low-level to provide the abstractions for you to d