Warning: this is a close approximation to show the general approach. You will have to tweak the values to get exactly the shapes you need.
The child-outer
class needs a bit more height adjustment, but here's the basic idea of how to get to what you want ( kind of ). SVG is still the more polished way to go
Check the preview in full screen though :)
body{
display: flex;
align-items: flex-end;
justify-content: center;
height: 100vh;
width:100%;
background: #15172b;
padding-top: 100px;
}
.parent{
z-index: 1;
background: #1c2035;
width: 586px;
height: 200px;
border-radius: 30px 30px 0 0;
position:relative;
}
.overlay {
z-index:3;
width: 586px;
height: 200px;
background: #15172b;
position: absolute;
top:-204px;
}
.left{
border-left: 4px solid #2e3247;
border-top: 4px solid #2e3247;
border-radius: 30px 30px 0 0;
background: #1c2035;
height: 200px;
width: 180px;
position:absolute;
top: -4px;
left: -4px;
}
.right{
border-right: 4px solid #2e3247;
border-top: 4px solid #2e3247;
border-radius: 30px 30px 0 0;
background: #1c2035;
height: 200px;
width: 180px;
position:absolute;
top: -4px;
right: -4px;
}
.child {
z-index: 4;
--circle-size: 80px;
width: var(--circle-size);
height: var(--circle-size);
background: black;
border-radius: 50%;
position: absolute;
left: 50%;
transform: translateX(-50%);
top: -129px;
border: 45px solid #25183e;
}
.child-border {
z-index: 4;
--circle-size: 166px;
width: var(--circle-size);
height: var(--circle-size);
border-radius: 50%;
position: absolute;
left: 50%;
transform: translateX(-50%);
top: -129px;
border: 4px solid #2e3247;
}
.child-outer {
z-index: 2;
--circle-size: 261px;
width: var(--circle-size);
height: var(--circle-size);
background: #15172b;
border-radius: 50%;
position: absolute;
left: 50%;
transform: translateX(-50%);
top: -179.5px;
border-bottom: 5px solid #2e3247;
}
<div class="parent">
<div class="left"></div>
<div class="child"></div>
<div class="child-border"></div>
<div class="child-outer"></div>
<div class="right"></div>
<div class="overlay"></div>
</div>