Calm 2.0 Fase 1: sistema de diseño limpio + Home en 3 zonas (1.5.0 build 51)
Sistema: - AppBackground: fuera gradiente + formas decorativas → systemGroupedBackground plano en toda la app. La profundidad la da la jerarquía, no la decoración. Home (3 zonas: estado / acción / contexto): - TotalValueCard: hero tipográfico — número 44pt rounded sobre card limpia, chip de delta semántico (verde/rojo), sparkline de evolución 56pt estilo Stocks, fila secundaria YoY / inception / forecast. Fuera el gradiente azul. - MonthlyCheckInCard state-driven: pendiente → protagonista con progreso real de fuentes (N de M) y un CTA; completado → fila discreta con checkmark, próximo check-in y streak integrado. En iPad va a ancho completo bajo el hero (zona de acción), fuera del grid. - InsightsRow: de carrusel de chips a un insight único rotatorio (tap para ciclar, dots de posición). - Eliminados del top: streak badge (vive en el check-in) y banner de pending updates (el progreso del check-in lo comunica). - Defaults nuevos: momentumStreaks/pendingUpdates/periodReturns/monthlySummary ocultos por defecto (siguen disponibles en Customize; configs guardadas de usuarios existentes se respetan). - Strings nuevas en 7 idiomas (checkin_done_*, checkin_sources_progress). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WoScpmHdVj1aUf4rAp6hbe
This commit is contained in:
@@ -1,37 +1,13 @@
|
||||
import SwiftUI
|
||||
|
||||
// Calm 2.0: plain system grouped background — depth comes from content
|
||||
// hierarchy, not decoration (the old gradient + overflowing shapes also
|
||||
// intercepted touches on sibling views; see 1.4.2 build 50).
|
||||
struct AppBackground: View {
|
||||
var body: some View {
|
||||
GeometryReader { proxy in
|
||||
ZStack {
|
||||
LinearGradient(
|
||||
colors: [
|
||||
Color.appPrimary.opacity(0.15),
|
||||
Color.appSecondary.opacity(0.12),
|
||||
Color.appAccent.opacity(0.1)
|
||||
],
|
||||
startPoint: .topLeading,
|
||||
endPoint: .bottomTrailing
|
||||
)
|
||||
|
||||
Circle()
|
||||
.fill(Color.appPrimary.opacity(0.18))
|
||||
.frame(width: proxy.size.width * 0.7)
|
||||
.offset(x: -proxy.size.width * 0.35, y: -proxy.size.height * 0.35)
|
||||
|
||||
RoundedRectangle(cornerRadius: 120, style: .continuous)
|
||||
.fill(Color.appAccent.opacity(0.12))
|
||||
.frame(width: proxy.size.width * 0.8, height: proxy.size.height * 0.35)
|
||||
.rotationEffect(.degrees(-12))
|
||||
.offset(x: proxy.size.width * 0.2, y: proxy.size.height * 0.45)
|
||||
}
|
||||
Color(.systemGroupedBackground)
|
||||
.ignoresSafeArea()
|
||||
}
|
||||
// Purely decorative — must never intercept touches. The circle overflows
|
||||
// its panel's bounds (offset -35% width), and in side-by-side layouts it
|
||||
// floats OVER sibling views (e.g. the Charts sidebar on iPad), silently
|
||||
// swallowing every tap underneath.
|
||||
.allowsHitTesting(false)
|
||||
.allowsHitTesting(false)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user