Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f31967aa3e |
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [1.5.8] - 2026-01-08
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- **Bottom-aligned widget content** - All environment widgets now align content from the bottom
|
||||||
|
- Creates consistent visual baseline across Sun Position, Weather, Air Quality, and Forecast cards
|
||||||
|
- Footers (weather details, pollutants) sit at the same level across cards
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- **Wind direction in Weather** - Wind chip now shows direction (e.g., "SE 14 km/h")
|
||||||
|
|
||||||
## [1.5.7] - 2026-01-08
|
## [1.5.7] - 2026-01-08
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
@@ -69,14 +69,13 @@ class AirQualityWidget extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
|
|
||||||
// Content area with minimum height to match other widgets
|
// Content area with fixed height, content aligned to bottom
|
||||||
ConstrainedBox(
|
SizedBox(
|
||||||
constraints: const BoxConstraints(minHeight: 170),
|
height: 170,
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 8),
|
|
||||||
// AQI Display
|
// AQI Display
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -108,10 +108,11 @@ class ForecastWidget extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
|
|
||||||
// Content area with minimum height to match other widgets
|
// Content area with fixed height, content aligned to bottom
|
||||||
ConstrainedBox(
|
SizedBox(
|
||||||
constraints: const BoxConstraints(minHeight: 170),
|
height: 170,
|
||||||
child: Center(
|
child: Align(
|
||||||
|
alignment: Alignment.bottomCenter,
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
height: 110,
|
height: 110,
|
||||||
child: ListView.separated(
|
child: ListView.separated(
|
||||||
|
|||||||
@@ -71,14 +71,13 @@ class WeatherWidget extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
|
|
||||||
// Content area with minimum height to match other widgets
|
// Content area with fixed height, content aligned to bottom
|
||||||
ConstrainedBox(
|
SizedBox(
|
||||||
constraints: const BoxConstraints(minHeight: 170),
|
height: 170,
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisAlignment: MainAxisAlignment.end,
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(height: 8),
|
|
||||||
// Main weather display (matching AQI layout)
|
// Main weather display (matching AQI layout)
|
||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
@@ -167,8 +166,9 @@ class WeatherWidget extends StatelessWidget {
|
|||||||
if (weather.windSpeed != null)
|
if (weather.windSpeed != null)
|
||||||
_DetailChip(
|
_DetailChip(
|
||||||
label: 'Wind',
|
label: 'Wind',
|
||||||
value:
|
value: weather.windDirection != null
|
||||||
'${weather.windSpeed!.round()} ${weather.windUnit}',
|
? '${weather.windDirection} ${weather.windSpeed!.round()} ${weather.windUnit}'
|
||||||
|
: '${weather.windSpeed!.round()} ${weather.windUnit}',
|
||||||
),
|
),
|
||||||
if (weather.feelsLike != null)
|
if (weather.feelsLike != null)
|
||||||
_DetailChip(
|
_DetailChip(
|
||||||
@@ -341,6 +341,7 @@ WeatherData _fromApiData(api.WeatherData data) {
|
|||||||
icon: _getWeatherIcon(data.conditions, data.icon),
|
icon: _getWeatherIcon(data.conditions, data.icon),
|
||||||
humidity: data.humidity,
|
humidity: data.humidity,
|
||||||
windSpeed: data.windSpeed,
|
windSpeed: data.windSpeed,
|
||||||
|
windDirection: data.windDirection,
|
||||||
feelsLike: data.feelsLike,
|
feelsLike: data.feelsLike,
|
||||||
iconColor: _getWeatherColor(data.conditions),
|
iconColor: _getWeatherColor(data.conditions),
|
||||||
);
|
);
|
||||||
@@ -405,6 +406,7 @@ class WeatherData {
|
|||||||
this.unit = TemperatureUnit.celsius,
|
this.unit = TemperatureUnit.celsius,
|
||||||
this.humidity,
|
this.humidity,
|
||||||
this.windSpeed,
|
this.windSpeed,
|
||||||
|
this.windDirection,
|
||||||
this.windUnit = 'km/h',
|
this.windUnit = 'km/h',
|
||||||
this.feelsLike,
|
this.feelsLike,
|
||||||
this.iconColor,
|
this.iconColor,
|
||||||
@@ -417,6 +419,7 @@ class WeatherData {
|
|||||||
final TemperatureUnit unit;
|
final TemperatureUnit unit;
|
||||||
final int? humidity;
|
final int? humidity;
|
||||||
final double? windSpeed;
|
final double? windSpeed;
|
||||||
|
final String? windDirection;
|
||||||
final String windUnit;
|
final String windUnit;
|
||||||
final double? feelsLike;
|
final double? feelsLike;
|
||||||
final Color? iconColor;
|
final Color? iconColor;
|
||||||
|
|||||||
+1
-1
@@ -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
|
# 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
|
# 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.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 1.5.7+1
|
version: 1.5.8+1
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.10.4
|
sdk: ^3.10.4
|
||||||
|
|||||||
Reference in New Issue
Block a user