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:
alexandrev-tibco
2026-07-08 23:58:06 +02:00
parent ff67ea1e71
commit be7119f4b9
12 changed files with 375 additions and 238 deletions
@@ -103,12 +103,23 @@ enum DashboardLayoutStore {
UserDefaults.standard.removeObject(forKey: storageKey)
}
/// Calm 2.0 defaults: three zones state (total value), action (check-in),
/// context. Redundant cards start hidden: pending updates and streaks now
/// live inside the check-in card, period returns inside the hero. All remain
/// available via Customize.
private static let hiddenByDefault: Set<DashboardSection> = [
.momentumStreaks, .pendingUpdates, .periodReturns, .monthlySummary
]
private static func defaultConfigs() -> [DashboardSectionConfig] {
DashboardSection.allCases.map { section in
DashboardSectionConfig(
id: section.id,
isVisible: true,
isCollapsed: false
isVisible: !hiddenByDefault.contains(section),
isCollapsed: false,
// The check-in row is slim full width on the iPad grid so it
// reads as the "action" zone instead of leaving a gap cell.
columnSpan: section == .monthlyCheckIn ? 2 : 1
)
}
}