- ContentView: un único TabView (sidebarAdaptable en iOS 18+) para todas las
size classes; desaparece el cambio de jerarquía iPhone/iPad, así abrir o
cerrar el Duo conserva el estado de cada pestaña. @SceneStorage de la tab.
- Fuentes y Diario: NavigationSplitView (lista + detalle a la vez en ancho
regular, stack colapsable en compacto) con selección nativa de List.
- Dashboard: Quick Update como .inspector (panel lateral junto a los gráficos
en regular, sheet en compacto).
- Gráficos: chartHeightScale (+35% de alto en regular) vía chartFrame(height:),
sin ignoresSafeArea en contenido interactivo.
- Liquid Glass (glassEffect) en las etiquetas flotantes del Diario en iOS 26+.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F1u4K16xy7eQVtgsYNZ9Vn
Bugs:
- Charts bloqueadas (intermitente) y tiles que no responden: el observer Combine
registraba el estado como actualizado ANTES de llamar a updateChartData, cuyo
guard de reentrada descartaba la llamada en silencio — reintentarlo era no-op
permanente. Ahora el bookkeeping vive dentro de updateChartData, las llamadas
reentrantes se colean en vez de descartarse, y selectChart computa en síncrono
(pulsar un tile es determinista y re-pulsar actúa de retry).
- Paywall sheet: movida del Group que cambia con el size class a cada layout —
en NavigationSplitView no llegaba a presentarse (tiles premium 'no hacían nada').
- Rolling 12M: el filtro de periodo no filtraba — el cálculo necesita histórico
completo para el lookback, pero ahora la salida respeta selectedTimeRange.
KPIs:
- El header de iPad muestra KPIs específicos del chart activo (los mismos que su
stats row) en vez de las 5 métricas de cartera fijas; las stats rows dentro de
las cards se ocultan en regular width para no duplicar (YoY opta por quedarse
al no tener equivalente en el header).
Compartir:
- Botón de compartir por chart (toolbar iPad + navbar iPhone): renderiza la
gráfica en una card con branding (BrandMark, KPIs, tagline, QR al App Store
con ct=chart_share) vía ImageRenderer y abre el share sheet con imagen + link.
- drawingGroup() se desactiva durante el export (ImageRenderer no rasteriza
capas Metal — salían en blanco). Strings nuevas en 7 idiomas.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WoScpmHdVj1aUf4rAp6hbe
- 151: contribución editable por snapshot en cualquier modo (quitado gate detailed)
con diálogo de propagación al editar: solo este / adelante / atrás / todos
(SnapshotRepository.propagateContribution, SnapshotFormViewModel.contributionChanged)
- 148: Period vs Period mostraba mal el último mes del period B — la agrupación usaba
chartMonth(for:) que aplicaba el grace-period del check-in a snapshots históricos;
ahora agrupa por mes calendario crudo
- 152: iPad Sources no saltaba entre fuentes — añadido .id() al SourceDetailView para
recrear el StateObject al cambiar de selección
- 146/147: Year vs Year con forecast del año en curso (asterisco de estimado) y KPIs
arriba / detalle debajo
- 145: card de contribución mensual en SourceDetailView
- Nuevas claves snapshot_contribution_propagate_* en los 7 idiomas
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015qUZrBusG82T37R7PeokqJ