Beyond `border-radius`: What The CSS `corner-shape` Property Unlocks For Everyday UI<\/h1>\nBrecht De Ruyte<\/address>\n 2026-03-12T10:00:00+00:00
\n 2026-03-18T09:33:12+00:00
\n <\/header>\n
When I first started building websites, rounded corners required five background images, one for each corner, one for the body, and a prayer that the client wouldn\u2019t ask for a different radius. Then the border-radius<\/code> property landed, and the entire web collectively sighed with relief. That was over fifteen years ago, and honestly, we\u2019ve been riding that same wave ever since. Just as then, I hope that we can look at this feature as a progressive enhancement slowly making its way to other browsers.<\/p>\nI like a good border-radius<\/code> like any other guy, but the fact is that it only gives us one shape. Round. That\u2019s it. Want beveled corners? Clip-path. Scooped ticket edges? SVG mask. Squircle app icons? A carefully tuned SVG that you hope nobody asks you to animate. We\u2019ve been hacking around the limitations of border-radius<\/code> for years, and those hacks come with real trade-offs: borders don\u2019t follow clip-paths, shadows get cut off, and you end up with brittle code that breaks the moment someone changes a padding value.<\/p>\nWell, the new corner-shape<\/code><\/strong> changes all of that.<\/p>\nWhat Is corner-shape<\/code>?<\/h2>\nThe corner-shape<\/code><\/a> property is a companion to border-radius<\/code>. It doesn\u2019t replace it; it modifies the shape<\/em> of the curve that border-radius<\/code> creates. Without border-radius<\/code>, corner-shape<\/code> does nothing. But together, they\u2019re a powerful pair.<\/p>\nThe property accepts these values:<\/p>\n
\nround<\/code><\/strong>: the default, same as regular border-radius<\/code>,<\/li>\nsquircle<\/code><\/strong>: a superellipse, the smooth Apple-style rounded square,<\/li>\nbevel<\/code><\/strong>: a straight line between the two radius endpoints (snipped corners),<\/li>\nscoop<\/code><\/strong>: an inverted curve, creating concave corners,<\/li>\nnotch<\/code><\/strong>: sharp inward cuts,<\/li>\nsquare<\/code><\/strong>: effectively removes the rounding, overriding border-radius<\/code>.<\/li>\n<\/ul>\nAnd you can set different values per corner, just like border-radius<\/code>:<\/p>\n*corner-shape: bevel round scoop squircle;\n\/* top-left, top-right, bottom-right, bottom-left *\/\n<\/code><\/pre>\nYou can also use the superellipse()<\/code><\/a> function with a numeric parameter for fine-grained control.<\/p>\n.element { \n border-radius: 25px;\n corner-shape: superellipse(0); \/* equal to 'bevel' *\/\n}\n<\/code><\/pre>\nSo the question here might be: why not call this property \u201cborder-shape<\/code>\u201d instead? Well, first of all, that is something completely different that we\u2019ll get to play around with soon<\/a>. Second, it does apply to a bit more than borders, such as outlines, box shadows, and backgrounds. That\u2019s the thing that the clip-path<\/code> property could never do.<\/p>\n\n
\n 2026-03-18T09:33:12+00:00
\n <\/header>\n
border-radius<\/code> property landed, and the entire web collectively sighed with relief. That was over fifteen years ago, and honestly, we\u2019ve been riding that same wave ever since. Just as then, I hope that we can look at this feature as a progressive enhancement slowly making its way to other browsers.<\/p>\nI like a good border-radius<\/code> like any other guy, but the fact is that it only gives us one shape. Round. That\u2019s it. Want beveled corners? Clip-path. Scooped ticket edges? SVG mask. Squircle app icons? A carefully tuned SVG that you hope nobody asks you to animate. We\u2019ve been hacking around the limitations of border-radius<\/code> for years, and those hacks come with real trade-offs: borders don\u2019t follow clip-paths, shadows get cut off, and you end up with brittle code that breaks the moment someone changes a padding value.<\/p>\nWell, the new corner-shape<\/code><\/strong> changes all of that.<\/p>\nWhat Is corner-shape<\/code>?<\/h2>\nThe corner-shape<\/code><\/a> property is a companion to border-radius<\/code>. It doesn\u2019t replace it; it modifies the shape<\/em> of the curve that border-radius<\/code> creates. Without border-radius<\/code>, corner-shape<\/code> does nothing. But together, they\u2019re a powerful pair.<\/p>\nThe property accepts these values:<\/p>\n
\nround<\/code><\/strong>: the default, same as regular border-radius<\/code>,<\/li>\nsquircle<\/code><\/strong>: a superellipse, the smooth Apple-style rounded square,<\/li>\nbevel<\/code><\/strong>: a straight line between the two radius endpoints (snipped corners),<\/li>\nscoop<\/code><\/strong>: an inverted curve, creating concave corners,<\/li>\nnotch<\/code><\/strong>: sharp inward cuts,<\/li>\nsquare<\/code><\/strong>: effectively removes the rounding, overriding border-radius<\/code>.<\/li>\n<\/ul>\nAnd you can set different values per corner, just like border-radius<\/code>:<\/p>\n*corner-shape: bevel round scoop squircle;\n\/* top-left, top-right, bottom-right, bottom-left *\/\n<\/code><\/pre>\nYou can also use the superellipse()<\/code><\/a> function with a numeric parameter for fine-grained control.<\/p>\n.element { \n border-radius: 25px;\n corner-shape: superellipse(0); \/* equal to 'bevel' *\/\n}\n<\/code><\/pre>\nSo the question here might be: why not call this property \u201cborder-shape<\/code>\u201d instead? Well, first of all, that is something completely different that we\u2019ll get to play around with soon<\/a>. Second, it does apply to a bit more than borders, such as outlines, box shadows, and backgrounds. That\u2019s the thing that the clip-path<\/code> property could never do.<\/p>\n\n