State, Logic, And Native Power: CSS Wrapped 2025<\/h1>\nBrecht De Ruyte<\/address>\n 2025-12-09T10:00:00+00:00
\n 2025-12-11T21:02:30+00:00
\n <\/header>\n
If I were to divide CSS evolutions into categories, we have moved far beyond the days when we simply asked for border-radius<\/code> to feel like we were living in the future. We are currently living in a moment where the platform is handing us tools that don\u2019t just tweak the visual layer, but fundamentally redefine how we architect interfaces. I thought the number of features announced in 2024 couldn\u2019t be topped. I\u2019ve never been so happily wrong.<\/p>\nThe Chrome team\u2019s \u201cCSS Wrapped 2025<\/strong><\/a>\u201d is not just a list of features; it is a manifesto for a dynamic, native web. As someone who has spent a couple of years documenting these evolutions — from defining \u201cCSS5\u201d eras<\/a> to the intricacies of modern layout utilities<\/a> — I find myself looking at this year\u2019s wrap-up with a huge sense of excitement. We are seeing a shift towards \u201cOptimized Ergonomics\u201d and \u201cNext-gen interactions\u201d that allow us to stop fighting the code and start sculpting interfaces in their natural state.<\/p>\nIn this article, you can find a comprehensive look at the standout features from Chrome\u2019s report<\/strong>, viewed through the lens of my recent experiments and hopes for the future of the platform.<\/p>\nThe Component Revolution: Finally, A Native Customizable Select<\/h2>\n
For years, we have relied on heavy JavaScript libraries to style dropdowns, a \u201cdecades-old problem\u201d that the platform has finally solved. As I detailed in my deep dive into the history of the customizable select<\/a> (and related articles), this has been a long road involving Open UI<\/a>, bikeshedding names like <selectmenu><\/code> and <selectlist><\/code>, and finally landing on a solution that re-uses the existing <select><\/code> element.<\/p>\nThe introduction of appearance: base-select<\/code> is a strong foundation. It allows us to fully customize the <select><\/code> element — including the button and the dropdown list (via ::picker(select)<\/code>) — using standard CSS. Crucially, this is built with progressive enhancement in mind. By wrapping our styles in a feature query, we ensure a seamless experience across all browsers.<\/p>\nWe can opt in to this new behavior without breaking older browsers:<\/p>\n
select {\n \/* Opt-in for the new customizable select *\/\n @supports (appearance: base-select) {\n &, &::picker(select) {\n appearance: base-select;\n }\n }\n}\n<\/code><\/pre>\nThe fantastic addition to allow rich content inside options, such as images or flags, is a lot of fun. We can create all sorts of selects nowadays:<\/p>\n
\n- Demo:<\/strong> I created a Pok\u00e9-adventure demo<\/a> showing how the new
<selectedcontent><\/code> element can clone rich content (like a Pok\u00e9ball icon) from an option directly into the button.<\/li>\n<\/ul>\n\nSee the Pen [A customizable select with images inside of the options and the selectedcontent [forked]](https:\/\/codepen.io\/smashingmag\/pen\/JoXwwoZ) by utilitybend<\/a>.<\/p>See the Pen A customizable select with images inside of the options and the selectedcontent [forked]<\/a> by utilitybend<\/a>.<\/figcaption><\/figure>\n\n- Demo:<\/strong> A comprehensive look at styling the select with only pseudo-elements<\/a>.<\/li>\n<\/ul>\n
\nSee the Pen [A customizable select with only pseudo-elements [forked]](https:\/\/codepen.io\/smashingmag\/pen\/pvyqqJR) by utilitybend<\/a>.<\/p>See the Pen A customizable select with only pseudo-elements [forked]<\/a> by utilitybend<\/a>.<\/figcaption><\/figure>\n\n- Demo:<\/strong> Or you can kick it up a notch with this Menu selection demo using optgroups<\/a>.<\/li>\n<\/ul>\n
\nSee the Pen [An actual Select Menu with optgroups [forked]](https:\/\/codepen.io\/smashingmag\/pen\/myPaaJZ) by utilitybend<\/a>.<\/p>See the Pen An actual Select Menu with optgroups [forked]<\/a> by utilitybend<\/a>.<\/figcaption><\/figure>\nThis feature alone signals a massive shift in how we will build forms, reducing dependencies and technical debt.<\/p>\n
\n
\n 2025-12-11T21:02:30+00:00
\n <\/header>\n
border-radius<\/code> to feel like we were living in the future. We are currently living in a moment where the platform is handing us tools that don\u2019t just tweak the visual layer, but fundamentally redefine how we architect interfaces. I thought the number of features announced in 2024 couldn\u2019t be topped. I\u2019ve never been so happily wrong.<\/p>\nThe Chrome team\u2019s \u201cCSS Wrapped 2025<\/strong><\/a>\u201d is not just a list of features; it is a manifesto for a dynamic, native web. As someone who has spent a couple of years documenting these evolutions — from defining \u201cCSS5\u201d eras<\/a> to the intricacies of modern layout utilities<\/a> — I find myself looking at this year\u2019s wrap-up with a huge sense of excitement. We are seeing a shift towards \u201cOptimized Ergonomics\u201d and \u201cNext-gen interactions\u201d that allow us to stop fighting the code and start sculpting interfaces in their natural state.<\/p>\nIn this article, you can find a comprehensive look at the standout features from Chrome\u2019s report<\/strong>, viewed through the lens of my recent experiments and hopes for the future of the platform.<\/p>\nThe Component Revolution: Finally, A Native Customizable Select<\/h2>\n
For years, we have relied on heavy JavaScript libraries to style dropdowns, a \u201cdecades-old problem\u201d that the platform has finally solved. As I detailed in my deep dive into the history of the customizable select<\/a> (and related articles), this has been a long road involving Open UI<\/a>, bikeshedding names like <selectmenu><\/code> and <selectlist><\/code>, and finally landing on a solution that re-uses the existing <select><\/code> element.<\/p>\nThe introduction of appearance: base-select<\/code> is a strong foundation. It allows us to fully customize the <select><\/code> element — including the button and the dropdown list (via ::picker(select)<\/code>) — using standard CSS. Crucially, this is built with progressive enhancement in mind. By wrapping our styles in a feature query, we ensure a seamless experience across all browsers.<\/p>\nWe can opt in to this new behavior without breaking older browsers:<\/p>\n
select {\n \/* Opt-in for the new customizable select *\/\n @supports (appearance: base-select) {\n &, &::picker(select) {\n appearance: base-select;\n }\n }\n}\n<\/code><\/pre>\nThe fantastic addition to allow rich content inside options, such as images or flags, is a lot of fun. We can create all sorts of selects nowadays:<\/p>\n
\n- Demo:<\/strong> I created a Pok\u00e9-adventure demo<\/a> showing how the new
<selectedcontent><\/code> element can clone rich content (like a Pok\u00e9ball icon) from an option directly into the button.<\/li>\n<\/ul>\n\nSee the Pen [A customizable select with images inside of the options and the selectedcontent [forked]](https:\/\/codepen.io\/smashingmag\/pen\/JoXwwoZ) by utilitybend<\/a>.<\/p>See the Pen A customizable select with images inside of the options and the selectedcontent [forked]<\/a> by utilitybend<\/a>.<\/figcaption><\/figure>\n\n- Demo:<\/strong> A comprehensive look at styling the select with only pseudo-elements<\/a>.<\/li>\n<\/ul>\n
\nSee the Pen [A customizable select with only pseudo-elements [forked]](https:\/\/codepen.io\/smashingmag\/pen\/pvyqqJR) by utilitybend<\/a>.<\/p>See the Pen A customizable select with only pseudo-elements [forked]<\/a> by utilitybend<\/a>.<\/figcaption><\/figure>\n\n- Demo:<\/strong> Or you can kick it up a notch with this Menu selection demo using optgroups<\/a>.<\/li>\n<\/ul>\n
\nSee the Pen [An actual Select Menu with optgroups [forked]](https:\/\/codepen.io\/smashingmag\/pen\/myPaaJZ) by utilitybend<\/a>.<\/p>See the Pen An actual Select Menu with optgroups [forked]<\/a> by utilitybend<\/a>.<\/figcaption><\/figure>\nThis feature alone signals a massive shift in how we will build forms, reducing dependencies and technical debt.<\/p>\n
\n