.radial-progress { @circle-size: 16px; @circle-background: #d6dadc; @circle-color: #0eb23a; @inset-size: 6px; @inset-color: #ffffff; @transition-length: 0s; @shadow: 0px 0px 0px rgba(0,0,0,0.1); width: @circle-size; height: @circle-size; display: inline-block; background-color: @circle-background; border-radius: 50%; .circle { .mask, .fill, .shadow { width: @circle-size; height: @circle-size; position: absolute; border-radius: 50%; } .shadow { box-shadow: @shadow inset; } .mask, .fill { -webkit-backface-visibility: hidden; transition: -webkit-transform @transition-length; transition: -ms-transform @transition-length; transition: transform @transition-length; border-radius: 50%; } .mask { clip: rect(0px, @circle-size, @circle-size, @circle-size/2); .fill { clip: rect(0px, @circle-size/2, @circle-size, 0px); background-color: @circle-color; } } } .inset { width: @inset-size; height: @inset-size; position: absolute; margin-left: (@circle-size - @inset-size)/2; margin-top: (@circle-size - @inset-size)/2; background-color: @inset-color; border-radius: 50%; box-shadow: @shadow; } @i: 0; @increment: 180deg / 100; .loop (@i) when (@i <= 100) { &[data-progress="@{i}"] { .circle { .mask.full, .fill { -webkit-transform: rotate(@increment * @i); -ms-transform: rotate(@increment * @i); transform: rotate(@increment * @i); } .fill.fix { -webkit-transform: rotate(@increment * @i * 2); -ms-transform: rotate(@increment * @i * 2); transform: rotate(@increment * @i * 2); } } } .loop(@i + 1); } .loop(@i); }