             break
         case .loading:
             for (i, circleLayer) in circleLayers.enumerated() {
-                circleLayer.opacity = 0.9
+                circleLayer.opacity = indicatorOpacity
                 circleLayer.strokeStart = 0
-                circleLayer.strokeEnd = 0.5
-                circleLayer.transform = CATransform3DIdentity
-                circleLayer.frame = bounds
-                circleLayer.path = NSBezierPath(ovalIn: bounds.insetBy(dx: -CGFloat(i) * 10, dy: -CGFloat(i) * 10)).cgPath
+                circleLayer.strokeEnd = LoadingIndicatorLayer.ArcLength
+                circleLayer.path = arcPath(for: i)
 
                 let rotatingAnimation = CAKeyframeAnimation(keyPath: "transform")
                 let maxAngle: CGFloat = i % 2 == 0 ? -6.28 : 6.28

        if let previousBounds = previousBounds, previousBounds.equalTo(bounds) {
            return
        }

        updateStatus()
        previousBounds = bounds

    open var status: Status = .idle {
        didSet {
            if oldValue != status {
                statusTransition(from: oldValue, to: status)
            }
        }
    }
