From 9b2000efc295e997c6f2e9bd6b706415772cf035 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Wed, 7 Jan 2026 15:26:51 +0100 Subject: [PATCH] fix: sun position arc overflow and revert user display MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Constrain arc height to fit within card boundaries - Scale radius down when arc would overflow on wider displays - Revert user display in section header, use debugPrint instead 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- CHANGELOG.md | 16 +++- .../widgets/dashboard_content.dart | 96 +++++++------------ lib/shared/widgets/sun_position_widget.dart | 20 +++- pubspec.yaml | 2 +- 4 files changed, 65 insertions(+), 69 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 481240b..a21364b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,13 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [1.5.5] - 2026-01-07 + +### Fixed + +- **Sun position arc overflow** - Arc now constrained to fit within card boundaries + - Prevents arc and sun/moon from overflowing on wider displays + - Scales radius down when arc height exceeds available space + +### Added + +- **Debug logging for environment user** - Logs authenticated user on environment data load + ## [1.5.4] - 2026-01-07 ### Added -- **User display in environment section** - Shows authenticated user in section header for debugging - - Displays `user: {username}` next to "Environment" header when data loads - - Helps diagnose user resolution issues with OIDC authentication +- User display in environment section header (reverted in 1.5.5) ## [1.5.3] - 2026-01-07 diff --git a/lib/features/front_hall/presentation/widgets/dashboard_content.dart b/lib/features/front_hall/presentation/widgets/dashboard_content.dart index 9d2ed43..d5bb660 100644 --- a/lib/features/front_hall/presentation/widgets/dashboard_content.dart +++ b/lib/features/front_hall/presentation/widgets/dashboard_content.dart @@ -129,62 +129,43 @@ class _DashboardContentState extends ConsumerState { const SizedBox(height: 24), // Environment - Sun, Weather, Forecast, Air Quality + const _SectionHeader(title: 'Environment', icon: Icons.eco), + const SizedBox(height: 8), environmentAsync.when( - data: (envData) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - _SectionHeader( - title: 'Environment', - icon: Icons.eco, - subtitle: envData.user != null ? 'user: ${envData.user}' : null, - ), - const SizedBox(height: 8), - _EnvironmentSection( - envData: envData, - onRefresh: () => ref.invalidate(environmentProvider), - ), - ], + data: (envData) { + // Debug: log user on first load + debugPrint('Environment API user: ${envData.user}'); + return _EnvironmentSection( + envData: envData, + onRefresh: () => ref.invalidate(environmentProvider), + ); + }, + loading: () => const Card( + child: Padding( + padding: EdgeInsets.all(32), + child: Center(child: CircularProgressIndicator()), + ), ), - loading: () => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const _SectionHeader(title: 'Environment', icon: Icons.eco), - const SizedBox(height: 8), - const Card( - child: Padding( - padding: EdgeInsets.all(32), - child: Center(child: CircularProgressIndicator()), - ), - ), - ], - ), - error: (error, _) => Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - const _SectionHeader(title: 'Environment', icon: Icons.eco), - const SizedBox(height: 8), - Card( - child: Padding( - padding: const EdgeInsets.all(16), - child: Row( - children: [ - Icon(Icons.error_outline, color: colorScheme.error), - const SizedBox(width: 12), - Expanded( - child: Text( - 'Failed to load environment data', - style: TextStyle(color: colorScheme.error), - ), - ), - IconButton( - icon: const Icon(Icons.refresh), - onPressed: () => ref.invalidate(environmentProvider), - ), - ], + error: (error, _) => Card( + child: Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + Icon(Icons.error_outline, color: colorScheme.error), + const SizedBox(width: 12), + Expanded( + child: Text( + 'Failed to load environment data', + style: TextStyle(color: colorScheme.error), + ), ), - ), + IconButton( + icon: const Icon(Icons.refresh), + onPressed: () => ref.invalidate(environmentProvider), + ), + ], ), - ], + ), ), ), const SizedBox(height: 24), @@ -208,12 +189,10 @@ class _SectionHeader extends StatelessWidget { const _SectionHeader({ required this.title, required this.icon, - this.subtitle, }); final String title; final IconData icon; - final String? subtitle; @override Widget build(BuildContext context) { @@ -234,15 +213,6 @@ class _SectionHeader extends StatelessWidget { fontWeight: FontWeight.w500, ), ), - if (subtitle != null) ...[ - const SizedBox(width: 8), - Text( - subtitle!, - style: Theme.of(context).textTheme.labelSmall?.copyWith( - color: colorScheme.outline, - ), - ), - ], ], ); } diff --git a/lib/shared/widgets/sun_position_widget.dart b/lib/shared/widgets/sun_position_widget.dart index 32fe1c3..63e335d 100644 --- a/lib/shared/widgets/sun_position_widget.dart +++ b/lib/shared/widgets/sun_position_widget.dart @@ -386,7 +386,15 @@ class _SunArcPainter extends CustomPainter { // Calculate radius so arc endpoints touch horizon // For a chord of width W and arc angle θ: R = W / (2 * sin(θ/2)) - final radius = horizonWidth / (2 * math.sin(clampedAngle / 2)); + var radius = horizonWidth / (2 * math.sin(clampedAngle / 2)); + + // Constrain arc height to fit within available space (leave 25px margin for sun) + final maxArcHeight = size.height - horizonY - 25; + final arcHeight = radius * (1 - math.cos(clampedAngle / 2)); + if (arcHeight > maxArcHeight) { + // Scale radius down to fit + radius = maxArcHeight / (1 - math.cos(clampedAngle / 2)); + } // Arc center is below the horizon for an upward-bulging arc // Distance from chord to center = R * cos(θ/2) @@ -491,7 +499,15 @@ class _SunArcPainter extends CustomPainter { final clampedAngle = arcAngle.clamp(math.pi / 6, math.pi); // Calculate radius so arc endpoints touch horizon - final radius = horizonWidth / (2 * math.sin(clampedAngle / 2)); + var radius = horizonWidth / (2 * math.sin(clampedAngle / 2)); + + // Constrain arc height to fit within available space (leave 20px margin for moon) + final maxArcHeight = size.height - horizonY - 20; + final arcHeight = radius * (1 - math.cos(clampedAngle / 2)); + if (arcHeight > maxArcHeight) { + // Scale radius down to fit + radius = maxArcHeight / (1 - math.cos(clampedAngle / 2)); + } // Arc center is below the horizon for an upward-bulging arc final horizonYPos = size.height - horizonY; diff --git a/pubspec.yaml b/pubspec.yaml index d895d99..bae6d95 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.5.4+1 +version: 1.5.5+1 environment: sdk: ^3.10.4