CSS is no longer "the styling language." In the last few years it gained typed custom properties, container queries, native view transitions, programmatic highlight control, and a paint API that runs in a worker. If you're still writing app UIs like it's 2019, you're leaving real capability on the table.
Every example below is pure, runnable CSS/JS — paste it into NitroIDE's live preview and see it work instantly, no build step.
Regular custom properties are dumb strings — the browser can't animate --progress: 0% to --progress: 100% because it doesn't know it's a percentage. @property registers the type, unlocking smooth animation of anything:
Without @property, that keyframe does nothing — the browser can't interpolate an untyped string. With it, you get GPU-friendly animated gradients with zero JavaScript.
Need a background pattern CSS can't express — wavy dividers, confetti, dynamic grids? The CSS Paint API lets you draw with canvas-like code in a worklet that runs off the main thread:
Honest note: Houdini's grand vision (layout, animation worklets) mostly stalled — but the Paint API shipped in Chromium and is genuinely useful for generative backgrounds and dynamic patterns.
Media queries respond to the viewport. Container queries let a component respond to its parent's size — which is what you actually want for reusable cards, sidebars, and dashboard widgets:
Drop the same card in a narrow sidebar and a wide main column — it adapts to each context automatically. This is the single biggest layout upgrade for component-based UIs in years.
The View Transitions API gives you animated transitions between DOM states with a few lines — no animation library:
Elements with matching view-transition-name values morph between states automatically. For multi-page apps, @view-transition { navigation: auto; } enables the same effect across full page loads in Chromium — genuinely app-like navigation with one CSS rule.
Performance note: view transitions snapshot the old and new states as images and animate those — the DOM itself isn't animating. Keep view-transition-name usage targeted; naming hundreds of elements can spike memory during the transition.
Setting styles via strings (el.style.opacity = '0.5') forces the browser to parse text on every write. The Typed OM works with real numeric values — faster in tight loops like drag handlers and scroll effects:
::selection only covers user selections. The Custom Highlight API lets JavaScript highlight arbitrary ranges — the foundation of fast, custom syntax highlighting that doesn't fight the DOM:
Rendering 10,000 file rows crushes layout. content-visibility: auto tells the browser to skip rendering off-screen subtrees entirely until they're scrolled near:
This single declaration can take a heavy list from seconds of layout to near-instant. The contain-intrinsic-size is essential — without it, the scrollbar thumb jitters as rows get measured.
Try every technique above in a live preview — no PostCSS, no config, just CSS.
Launch NitroIDE