CSS corner-shape: Squircles, Scoops and Browser Support
Quick answer: corner-shape changes the shape of corners that border-radius has already rounded. It takes round, squircle, bevel, scoop, notch, square or superellipse(K), and does nothing when the radius is zero. As of October 2026 it is stable only in Chrome and Edge 139+. Firefox Nightly and Safari Technology Preview have it, so wrap it in @supports (corner-shape: round) and let plain rounded corners be the fallback.
For a decade the answer to “how do I make a squircle in CSS” was an SVG mask, a clip-path with a hand-computed path, or a JavaScript library that measured the box and redrew it on resize. corner-shape replaces all three with one property, and unlike a mask it keeps your border, shadow and outline attached to the shape. The catch is support, and a parameter scale that a lot of tutorials have misread.
The correction: superellipse(4) is not the squircle
Several articles about this property describe superellipse(4) as the “true” squircle, because in mathematics the squircle is the superellipse with exponent 4 (x4 + y4 = 1). That is correct math and the wrong CSS. The argument to superellipse() is not the exponent. The CSS Borders Level 4 specification writes the curve as x2K + y2K = 1, where K is the value you pass. So the exponent is 2 to the power of K:
| Keyword | Equals | Exponent (2K) | What you see |
|---|---|---|---|
square | superellipse(infinity) | ∞ | A sharp 90° corner that can still animate |
squircle | superellipse(2) | 4 | Flatter sides, a tighter turn at the corner |
round (initial) | superellipse(1) | 2 | The quarter-ellipse border-radius always drew |
bevel | superellipse(0) | 1 | A straight diagonal cut |
scoop | superellipse(-1) | concave 2 | A quarter-circle bitten out of the corner |
notch | superellipse(-infinity) | concave ∞ | A square step cut into the corner |
The mathematical squircle is superellipse(2), which is exactly what the squircle keyword maps to. Write superellipse(4) and you get an exponent of 16, which at normal radii is hard to tell from a square corner. The spec itself warns that a K of 10 “is already nearly indistinguishable from a square.” MDN’s reference lists the same keyword mapping.
The log scale is deliberate. Every number is valid, the bevel sits at zero, and a negative value is the mirror image of its positive twin: superellipse(-2) is a squircle-shaped scoop. Once you think of K as “how far from a diagonal,” the slider in the playground below makes sense quickly.
Browser support as of October 2, 2026
| Browser | Status | Since |
|---|---|---|
| Chrome | Shipped | 139, stable August 5, 2025 |
| Edge | Shipped | 139 |
| Opera, Samsung Internet | Shipped (Chromium) | Opera 123, Samsung Internet 30 |
| Firefox | Nightly only | Nightly 158, September 10, 2026; not in release 157 |
| Safari (macOS and iOS) | Technology Preview only | STP 251, August 26, 2026; not in Safari 27.0 |
Sources: Can I Use (about 71% of global traffic), the Firefox Nightly 158 notes, and WebKit’s Safari Technology Preview 251 notes. If you read in August that only Chromium had any implementation, that was true then. Both other engines picked it up in the following four weeks, and STP 252 and 253 already fixed outline, shadow and thick-border rendering bugs, which is the usual sign of an engine heading toward a release. No date has been announced for either. The property is also not Baseline and MDN marks it experimental.
In practice that means a roughly one-in-three chance any given visitor sees your fallback. That third includes nearly every iPhone user, since browsers on iOS run on WebKit almost everywhere.
How corner-shape depends on border-radius
border-radius decides how big each corner is. corner-shape decides what curve fills that area. MDN states the dependency without hedging: if the radius “resolves to 0, corner-shape will have no effect.” That makes it the most common reason the property appears broken.
.card {
border-radius: 28px; /* the size of the corner */
corner-shape: squircle; /* the curve inside it */
}
.tag {
border-radius: 0 12px 12px 0;
corner-shape: bevel; /* only the two right corners change */
}
A few more rules that come from the spec and the Chromium implementation:
corner-shapeis a shorthand forcorner-top-left-shape,corner-top-right-shape,corner-bottom-right-shapeandcorner-bottom-left-shape, and it takes one to four values in the same clockwise order asborder-radius. Logical longhands such ascorner-start-start-shapeexist too.- Elliptical radii still work.
border-radius: 40px / 16pxwithbevelgives you a shallow slanted cut. - Borders, outlines, box shadows (outer and inset),
backdrop-filter, background painting andoverflowclipping all follow the shape. That is whatclip-pathcould never give you. - It animates. Each keyword computes to a
superellipse()value, sotransition: corner-shape .3smorphs a bevel into a squircle smoothly.squareexists for exactly this reason: it looks likeborder-radius: 0but can be interpolated. - It is ignored when the newer
border-shapeproperty is set on the same element.
Corner-shape playground
Shape a corner, copy the CSS
Pick a keyword or drag K. The box is a real element with a border and a shadow, so you can see what follows the shape.
Checking your browser…
Negative is concave. ±6 stands in for ±infinity.
.box
.box {
border-radius: 36px;
}
@supports (corner-shape: round) {
.box {
corner-shape: squircle;
}
}
What each shape is good for
squircle
App icons, avatars, cards and buttons that should feel softer than a rectangle but less bubbly than a large radius. The flat stretch of side is longer than with round at the same radius, so you will probably want a somewhat bigger border-radius than you are used to for a similar sense of roundness. Drag the radius slider with squircle selected and compare.
bevel
Tags, ribbons, “sci-fi” HUD panels and price flags. Combine it with an asymmetric radius, for example border-radius: 0 50% 50% 0 / 0 50% 50% 0, and the right edge becomes an arrow point without any pseudo-element.
scoop and notch
Ticket stubs, coupon edges and the inverted corners on tabs that merge into a panel. These used to need radial-gradient masks. One warning: concave corners shrink the visible box, so text near a corner can collide with the cut. Add padding at least as large as the radius.
Mixing corners
.speech-bubble {
border-radius: 24px 24px 24px 0;
corner-shape: squircle squircle squircle square;
}
.ticket {
border-radius: 18px;
corner-shape: scoop; /* all four bitten out */
}
Progressive enhancement with @supports
Plain corner-shape: squircle with no guard is already safe: a browser that does not know the property drops the declaration and draws ordinary rounded corners. For squircle that fallback is close enough that most people will never notice. The guard matters when the shape changes the design, because the radius you picked for a scoop or a notch looks nothing like a rounded corner at the same size.
.ticket {
border-radius: 6px; /* modest corners everywhere */
}
@supports (corner-shape: scoop) {
.ticket {
border-radius: 18px; /* the big radius only where it becomes a scoop */
corner-shape: scoop;
}
}
Test for the property with a keyword value, as above. @supports (corner-shape: superellipse(2)) also works, and is the stricter check if you rely on the function. In JavaScript the same test is CSS.supports('corner-shape', 'squircle').
Fallbacks that draw the real shape
When the rounded-corner fallback is not acceptable, you have two options in browsers without corner-shape, and both have costs that the native property does not.
clip-path: polygon() with calc()
Sample the superellipse at a handful of points per corner and anchor the right and bottom corners with calc(100% - …). The polygon then scales with the element, so it works for fluid widths. The playground above generates this for you when you tick the fallback box. The cost: clip-path clips everything outside the outline, including the outer shadow and half the border. Put the shadow on a parent with filter: drop-shadow() instead, and use a background inset instead of a border.
An SVG mask, for fixed-size elements
For avatars and icons that are always the same size, a mask image is simpler:
.avatar {
width: 64px;
height: 64px;
mask: url(squircle-64.svg) center / 100% 100% no-repeat;
}
@supports (corner-shape: squircle) {
.avatar {
mask: none;
border-radius: 22px;
corner-shape: squircle;
}
}
A mask stretched across a box with a different aspect ratio distorts the corners, which is why this only suits fixed sizes. Like clip-path, a mask also hides the outer shadow and outline.
Reverse-engineering corners from a site you admire? Reading radius values out of DevTools one element at a time gets old fast. CSS DNA, a browser extension for inspecting CSS, copies any element’s CSS in one click and shows a site’s colors, fonts and spacing as a design-system preview, free. Add CSS DNA to Chrome (free).
How to check and debug corner-shape
- Confirm the browser. Run
CSS.supports('corner-shape', 'round')in the console.falsemeans you are looking at the fallback and nothing below applies. - Check the computed radius. In the Computed tab, filter for
radius. If every corner resolves to0px, the shape has nothing to work with. A later rule resettingborder-radius: 0is the usual culprit, and a utility class from a framework is the usual source of that rule. - Check the computed shape. Filter for
corner. Chrome lists each longhand, such ascorner-top-left-shape, with the keyword orsuperellipse()value you wrote. If you see the initialround, your declaration lost the cascade or has an invalid value (Chrome strikes out invalid declarations in the Styles pane). - Look for
border-shapeon the same element. If it is set,corner-shapeis ignored by design. - Small radius, subtle change. At
border-radius: 6pxthe difference betweenroundandsquircleis a pixel or two. Turn the radius up to check the property is applying, then back down.
If you work across a lot of components, the radius and shape scale is worth documenting the same way you would spacing or color. Our guide to extracting design tokens covers how to pull those scales out of an existing site, and copying CSS from any website covers what breaks when you paste a single rule into your own project.
Where this sits among 2026’s CSS features
corner-shape belongs in the same bucket as @function and scroll-driven animations from our Modern CSS in 2026 roundup: real, shipping in Chromium, and safe as decoration because the fallback is acceptable. It is a better candidate for early adoption than most of that list, since a browser that ignores it still draws a perfectly normal rounded box. If you want a feature that changes layout rather than paint, CSS masonry with Grid Lanes is the other one to watch this year, and its support story is almost the reverse.
Frequently asked questions
What does CSS corner-shape do?
corner-shape sets the curve used for corners that border-radius has rounded. Keywords are round (the default), squircle, bevel, scoop, notch and square, and superellipse(K) sets any curve in between. Borders, shadows, outlines and overflow clipping follow the new shape.
Which browsers support corner-shape?
Stable support is Chrome and Edge 139 and later (Chrome 139 reached stable on August 5, 2025), plus Chromium browsers such as Opera and Samsung Internet. As of October 2, 2026, Firefox has it in Nightly 158 and Safari in Technology Preview 251, with no release date announced. Can I Use puts global coverage at about 71%.
How do I make a squircle in CSS without SVG?
Set a border-radius and add corner-shape: squircle, which equals superellipse(2). In browsers without the property you get a normal rounded corner, which is a reasonable fallback. For an exact shape everywhere, use a clip-path: polygon() fallback inside @supports not (corner-shape: round).
What does the number in superellipse() mean?
It is K in the curve x2K + y2K = 1, so the exponent is 2 to the power of K. superellipse(1) is a normal round corner, superellipse(2) is the classic squircle, 0 is a straight bevel, and negative values are concave. superellipse(4) is close to a square, not the squircle.
Why does corner-shape have no effect?
Usually because the element’s border-radius is zero, since corner-shape only reshapes existing rounding. Other causes: the browser is Firefox or Safari, the declaration is invalid or overridden, the element has border-shape set, or the radius is so small that the change is a pixel wide.
Can I animate corner-shape?
Yes. Keywords compute to superellipse() values, so transitions and keyframes interpolate between shapes. Use square rather than a zero radius as the sharp end of an animation, because border-radius: 0 gives the shape nothing to interpolate.
See the CSS behind any shape
Click any element to copy its CSS, sample colors with the eyedropper, and read a site’s palette and fonts. It runs on-device.
Add CSS DNA to Chrome (free)Free: element CSS, eyedropper, ranked palette. Pro, $5/mo after a 7-day trial: exports, DESIGN.md, CSS audit. No account.