feat: update Sparkline and Widget components for improved layout and visuals

This commit is contained in:
2026-08-14 21:19:32 +07:00
parent 9bc96dbc2d
commit b641198bee
7 changed files with 68 additions and 17 deletions
+22 -6
View File
@@ -46,6 +46,9 @@ struct Sparkline: View {
var areaOpacity: Double = 0.25
/// Отступ справа в диаметрах точки: линия обрывается, не доходя до края.
var trailingRoom: CGFloat = 1.4
/// В карточке-герое график уходит под края виджета и левая кромка заливки
/// не видна. Отдельно стоящий график гасит её, иначе получается срез.
var isFullBleed: Bool = true
/// Больше точек глазом уже не различить, а форма тяжелеет.
private static let maxPoints = 96
@@ -66,12 +69,7 @@ struct Sparkline: View {
startPoint: .top, endPoint: .bottom
)
)
.mask(
LinearGradient(
colors: [.white, .white.opacity(0.25)],
startPoint: .leading, endPoint: .trailing
)
)
.mask(areaMask)
// Гало точки лежит под линией, ядро над ней.
if showPulse, let last = points.last {
@@ -104,6 +102,24 @@ struct Sparkline: View {
}
}
/// Горизонтальная маска заливки: свечение сосредоточено слева, как в макете.
private var areaMask: LinearGradient {
LinearGradient(
gradient: Gradient(stops: isFullBleed
? [
.init(color: .white, location: 0),
.init(color: .white.opacity(0.25), location: 1),
]
: [
.init(color: .white.opacity(0), location: 0),
.init(color: .white, location: 0.3),
.init(color: .white.opacity(0.3), location: 1),
]),
startPoint: .leading,
endPoint: .trailing
)
}
// MARK: - Геометрия
private func points(in size: CGSize) -> [CGPoint] {