Jan 26, 2026
Sometimes it feels like designers invent interface patterns just to mess with developers. A concave corner is one of those.
“Inverted”, “concave”, “negative” corners — also known as negative border radius or inverted border radius. If you hear any of that, brace yourself. Pain is coming.
The problem is that the pattern looks simple, but there’s no native way to create such a corner in CSS. So people resort to piles of extra wrappers and oceans of positioning styles. And all of that immediately falls apart on non-uniform backgrounds.
In this article, I’ll show a simple way to create concave corners using an open-source CSS library that I built specifically to solve this problem.
Why inverted corners are a pain
Meet our hero in the screenshot below:
If you see a shape like the red outline — run
The most common implementation usually looks like this:
-
add extra wrappers and pseudo-elements;
-
absolutely position all the pieces;
-
tweak radii, sizes, and offsets.
In practice, this gives you tons of code per corner and a fragile solution that’s painful to maintain.
Below is a screenshot from a popular video about concave corner implementations. What you see here is roughly one fifth of the total implementation code.
Example implementation by Kevin Powell
Background issues
Typical solutions work only on solid backgrounds.
As soon as the background becomes non-uniform, you have to switch to SVG.
And CSS pain turns into SVG pain.
The dream solution for concave corners
What does a developer dream of when facing a concave corner?
-
a simple pure-CSS solution;
-
working out of the box, including on complex backgrounds;
-
native customization of corner size and shape.
Good news: such a solution exists. It’s called nebo.css, and that’s what we’ll explore in this article. The name comes from the pattern itself — negative border radius.
Installing nebo.css and creating your first concave corner
nebo.css is a single CSS file, very much in the spirit of normalize.css: include it — and start using it. There’s no JavaScript inside, everything is done with pure CSS.
Include the library
<link rel="stylesheet" href="nebo.css">
That’s all you need to get started.
Add a single corner to a card
To add an inverted corner, the element needs the base class nebo. By default, the corner appears in the bottom-right.
<article class="card nebo">...</article>
Result:
Concave corner with default parameters
Changing the corner position
The position is controlled by modifiers:
-
nebo--tr — top right,
-
nebo--tl — top left,
-
nebo--bl — bottom left,
-
nebo--br — bottom right.
<article class="card nebo nebo--tr">...</article>
Result:
Concave corners on different sides over a complex background
At this point, an important thing becomes obvious: the corner works correctly even on non-uniform backgrounds, with no extra tricks.
Basic customization
All nebo.css parameters are controlled via native CSS variables that follow the standard cascade.
Base radius: --nb-r
This variable controls the corner radii. The default value is 20px. Let’s make it a bit smaller.
.nebo {
--nb-r: 16px;
}
Cutout width and height: --nb-w and --nb-h
These variables define additional offsets between the inner and outer radii.
.card--cat1 {
--nb-w: 42px;
--nb-h: 16px;
}
Result:
Reduced radii with additional corner width and height
Different settings for different elements
Since this is just the regular CSS cascade, each element can be customized independently:
.card--cat1 { --nb-w: 42px; --nb-h: 16px; }
.card--cat2 { --nb-w: 32px; --nb-h: 42px; }
.card--cat3 { --nb-w: 64px; --nb-h: 42px; }
.card--cat4 { --nb-w: 42px; --nb-h: 16px; }
Result:
Different corner parameters for different cards
By the way, corners render correctly even with zero values (0px) — just don’t forget the units.
Multiple concave corners on a single element
nebo.css is intentionally designed around a simple rule: one element — one corner. But if you need more, there’s a proven technique — extra wrappers.
Using wrappers
<div class="card-wrapper nebo nebo--bl">
<article class="card nebo nebo--tr">...</article>
</div>
Result:
Card with two concave corners
Each level can be customized independently using CSS variables.
You can build three or even four corners — just by stacking wrappers.
Advanced customization
The base radius defined by --nb-r can be overridden separately for each of the three curves: two outer corners and the inner curve. Both horizontal and vertical radii can be set independently using six additional CSS variables:
--nb-cor1-rw,
--nb-cor1-rh,
--nb-cor2-rw,
--nb-cor2-rh,
--nb-curve-rw,
--nb-curve-rh,
These variables allow you to create concave corners with very complex shapes. For example:
.card--cat1 {
--nb-r: 30px;
--nb-w: 0px;
--nb-h: 0px;
--nb-curve-rw: 120px;
--nb-curve-rh: 90px;
--nb-cor1-rw: 90px;
--nb-cor1-rh: 90px;
--nb-cor2-rw: 60px;
--nb-cor2-rh: 60px;
--_nb-smooth: 99.5%;
}
Result:
Concave corner with different corner radii
Case study: a two-block card
Now let’s look at a more realistic example — a card consisting of a top image block and a bottom content block.
Markup
<div class="card">
<div class="card-header"></div>
<div class="card-body">
<div class="price">$114,000</div>
...
</div>
</div>
Adding concave corners
<div class="card-header nebo nebo--bl"></div>
<div class="card-body nebo nebo--tr">...</div>
Tuning parameters and merging blocks
This example uses a quick and dirty trick with negative margins to pull the image block closer to the content block. The goal here was to demonstrate how easy it is to create the cutouts.
.card-header {
--nb-r: 10px;
--nb-w: 130px;
--nb-h: 44px;
margin-bottom: -54px;
}
.card-body {
--nb-r: 10px;
--nb-w: 160px;
--nb-h: 44px;
}
Result:
Complex two-block card with concave corners
Notice that everything works perfectly on non-uniform backgrounds.
Where to get nebo.css
nebo.css is a free open-source library developed by the author. It’s hosted on GitHub.
Repository: https://github.com/htmlacademy/nebo.css
You can include the library as a separate file or copy the code directly into your styles. Use it — and enjoy!
The complete code lives in an interactive, step-by-step demo — you can go through the examples at your own pace and play with the parameters along the way.
<!DOCTYPE html><html lang="en" class="no-js"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><script>var b=document.documentElement.classList;b.remove('no-js');if(!window.Promise||!window.sessionStorage||!!sessionStorage.getItem('muller.v2')){b.add('muller')}</script><link rel="dns-prefetch" href="https://assets.htmlacademy.org"><script async src="https://www.googletagmanager.com/gtag/js?id=G-MXPCRXM48C"></script><script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-MXPCRXM48C');
</script><script type="text/javascript">
(function(e,t){var n=e.amplitude||{_q:[],_iq:{}};var r=t.createElement("script")
;r.type="text/javascript"
;r.integrity="sha384-d/yhnowERvm+7eCU79T/bYjOiMmq4F11ElWYLmt0ktvYEVgqLDazh4+gW9CKMpYW"
;r.crossOrigin="anonymous";r.async=true
;r.src="https://cdn.amplitude.com/libs/amplitude-5.2.2-min.gz.js"
;r.onload=function(){if(!e.amplitude.runQueuedFunctions){
console.log("[Amplitude] Error: could not load SDK")}}
;var i=t.getElementsByTagName("script")[0];i.parentNode.insertBefore(r,i)
;function s(e,t){e.prototype[t]=function(){
this._q.push([t].concat(Array.prototype.slice.call(arguments,0)));return this}}
var o=function(){this._q=[];return this}
;var a=["add","append","clearAll","prepend","set","setOnce","unset"]
;for(var u=0;u<a.length;u++){s(o,a[u])}n.Identify=o;var c=function(){this._q=[]
;return this}
;var l=["setProductId","setQuantity","setPrice","setRevenueType","setEventProperties"]
;for(var p=0;p<l.length;p++){s(c,l[p])}n.Revenue=c
;var d=["init","logEvent","logRevenue","setUserId","setUserProperties","setOptOut","setVersionName","setDomain","setDeviceId","setGlobalUserProperties","identify","clearUserProperties","setGroup","logRevenueV2","regenerateDeviceId","groupIdentify","onInit","logEventWithTimestamp","logEventWithGroups","setSessionId","resetSessionId"]
;function v(e){function t(t){e[t]=function(){
e._q.push([t].concat(Array.prototype.slice.call(arguments,0)))}}
for(var n=0;n<d.length;n++){t(d[n])}}v(n);n.getInstance=function(e){
e=(!e||e.length===0?"$default_instance":e).toLowerCase()
;if(!n._iq.hasOwnProperty(e)){n._iq[e]={_q:[]};v(n._iq[e])}return n._iq[e]}
;e.amplitude=n})(window,document);
amplitude.getInstance().init("df11525b6880a3c5e2af14f9b6238408", null,{
includeUtm: true,
includeGclid: true,
includeReferrer: true,
deviceIdFromUrlParam: true
}, function (instance) {
window.amplitudeLoaded = true;
});
</script><link rel="stylesheet" href="https://assets.htmlacademy.org/css/core.v284.css"><link rel="stylesheet" href="https://assets.htmlacademy.org/css/text.v104.css"><link rel="stylesheet" href="https://assets.htmlacademy.org/css/profile.v236.css"><link rel="stylesheet" href="/css/custom.css"><style>
.page-content__inner {
max-width: 800px;
}
.post-list__meta {
margin-top: 15px;
font-size: 0.8em;
}
.post-list__meta .post-author {
margin-left: 10px;
color: #999;
}
.text-container {
max-width: 680px;
}
.text-container h1,
.text-container h2,
.text-container h3 {
border-bottom: none;
padding-bottom: 0;
}
.post-intro {
margin: 40px 0;
padding-bottom: 40px;
border-bottom: 2px solid #eee;
}
.post-intro h1 {
font-size: 44px;
line-height: 1.3;
margin-bottom: 10px;
}
.post-intro h1 {
font-size: 44px;
line-height: 1.3;
margin-bottom: 10px;
}
.post-intro .meta {
margin-top: 0;
}
.post-intro .post-author {
margin-left: 20px;
color: #999;
}
.post-intro .lead {
margin-bottom: 0;
font-size: 20px;
}
</style><link rel="stylesheet" href="/css/cookies.css"><link rel="preload" as="script" href="https://assets.htmlacademy.org/js/general.v274.js"><title>nebo.css: Concave Corners Made Easy — Blog — HTML Academy</title><meta name="description" content="nebo.css is a tiny CSS-only library for creating concave (inset) corners without SVG, extra markup, or JavaScript."><meta property="og:type" content="website"><meta property="og:site_name" content="HTML Academy"><meta name="twitter:url" property="og:url" content="https://htmlacademy.org/blog/concave-corners-easy"><meta name="twitter:title" property="og:title" content="nebo.css: Concave Corners Made Easy"><meta name="twitter:description" property="og:description" content="nebo.css is a tiny CSS-only library for creating concave (inset) corners without SVG, extra markup, or JavaScript."><meta name="theme-color" content="#2f358f"></head><body><header class="page-header"><div class="page-header__inner"><div class="page-header__top"><a class="page-header__logo" href="/"><img src="https://assets.htmlacademy.org/img/logo.v2.svg" width="104" height="36" alt="HTML Academy"></a><nav class="main-menu" aria-label="Main navigation" itemscope itemtype="http://schema.org/SiteNavigationElement"><ul class="main-menu__list main-menu__list--main main-menu__list--adaptive"><li class="main-menu__item main-menu__item--logo"><a class="main-menu__link" href="/" title="HTML Academy main page"><img src="https://assets.htmlacademy.org/img/logo.v2.svg" width="104" height="36" alt="HTML Academy"></a></li><li class="main-menu__item"><a class="main-menu__link" href="/courses" title="Courses"><span class="main-menu__icon"><svg aria-hidden="true"><use xlink:href="/img/sprites/general.svg#course"></use></svg></span>Courses</a></li><li class="main-menu__item"><a class="main-menu__link" href="/tutorials" title="Tutorials"><span class="main-menu__icon"><svg aria-hidden="true"><use xlink:href="/img/sprites/general.svg#intensive"></use></svg></span>Tutorials</a></li><li class="main-menu__item"><a class="main-menu__link" href="/blog" title="Blog"><span class="main-menu__icon"><svg aria-hidden="true"><use xlink:href="/img/sprites/general.svg#hat"></use></svg></span>Blog</a></li></ul><button class="main-menu__trigger" type="button" title="Main menu"><span></span></button><div class="main-menu__dropdown" id="main-menu"><div class="main-menu__dropdown-inner"><ul class="main-menu__list main-menu__list--main"><li class="main-menu__item" itemprop="name"><a class="main-menu__link" href="/courses" itemprop="url"><span class="main-menu__icon" aria-hidden="true"><svg aria-hidden="true"><use xlink:href="/img/sprites/general.svg#course"></use></svg></span>Courses</a></li><li class="main-menu__item" itemprop="name"><a class="main-menu__link" href="/tutorials" itemprop="url"><span class="main-menu__icon" aria-hidden="true"><svg aria-hidden="true"><use xlink:href="/img/sprites/general.svg#intensive"></use></svg></span>Tutorials</a></li><li class="main-menu__item" itemprop="name"><a class="main-menu__link" href="/blog" itemprop="url"><span class="main-menu__icon" aria-hidden="true"><svg aria-hidden="true"><use xlink:href="/img/sprites/general.svg#hat"></use></svg></span>Blog</a></li></ul><ul class="main-menu__list main-menu__list--user main-menu__list--user-guest"><li class="main-menu__item" itemprop="name"><a class="main-menu__link" href="/signup?redirect_url=%2Fblog%2Fconcave-corners-easy" title="Sign up" data-modal="open" data-value="register" itemprop="url"><span class="main-menu__icon" aria-hidden="true"><svg aria-hidden="true"><use xlink:href="/img/sprites/general.svg#user"></use></svg></span>Sign up</a></li><li class="main-menu__item main-menu__item--login" itemprop="name"><a class="main-menu__link" href="/login?redirect_url=%2Fblog%2Fconcave-corners-easy" title="Log in" data-modal="open" data-value="login" itemprop="url"><span class="main-menu__icon" aria-hidden="true"><svg aria-hidden="true"><use xlink:href="/img/sprites/general.svg#login"></use></svg></span>Log in</a></li></ul></div></div></nav></div></div></header><div class="page-content page-content--static"><div class="page-content__inner"><nav class="breadcrumbs" itemscope itemtype="http://schema.org/SiteNavigationElement"><ul class="breadcrumbs__list"><li class="breadcrumbs__item" itemprop="name"><a href="/" itemprop="url">Home</a></li><li class="breadcrumbs__item" itemprop="name"><a href="/blog" itemprop="url">Blog</a></li></ul></nav><section class="text-container breadcrumbs-offset"><header class="post-intro"><h1>nebo.css: Concave Corners Made Easy</h1><p class="meta"><time>Jan 26, 2026</time><span class="post-author">Alexander Pershin</span></p><p class="lead">Sometimes it feels like designers invent interface patterns just to mess with developers. A concave corner is one of those.</p><p class="lead">“Inverted”, “concave”, “negative” corners — also known as <em>negative border radius</em> or <em>inverted border radius</em>. If you hear any of that, brace yourself. Pain is coming.</p><p class="lead">The problem is that the pattern looks simple, but there’s no native way to create such a corner in CSS. So people resort to piles of extra wrappers and oceans of positioning styles. And all of that immediately falls apart on non-uniform backgrounds.</p><p class="lead">In this article, I’ll show a simple way to create concave corners using an <em>open-source CSS library</em> that I built specifically to solve this problem.</p></header><article><h2>Why inverted corners are a pain</h2><p>Meet our hero in the screenshot below:</p><figure class="full-width"><img
src="/img/blog/nebocss/state-1.jpg"
alt="If you see a shape like the red outline — run"
title="If you see a shape like the red outline — run"
width="1830"
height="1078"><div><figcaption>If you see a shape like the red outline — run</figcaption></div></figure><p>The most common implementation usually looks like this:</p><ul><li><p>add extra wrappers and pseudo-elements;</p></li><li><p>absolutely position all the pieces;</p></li><li><p>tweak radii, sizes, and offsets.</p></li></ul><p>In practice, this gives you tons of code per corner and a fragile solution that’s painful to maintain.</p><p>Below is a screenshot from a popular video about concave corner implementations. What you see here is roughly one fifth of the total implementation code.</p><figure class="full-width"><img
src="/img/blog/nebocss/example-1.jpg"
alt="Example implementation by Kevin Powell"
title="Example implementation by Kevin Powell"
width="1654"
height="814"><div><figcaption>Example implementation by Kevin Powell</figcaption></div></figure><h3>Background issues</h3><p>Typical solutions work <em>only</em> on solid backgrounds.
As soon as the background becomes non-uniform, you have to switch to SVG.
And CSS pain turns into SVG pain.</p><h3>The dream solution for concave corners</h3><p>What does a developer dream of when facing a concave corner?</p><ul><li><p>a simple pure-CSS solution;</p></li><li><p>working out of the box, including on complex backgrounds;</p></li><li><p>native customization of corner size and shape.</p></li></ul><p>Good news: such a solution exists. It’s called <code>nebo.css</code>, and that’s what we’ll explore in this article. The name comes from the pattern itself — <strong>ne</strong>gative <strong>bo</strong>rder radius.</p><h2>Installing nebo.css and creating your first concave corner</h2><p><code>nebo.css</code> is a single CSS file, very much in the spirit of <code>normalize.css</code>: include it — and start using it. There’s no JavaScript inside, everything is done with pure CSS.</p><h3>Include the library</h3><pre><code class="xml"><link rel="stylesheet" href="nebo.css"></code></pre><p>That’s all you need to get started.</p><h3>Add a single corner to a card</h3><p>To add an inverted corner, the element needs the base class <code>nebo</code>. By default, the corner appears in the bottom-right.</p><pre><code class="xml"><article class="card nebo">...</article></code></pre><p>Result:</p><figure class="full-width"><img
src="/img/blog/nebocss/state-2.jpg"
alt="Concave corner with default parameters"
title="Concave corner with default parameters"
width="1830"
height="1078"><div><figcaption>Concave corner with default parameters</figcaption></div></figure><h3>Changing the corner position</h3><p>The position is controlled by modifiers:</p><ul><li><p><code>nebo--tr</code> — top right,</p></li><li><p><code>nebo--tl</code> — top left,</p></li><li><p><code>nebo--bl</code> — bottom left,</p></li><li><p><code>nebo--br</code> — bottom right.</p></li></ul><pre><code class="xml"><article class="card nebo nebo--tr">...</article></code></pre><p>Result:</p><figure class="full-width"><img
src="/img/blog/nebocss/state-3.jpg"
alt="Concave corners on different sides over a complex background"
title="Concave corners on different sides over a complex background"
width="1830"
height="1078"><div><figcaption>Concave corners on different sides over a complex background</figcaption></div></figure><p>At this point, an important thing becomes obvious: the corner works correctly <strong>even on non-uniform backgrounds</strong>, with no extra tricks.</p><h2>Basic customization</h2><p>All <code>nebo.css</code> parameters are controlled via native CSS variables that follow the standard cascade.</p><h3>Base radius: <code>--nb-r</code></h3><p>This variable controls the corner radii. The default value is <code>20px</code>. Let’s make it a bit smaller.</p><pre><code class="css">.nebo {
--nb-r: 16px;
}</code></pre><h3>Cutout width and height: <code>--nb-w</code> and <code>--nb-h</code></h3><p>These variables define additional offsets between the inner and outer radii.</p><pre><code class="css">.card--cat1 {
--nb-w: 42px;
--nb-h: 16px;
}</code></pre><p>Result:</p><figure class="full-width"><img
src="/img/blog/nebocss/state-4.jpg"
alt="Reduced radii with additional corner width and height"
title="Reduced radii with additional corner width and height"
width="1830"
height="1078"><div><figcaption>Reduced radii with additional corner width and height</figcaption></div></figure><h3>Different settings for different elements</h3><p>Since this is just the regular CSS cascade, each element can be customized independently:</p><pre><code class="css">.card--cat1 { --nb-w: 42px; --nb-h: 16px; }
.card--cat2 { --nb-w: 32px; --nb-h: 42px; }
.card--cat3 { --nb-w: 64px; --nb-h: 42px; }
.card--cat4 { --nb-w: 42px; --nb-h: 16px; }</code></pre><p>Result:</p><figure class="full-width"><img
src="/img/blog/nebocss/state-5.jpg"
alt="Different corner parameters for different cards"
title="Different corner parameters for different cards"
width="1830"
height="1078"><div><figcaption>Different corner parameters for different cards</figcaption></div></figure><p>By the way, corners render correctly even with zero values (<code>0px</code>) — just don’t forget the units.</p><h2>Multiple concave corners on a single element</h2><p><code>nebo.css</code> is intentionally designed around a simple rule: one element — one corner. But if you need more, there’s a proven technique — extra wrappers.</p><h3>Using wrappers</h3><pre><code class="xml"><div class="card-wrapper nebo nebo--bl">
<article class="card nebo nebo--tr">...</article>
</div></code></pre><p>Result:</p><figure class="full-width"><img
src="/img/blog/nebocss/state-6.jpg"
alt="Card with two concave corners"
title="Card with two concave corners"
width="1830"
height="1078"><div><figcaption>Card with two concave corners</figcaption></div></figure><p>Each level can be customized independently using CSS variables.
You can build three or even four corners — just by stacking wrappers.</p><h2>Advanced customization</h2><p>The base radius defined by <code>--nb-r</code> can be overridden separately for each of the three curves: two outer corners and the inner curve. Both horizontal and vertical radii can be set independently using six additional CSS variables:</p><pre><code class="css">--nb-cor1-rw,
--nb-cor1-rh,
--nb-cor2-rw,
--nb-cor2-rh,
--nb-curve-rw,
--nb-curve-rh,</code></pre><p>These variables allow you to create concave corners with very complex shapes. For example:</p><pre><code class="css">.card--cat1 {
--nb-r: 30px;
--nb-w: 0px;
--nb-h: 0px;
--nb-curve-rw: 120px;
--nb-curve-rh: 90px;
--nb-cor1-rw: 90px;
--nb-cor1-rh: 90px;
--nb-cor2-rw: 60px;
--nb-cor2-rh: 60px;
--_nb-smooth: 99.5%;
}</code></pre><p>Result:</p><figure class="full-width"><img
src="/img/blog/nebocss/state-7.jpg"
alt="Concave corner with different corner radii"
title="Concave corner with different corner radii"
width="1830"
height="1078"><div><figcaption>Concave corner with different corner radii</figcaption></div></figure><h2>Case study: a two-block card</h2><p>Now let’s look at a more realistic example — a card consisting of a top image block and a bottom content block.</p><h3>Markup</h3><pre><code class="xml"><div class="card">
<div class="card-header"></div>
<div class="card-body">
<div class="price">$114,000</div>
...
</div>
</div></code></pre><h3>Adding concave corners</h3><pre><code class="xml"><div class="card-header nebo nebo--bl"></div>
<div class="card-body nebo nebo--tr">...</div></code></pre><h3>Tuning parameters and merging blocks</h3><p>This example uses a quick and dirty trick with negative margins to pull the image block closer to the content block. The goal here was to demonstrate how easy it is to create the cutouts.</p><pre><code class="css">.card-header {
--nb-r: 10px;
--nb-w: 130px;
--nb-h: 44px;
margin-bottom: -54px;
}
.card-body {
--nb-r: 10px;
--nb-w: 160px;
--nb-h: 44px;
}</code></pre><p>Result:</p><figure class="full-width"><img
src="/img/blog/nebocss/state-8.jpg"
alt="Complex two-block card with concave corners"
title="Complex two-block card with concave corners"
width="1830"
height="1078"><div><figcaption>Complex two-block card with concave corners</figcaption></div></figure><p>Notice that everything works perfectly on non-uniform backgrounds.</p><h2>Where to get nebo.css</h2><p><code>nebo.css</code> is a free open-source library developed by the author. It’s hosted on GitHub.</p><p>Repository: <a href="https://github.com/htmlacademy/nebo.css" rel="noopener noreferrer nofollow">https://github.com/htmlacademy/nebo.css</a></p><p>You can include the library as a separate file or copy the code directly into your styles. Use it — and enjoy!</p><p>The complete code lives in an <a href="https://htmlacademy.org/tutorials/21">interactive, step-by-step demo</a> — you can go through the examples at your own pace and play with the parameters along the way.</p></article></section></div></div><footer class="page-footer page-footer--tiny"><div class="page-footer__inner"><p><a href="/docs/cookies">Cookies</a> ∙
<a href="/docs/privacy">Privacy</a> ∙
<a href="/docs/agreement">License Agreement</a> ∙
<a href="/docs/about">About</a> ∙
<a href="/contacts">Contacts</a> ∙
© HTML Academy OÜ, 2019−2026
</p><div class="page-footer__financial"><img src="https://assets.htmlacademy.org/img/visa-white.svg?cs=96e54ec8c587db9d4b1d8d328ffd87c2ebfd9555" alt="VISA" title="VISA" width="35" height="35"><img src="https://assets.htmlacademy.org/img/mastercard-horizontal.v2.svg" alt="Mastercard" title="Mastercard" width="35" height="35"></div></div></footer><div class="modal"><div class="modal__inner"><div class="modal__wrapper js-login hidden"><button class="modal__close icon-close" type="button" title="Close" data-modal="close"></button><h4 class="modal__header">Log in</h4><ul class="modal__social"><li class="modal__social-link modal__social-link--fb"><a href="/login/fb?redirect_url=%2Fblog%2Fconcave-corners-easy" rel="nofollow" title="Log in via Facebook"><svg aria-hidden="true"><use xlink:href="/img/sprites/general.svg#facebook"></use></svg></a></li><li class="modal__social-link modal__social-link--google"><a href="/login/google?redirect_url=%2Fblog%2Fconcave-corners-easy" rel="nofollow" title="Log in via Google"><svg height="30" width="30" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path fill="#ffffff" d="M457.732 216.625c2.628 14.041 4.063 28.743 4.063 44.098C461.796 380.688 381.481 466 260.204 466c-116.023 0-210-93.977-210-210s93.977-210 210-210c56.704 0 104.077 20.867 140.44 54.73l-59.204 59.197v-.135c-22.046-21.002-50-31.762-81.236-31.762-69.297 0-125.604 58.537-125.604 127.841 0 69.29 56.306 127.968 125.604 127.968 62.87 0 105.653-35.965 114.46-85.312h-114.46v-81.902h197.528z"/></svg></a></li></ul><div class="modal__or"><span>or</span></div><form class="modal__form form" action="/login?redirect_url=%2Fblog%2Fconcave-corners-easy" autocomplete="off" method="post" data-submit="o"><input type="hidden" name="csrf_name" value="csrf69aed57601f96"><input type="hidden" name="csrf_value" value="88e0b97d8ffa1c766968471de8e69499"><div class="form__group"><label class="sr-only" for="login-email">Email</label><input class="field field--text field--full-width" type="email" name="email" placeholder="Email" value="" id="login-email"></div><div class="form__group"><label class="sr-only" for="login-password">Password</label><input class="field field--text field--full-width ym-disable-keys" type="password" name="password" placeholder="Password" id="login-password"></div><input class="button button--full-width" type="submit" data-submit-text="Logging in…" value="Log in"></form><p class="modal__forgot-password"><a href="/recover" data-modal="open" data-value="recover">Forgot your password?</a></p><a class="modal__bottom-link" href="/signup" data-modal="open" data-value="register">Sign up</a></div><div class="modal__wrapper js-register hidden"><button class="modal__close icon-close" type="button" title="Close" data-modal="close"></button><h4 class="modal__header">Sign up</h4><ul class="modal__social"><li class="modal__social-link modal__social-link--fb"><a href="/login/fb?redirect_url=%2Fblog%2Fconcave-corners-easy" rel="nofollow" title="Log in via Facebook"><svg aria-hidden="true"><use xlink:href="/img/sprites/general.svg#facebook"></use></svg></a></li><li class="modal__social-link modal__social-link--google"><a href="/login/google?redirect_url=%2Fblog%2Fconcave-corners-easy" rel="nofollow" title="Log in via Google"><svg height="30" width="30" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><path fill="#ffffff" d="M457.732 216.625c2.628 14.041 4.063 28.743 4.063 44.098C461.796 380.688 381.481 466 260.204 466c-116.023 0-210-93.977-210-210s93.977-210 210-210c56.704 0 104.077 20.867 140.44 54.73l-59.204 59.197v-.135c-22.046-21.002-50-31.762-81.236-31.762-69.297 0-125.604 58.537-125.604 127.841 0 69.29 56.306 127.968 125.604 127.968 62.87 0 105.653-35.965 114.46-85.312h-114.46v-81.902h197.528z"/></svg></a></li></ul><div class="modal__or"><span>or</span></div><form class="modal__form form" action="/signup?redirect_url=%2Fblog%2Fconcave-corners-easy" autocomplete="off" method="post"><input type="hidden" name="csrf_name" value="csrf69aed57601f96"><input type="hidden" name="csrf_value" value="88e0b97d8ffa1c766968471de8e69499"><div class="form__group"><label class="sr-only" for="email">
Email
<span class="required"><span class="sr-only">Required field</span><span class="required__star">*</span></span></label><div class="form__group-fields"><input class="field field--text field--full-width" type="email" name="email" value="" id="email" required placeholder="Email"></div></div><div class="form__group"><label class="sr-only" for="password">
Password
<span class="required"><span class="sr-only">Required field</span><span class="required__star">*</span></span></label><div class="form__group-fields"><input class="field field--text field--full-width" type="password" name="password" value="" id="password" required placeholder="Password"></div></div><div class="form__group"><label class="checkbox"><input class="checkbox__input" type="checkbox" name="agreement" value="1" required><span class="checkbox__text"><span>By signing up, you agree to our <a href="/docs/agreement" target="_blank">License Agreement</a> and <a href="/docs/privacy" target="_blank">Privacy Policy</a>.</span></span></label></div><input class="button button--full-width" type="submit" data-submit-text="Signing up…" value="Sign up"></form><a class="modal__bottom-link" href="/login?redirect_url=%2Fblog%2Fconcave-corners-easy" data-modal="open" data-value="login">Log in</a></div><div class="modal__wrapper modal__wrapper--no-btn-bottom js-recover hidden"><button class="modal__close icon-close" type="button" title="Close" data-modal="close"></button><h4 class="modal__header">Restore access</h4><p class="modal__text-accent">Have you forgotten your password or lost access to your profile? Enter your email connected to your profile and we will send you a link to restore access.</p><form class="modal__form form" action="/recover" autocomplete="off" method="post" data-submit="o"><input type="hidden" name="csrf_name" value="csrf69aed57601f96"><input type="hidden" name="csrf_value" value="88e0b97d8ffa1c766968471de8e69499"><div class="form__group"><label class="sr-only" for="recovery-email">Email</label><input class="field field--text field--full-width" type="email" name="email" placeholder="Email" value="" id="recovery-email"></div><script src='https://www.google.com/recaptcha/api.js'></script><div class="form__group"><div class="g-recaptcha" data-sitekey="6LetCTEqAAAAANROWtPzfC7Rfg9iIRiRt2k2FPn7"></div></div><input class="button button--full-width" type="submit" data-submit-text="Sending…" value="Send"></form><p class="modal__text">Forgot to connect your email to the profile? Email us and we’ll help.</p></div></div></div><div class="banner-bottom" id="cookies_disclaimer_container"><div class="banner-bottom__inner"><p>We are using cookies to gather information which will help you use our website most effectively. You can read about this <a href="/docs/cookies">here</a> or disable this feature if you want. By continuing to browse the site, you agree to our use of cookies.</p><button class="button button--green" type="button" id="cookies_disclaimer_button">Agree</button></div></div><script type="text/javascript">
(function (n) {
var c = document.getElementById('cookies_disclaimer_container');
var b = document.getElementById('cookies_disclaimer_button');
b.onclick = function() {
c.remove();
var d = new Date();
d.setTime(d.getTime() + 60 * 60* 24 * 365 * 1000);
document.cookie = n + "=1; path=/; expires=" + d.toUTCString();
};
})('hidden_cookies_disclaimer');
</script><script async src="https://assets.htmlacademy.org/js/general.v274.js" data-assets="https://assets.htmlacademy.org" data-require="modal,form,nav"></script></body></html>