diff --git a/app/Jobs/CheckVersionUpdateJob.php b/app/Jobs/CheckVersionUpdateJob.php index 0794688..c2413c0 100644 --- a/app/Jobs/CheckVersionUpdateJob.php +++ b/app/Jobs/CheckVersionUpdateJob.php @@ -156,7 +156,7 @@ class CheckVersionUpdateJob private function extractLatestVersion(array $response, bool $enablePrereleases): array { - if (! $enablePrereleases || ! is_array($response) || ! isset($response[0])) { + if (! $enablePrereleases || ! isset($response[0])) { return [ Arr::get($response, 'tag_name'), $response, diff --git a/app/Models/DeviceModel.php b/app/Models/DeviceModel.php index f2a757f..7142829 100644 --- a/app/Models/DeviceModel.php +++ b/app/Models/DeviceModel.php @@ -4,11 +4,13 @@ declare(strict_types=1); namespace App\Models; +use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; /** + * @property-read array $css_variables * @property-read DevicePalette|null $palette */ final class DeviceModel extends Model @@ -76,4 +78,37 @@ final class DeviceModel extends Model { return $this->belongsTo(DevicePalette::class, 'palette_id'); } + + /** + * Returns css_variables with --screen-w and --screen-h filled from width/height + * when puppeteer_window_size_strategy is v2 and they are not set. + * + * @return Attribute, array> + */ + protected function cssVariables(): Attribute + { + /** @var Attribute, array> */ + return Attribute::get( + /** @return array */ + function (mixed $value, array $attributes): array { + $vars = is_array($value) ? $value : (is_string($value) ? (json_decode($value, true) ?? []) : []); + + if (config('app.puppeteer_window_size_strategy') !== 'v2') { + return $vars; + } + + $width = $attributes['width'] ?? null; + $height = $attributes['height'] ?? null; + + if (empty($vars['--screen-w']) && $width !== null && $width !== '') { + $vars['--screen-w'] = is_numeric($width) ? (int) $width.'px' : (string) $width; + } + if (empty($vars['--screen-h']) && $height !== null && $height !== '') { + $vars['--screen-h'] = is_numeric($height) ? (int) $height.'px' : (string) $height; + } + + /** @var array $vars */ + return $vars; + }); + } } diff --git a/app/Services/ImageGenerationService.php b/app/Services/ImageGenerationService.php index 903a493..fa6f325 100644 --- a/app/Services/ImageGenerationService.php +++ b/app/Services/ImageGenerationService.php @@ -528,7 +528,7 @@ class ImageGenerationService 'deviceOrientation' => $deviceOrientation, 'colorDepth' => $colorDepth, 'scaleLevel' => $scaleLevel, - 'cssVariables' => $device->deviceModel?->css_variables, + 'cssVariables' => $device->deviceModel?->css_variables ?? [], ]; // Add plugin name for error screens diff --git a/storage/app/public/images/default-screens/setup-logo_1024_768_4_90.png b/storage/app/public/images/default-screens/setup-logo_1024_768_4_90.png new file mode 100644 index 0000000..f02b9e9 Binary files /dev/null and b/storage/app/public/images/default-screens/setup-logo_1024_768_4_90.png differ diff --git a/storage/app/public/images/default-screens/setup-logo_1648_824_8_0.png b/storage/app/public/images/default-screens/setup-logo_1648_824_8_0.png new file mode 100644 index 0000000..3bc23a9 Binary files /dev/null and b/storage/app/public/images/default-screens/setup-logo_1648_824_8_0.png differ diff --git a/storage/app/public/images/default-screens/setup-logo_1872_1404_12_90.png b/storage/app/public/images/default-screens/setup-logo_1872_1404_12_90.png new file mode 100644 index 0000000..1c04367 Binary files /dev/null and b/storage/app/public/images/default-screens/setup-logo_1872_1404_12_90.png differ diff --git a/storage/app/public/images/default-screens/setup-logo_1872_1404_4_0.png b/storage/app/public/images/default-screens/setup-logo_1872_1404_4_0.png new file mode 100644 index 0000000..6f9c2cb Binary files /dev/null and b/storage/app/public/images/default-screens/setup-logo_1872_1404_4_0.png differ diff --git a/storage/app/public/images/default-screens/setup-logo_1880_1264_4_90.png b/storage/app/public/images/default-screens/setup-logo_1880_1264_4_90.png new file mode 100644 index 0000000..a7a00d0 Binary files /dev/null and b/storage/app/public/images/default-screens/setup-logo_1880_1264_4_90.png differ diff --git a/storage/app/public/images/default-screens/setup-logo_1920_1080_8_0.png b/storage/app/public/images/default-screens/setup-logo_1920_1080_8_0.png new file mode 100644 index 0000000..1633f31 Binary files /dev/null and b/storage/app/public/images/default-screens/setup-logo_1920_1080_8_0.png differ diff --git a/storage/app/public/images/default-screens/setup-logo_1920_1440_4_90.png b/storage/app/public/images/default-screens/setup-logo_1920_1440_4_90.png new file mode 100644 index 0000000..f40d451 Binary files /dev/null and b/storage/app/public/images/default-screens/setup-logo_1920_1440_4_90.png differ diff --git a/storage/app/public/images/default-screens/setup-logo_2480_1860_8_90.png b/storage/app/public/images/default-screens/setup-logo_2480_1860_8_90.png new file mode 100644 index 0000000..ec4e753 Binary files /dev/null and b/storage/app/public/images/default-screens/setup-logo_2480_1860_8_90.png differ diff --git a/storage/app/public/images/default-screens/setup-logo_960_540_4_0.png b/storage/app/public/images/default-screens/setup-logo_960_540_4_0.png new file mode 100644 index 0000000..10e01ef Binary files /dev/null and b/storage/app/public/images/default-screens/setup-logo_960_540_4_0.png differ diff --git a/storage/app/public/images/default-screens/sleep_1024_768_4_90.png b/storage/app/public/images/default-screens/sleep_1024_768_4_90.png new file mode 100644 index 0000000..c17be3e Binary files /dev/null and b/storage/app/public/images/default-screens/sleep_1024_768_4_90.png differ diff --git a/storage/app/public/images/default-screens/sleep_1648_824_8_0.png b/storage/app/public/images/default-screens/sleep_1648_824_8_0.png new file mode 100644 index 0000000..e6f7b9e Binary files /dev/null and b/storage/app/public/images/default-screens/sleep_1648_824_8_0.png differ diff --git a/storage/app/public/images/default-screens/sleep_1872_1404_12_90.png b/storage/app/public/images/default-screens/sleep_1872_1404_12_90.png new file mode 100644 index 0000000..0f17642 Binary files /dev/null and b/storage/app/public/images/default-screens/sleep_1872_1404_12_90.png differ diff --git a/storage/app/public/images/default-screens/sleep_1872_1404_4_0.png b/storage/app/public/images/default-screens/sleep_1872_1404_4_0.png new file mode 100644 index 0000000..67e5a28 Binary files /dev/null and b/storage/app/public/images/default-screens/sleep_1872_1404_4_0.png differ diff --git a/storage/app/public/images/default-screens/sleep_1880_1264_4_90.png b/storage/app/public/images/default-screens/sleep_1880_1264_4_90.png new file mode 100644 index 0000000..37fa694 Binary files /dev/null and b/storage/app/public/images/default-screens/sleep_1880_1264_4_90.png differ diff --git a/storage/app/public/images/default-screens/sleep_1920_1080_8_0.png b/storage/app/public/images/default-screens/sleep_1920_1080_8_0.png new file mode 100644 index 0000000..c0f2ca0 Binary files /dev/null and b/storage/app/public/images/default-screens/sleep_1920_1080_8_0.png differ diff --git a/storage/app/public/images/default-screens/sleep_1920_1440_4_90.png b/storage/app/public/images/default-screens/sleep_1920_1440_4_90.png new file mode 100644 index 0000000..d190897 Binary files /dev/null and b/storage/app/public/images/default-screens/sleep_1920_1440_4_90.png differ diff --git a/storage/app/public/images/default-screens/sleep_2480_1860_8_90.png b/storage/app/public/images/default-screens/sleep_2480_1860_8_90.png new file mode 100644 index 0000000..f9c0a2c Binary files /dev/null and b/storage/app/public/images/default-screens/sleep_2480_1860_8_90.png differ diff --git a/storage/app/public/images/default-screens/sleep_800_480_1_0.png b/storage/app/public/images/default-screens/sleep_800_480_1_0.png new file mode 100644 index 0000000..6f1ec2e Binary files /dev/null and b/storage/app/public/images/default-screens/sleep_800_480_1_0.png differ diff --git a/storage/app/public/images/default-screens/sleep_800_480_2_0.png b/storage/app/public/images/default-screens/sleep_800_480_2_0.png new file mode 100644 index 0000000..ccd82b3 Binary files /dev/null and b/storage/app/public/images/default-screens/sleep_800_480_2_0.png differ diff --git a/storage/app/public/images/default-screens/sleep_960_540_4_0.png b/storage/app/public/images/default-screens/sleep_960_540_4_0.png new file mode 100644 index 0000000..cc9cbb6 Binary files /dev/null and b/storage/app/public/images/default-screens/sleep_960_540_4_0.png differ diff --git a/tests/Feature/ScreenCssVariablesTest.php b/tests/Feature/ScreenCssVariablesTest.php new file mode 100644 index 0000000..f5bfc12 --- /dev/null +++ b/tests/Feature/ScreenCssVariablesTest.php @@ -0,0 +1,100 @@ + '
test
', + 'cssVariables' => [ + '--screen-w' => '800px', + '--screen-h' => '480px', + ], + ])->render(); + + expect($html)->toContain(':root'); + expect($html)->toContain('--screen-w: 800px'); + expect($html)->toContain('--screen-h: 480px'); +}); + +test('DeviceModel css_variables attribute merges --screen-w and --screen-h from dimensions when not set', function (): void { + $deviceModel = DeviceModel::factory()->create([ + 'width' => 800, + 'height' => 480, + 'css_variables' => null, + ]); + + $vars = $deviceModel->css_variables; + + expect($vars)->toHaveKey('--screen-w', '800px'); + expect($vars)->toHaveKey('--screen-h', '480px'); +}); + +test('DeviceModel css_variables attribute does not override --screen-w and --screen-h when already set', function (): void { + $deviceModel = DeviceModel::factory()->create([ + 'width' => 800, + 'height' => 480, + 'css_variables' => [ + '--screen-w' => '1200px', + '--screen-h' => '900px', + ], + ]); + + $vars = $deviceModel->css_variables; + + expect($vars['--screen-w'])->toBe('1200px'); + expect($vars['--screen-h'])->toBe('900px'); +}); + +test('DeviceModel css_variables attribute fills only missing --screen-w or --screen-h from dimensions', function (): void { + $deviceModel = DeviceModel::factory()->create([ + 'width' => 800, + 'height' => 480, + 'css_variables' => [ + '--screen-w' => '640px', + ], + ]); + + $vars = $deviceModel->css_variables; + + expect($vars['--screen-w'])->toBe('640px'); + expect($vars['--screen-h'])->toBe('480px'); +}); + +test('DeviceModel css_variables attribute returns raw vars when strategy is not v2', function (): void { + Config::set('app.puppeteer_window_size_strategy', 'v1'); + + $deviceModel = DeviceModel::factory()->create([ + 'width' => 800, + 'height' => 480, + 'css_variables' => ['--custom' => 'value'], + ]); + + $vars = $deviceModel->css_variables; + + expect($vars)->toBe(['--custom' => 'value']); +}); + +test('device model css_variables are available via device relationship for rendering', function (): void { + Config::set('app.puppeteer_window_size_strategy', 'v2'); + + $deviceModel = DeviceModel::factory()->create([ + 'width' => 800, + 'height' => 480, + 'css_variables' => null, + ]); + $device = Device::factory()->create([ + 'device_model_id' => $deviceModel->id, + ]); + $device->load('deviceModel'); + + $vars = $device->deviceModel?->css_variables ?? []; + + expect($vars)->toHaveKey('--screen-w', '800px'); + expect($vars)->toHaveKey('--screen-h', '480px'); +});