Compare commits

..

No commits in common. "cc2cb070da4d9fd84f6da55aba19e774027ce8df" and "e595a37a4df1df15e0868d1471bd429f190ee4a0" have entirely different histories.

21 changed files with 154 additions and 429 deletions

View file

@ -30,17 +30,6 @@ COPY --chown=www-data:www-data .env.example .env
# Install the composer dependencies # Install the composer dependencies
RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
# add extra fonts
RUN apk add --no-cache \
fontconfig \
font-noto \
font-noto-cjk-extra \
font-noto-emoji \
font-twemoji \
&& find /usr/share/fonts -name '*CJK*' ! -name '*Regular*' -delete \
&& fc-cache -f \
&& rm -rf /var/cache/fontconfig /var/cache/apk
######################## ########################
# Assets Image # Assets Image
######################## ########################

View file

@ -184,7 +184,7 @@ class GenerateDefaultImagesCommand extends Command
}; };
// Determine device properties from DeviceModel // Determine device properties from DeviceModel
$deviceVariant = $deviceModel->css_name ?? $deviceModel->name ?? 'og'; $deviceVariant = $deviceModel->name ?? 'og';
$colorDepth = $deviceModel->color_depth ?? '1bit'; // Use the accessor method $colorDepth = $deviceModel->color_depth ?? '1bit'; // Use the accessor method
$scaleLevel = $deviceModel->scale_level; // Use the accessor method $scaleLevel = $deviceModel->scale_level; // Use the accessor method
$darkMode = $imageType === 'sleep'; // Sleep mode uses dark mode, setup uses light mode $darkMode = $imageType === 'sleep'; // Sleep mode uses dark mode, setup uses light mode
@ -196,7 +196,6 @@ class GenerateDefaultImagesCommand extends Command
'deviceVariant' => $deviceVariant, 'deviceVariant' => $deviceVariant,
'colorDepth' => $colorDepth, 'colorDepth' => $colorDepth,
'scaleLevel' => $scaleLevel, 'scaleLevel' => $scaleLevel,
'cssVariables' => $deviceModel->css_variables,
])->render(); ])->render();
} }
} }

View file

@ -12,10 +12,8 @@ use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Str;
final class FetchDeviceModelsJob implements ShouldQueue final class FetchDeviceModelsJob implements ShouldQueue
{ {
@ -211,41 +209,12 @@ final class FetchDeviceModelsJob implements ShouldQueue
$attributes['palette_id'] = $firstPaletteId; $attributes['palette_id'] = $firstPaletteId;
} }
$attributes['css_name'] = $this->parseCssNameFromApi($modelData['css'] ?? null);
$attributes['css_variables'] = $this->parseCssVariablesFromApi($modelData['css'] ?? null);
DeviceModel::updateOrCreate( DeviceModel::updateOrCreate(
['name' => $name], ['name' => $name],
$attributes $attributes
); );
} }
/**
* Extract css_name from API css payload (strip "screen--" prefix from classes.device).
*/
private function parseCssNameFromApi(mixed $css): ?string
{
$deviceClass = is_array($css) ? Arr::get($css, 'classes.device') : null;
return (is_string($deviceClass) ? Str::after($deviceClass, 'screen--') : null) ?: null;
}
/**
* Extract css_variables from API css payload (convert [[key, value], ...] to associative array).
*/
private function parseCssVariablesFromApi(mixed $css): ?array
{
$pairs = is_array($css) ? Arr::get($css, 'variables', []) : [];
if (! is_array($pairs)) {
return null;
}
$validPairs = Arr::where($pairs, fn (mixed $pair): bool => is_array($pair) && isset($pair[0], $pair[1]));
$variables = Arr::pluck($validPairs, 1, 0);
return $variables !== [] ? $variables : null;
}
/** /**
* Get the first palette ID from model data. * Get the first palette ID from model data.
*/ */

View file

@ -27,7 +27,6 @@ final class DeviceModel extends Model
'offset_x' => 'integer', 'offset_x' => 'integer',
'offset_y' => 'integer', 'offset_y' => 'integer',
'published_at' => 'datetime', 'published_at' => 'datetime',
'css_variables' => 'array',
]; ];
public function getColorDepthAttribute(): ?string public function getColorDepthAttribute(): ?string

View file

@ -140,9 +140,8 @@ class PlaylistItem extends Model
if (! $this->isMashup()) { if (! $this->isMashup()) {
return view('trmnl-layouts.single', [ return view('trmnl-layouts.single', [
'colorDepth' => $device?->colorDepth(), 'colorDepth' => $device?->colorDepth(),
'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'deviceVariant' => $device?->deviceVariant() ?? 'og',
'scaleLevel' => $device?->scaleLevel(), 'scaleLevel' => $device?->scaleLevel(),
'cssVariables' => $device?->deviceModel?->css_variables,
'slot' => $this->plugin instanceof Plugin 'slot' => $this->plugin instanceof Plugin
? $this->plugin->render('full', false, $device) ? $this->plugin->render('full', false, $device)
: throw new Exception('Invalid plugin instance'), : throw new Exception('Invalid plugin instance'),
@ -163,9 +162,8 @@ class PlaylistItem extends Model
return view('trmnl-layouts.mashup', [ return view('trmnl-layouts.mashup', [
'colorDepth' => $device?->colorDepth(), 'colorDepth' => $device?->colorDepth(),
'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'deviceVariant' => $device?->deviceVariant() ?? 'og',
'scaleLevel' => $device?->scaleLevel(), 'scaleLevel' => $device?->scaleLevel(),
'cssVariables' => $device?->deviceModel?->css_variables,
'mashupLayout' => $this->getMashupLayoutType(), 'mashupLayout' => $this->getMashupLayoutType(),
'slot' => implode('', $pluginMarkups), 'slot' => implode('', $pluginMarkups),
])->render(); ])->render();

View file

@ -584,11 +584,10 @@ class Plugin extends Model
if ($size === 'full') { if ($size === 'full') {
return view('trmnl-layouts.single', [ return view('trmnl-layouts.single', [
'colorDepth' => $device?->colorDepth(), 'colorDepth' => $device?->colorDepth(),
'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'deviceVariant' => $device?->deviceVariant() ?? 'og',
'noBleed' => $this->no_bleed, 'noBleed' => $this->no_bleed,
'darkMode' => $this->dark_mode, 'darkMode' => $this->dark_mode,
'scaleLevel' => $device?->scaleLevel(), 'scaleLevel' => $device?->scaleLevel(),
'cssVariables' => $device?->deviceModel?->css_variables,
'slot' => $renderedContent, 'slot' => $renderedContent,
])->render(); ])->render();
} }
@ -596,10 +595,9 @@ class Plugin extends Model
return view('trmnl-layouts.mashup', [ return view('trmnl-layouts.mashup', [
'mashupLayout' => $this->getPreviewMashupLayoutForSize($size), 'mashupLayout' => $this->getPreviewMashupLayoutForSize($size),
'colorDepth' => $device?->colorDepth(), 'colorDepth' => $device?->colorDepth(),
'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'deviceVariant' => $device?->deviceVariant() ?? 'og',
'darkMode' => $this->dark_mode, 'darkMode' => $this->dark_mode,
'scaleLevel' => $device?->scaleLevel(), 'scaleLevel' => $device?->scaleLevel(),
'cssVariables' => $device?->deviceModel?->css_variables,
'slot' => $renderedContent, 'slot' => $renderedContent,
])->render(); ])->render();
@ -619,11 +617,10 @@ class Plugin extends Model
if ($size === 'full') { if ($size === 'full') {
return view('trmnl-layouts.single', [ return view('trmnl-layouts.single', [
'colorDepth' => $device?->colorDepth(), 'colorDepth' => $device?->colorDepth(),
'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'deviceVariant' => $device?->deviceVariant() ?? 'og',
'noBleed' => $this->no_bleed, 'noBleed' => $this->no_bleed,
'darkMode' => $this->dark_mode, 'darkMode' => $this->dark_mode,
'scaleLevel' => $device?->scaleLevel(), 'scaleLevel' => $device?->scaleLevel(),
'cssVariables' => $device?->deviceModel?->css_variables,
'slot' => $renderedView, 'slot' => $renderedView,
])->render(); ])->render();
} }
@ -631,10 +628,9 @@ class Plugin extends Model
return view('trmnl-layouts.mashup', [ return view('trmnl-layouts.mashup', [
'mashupLayout' => $this->getPreviewMashupLayoutForSize($size), 'mashupLayout' => $this->getPreviewMashupLayoutForSize($size),
'colorDepth' => $device?->colorDepth(), 'colorDepth' => $device?->colorDepth(),
'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'deviceVariant' => $device?->deviceVariant() ?? 'og',
'darkMode' => $this->dark_mode, 'darkMode' => $this->dark_mode,
'scaleLevel' => $device?->scaleLevel(), 'scaleLevel' => $device?->scaleLevel(),
'cssVariables' => $device?->deviceModel?->css_variables,
'slot' => $renderedView, 'slot' => $renderedView,
])->render(); ])->render();
} }

View file

@ -514,7 +514,7 @@ class ImageGenerationService
}; };
// Determine device properties from DeviceModel or device settings // Determine device properties from DeviceModel or device settings
$deviceVariant = $device->deviceModel?->css_name ?? $device->deviceVariant(); $deviceVariant = $device->deviceVariant();
$deviceOrientation = $device->rotate > 0 ? 'portrait' : 'landscape'; $deviceOrientation = $device->rotate > 0 ? 'portrait' : 'landscape';
$colorDepth = $device->colorDepth() ?? '1bit'; $colorDepth = $device->colorDepth() ?? '1bit';
$scaleLevel = $device->scaleLevel(); $scaleLevel = $device->scaleLevel();
@ -528,7 +528,6 @@ class ImageGenerationService
'deviceOrientation' => $deviceOrientation, 'deviceOrientation' => $deviceOrientation,
'colorDepth' => $colorDepth, 'colorDepth' => $colorDepth,
'scaleLevel' => $scaleLevel, 'scaleLevel' => $scaleLevel,
'cssVariables' => $device->deviceModel?->css_variables,
]; ];
// Add plugin name for error screens // Add plugin name for error screens

View file

@ -15,8 +15,8 @@
"ext-imagick": "*", "ext-imagick": "*",
"ext-simplexml": "*", "ext-simplexml": "*",
"ext-zip": "*", "ext-zip": "*",
"bnussbau/laravel-trmnl-blade": "^2.3", "bnussbau/laravel-trmnl-blade": "2.3.*",
"bnussbau/trmnl-pipeline-php": "^0.8", "bnussbau/trmnl-pipeline-php": "0.7.*",
"keepsuit/laravel-liquid": "^0.5.2", "keepsuit/laravel-liquid": "^0.5.2",
"laravel/fortify": "^1.30", "laravel/fortify": "^1.30",
"laravel/framework": "^12.1", "laravel/framework": "^12.1",

248
composer.lock generated
View file

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "a1b56974da6a4f33fe847dba0549a6e0", "content-hash": "909d7acdf3f0ace9fb6d20b4de1eeaca",
"packages": [ "packages": [
{ {
"name": "aws/aws-crt-php", "name": "aws/aws-crt-php",
@ -62,16 +62,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.369.36", "version": "3.369.32",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0" "reference": "4779292a30aa2d4a7ddfd519f80a94c2706ee64e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4779292a30aa2d4a7ddfd519f80a94c2706ee64e",
"reference": "2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0", "reference": "4779292a30aa2d4a7ddfd519f80a94c2706ee64e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -153,9 +153,9 @@
"support": { "support": {
"forum": "https://github.com/aws/aws-sdk-php/discussions", "forum": "https://github.com/aws/aws-sdk-php/discussions",
"issues": "https://github.com/aws/aws-sdk-php/issues", "issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.369.36" "source": "https://github.com/aws/aws-sdk-php/tree/3.369.32"
}, },
"time": "2026-02-17T19:45:01+00:00" "time": "2026-02-11T19:29:10+00:00"
}, },
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@ -298,16 +298,16 @@
}, },
{ {
"name": "bnussbau/trmnl-pipeline-php", "name": "bnussbau/trmnl-pipeline-php",
"version": "0.8.0", "version": "0.7.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/bnussbau/trmnl-pipeline-php.git", "url": "https://github.com/bnussbau/trmnl-pipeline-php.git",
"reference": "f7c86bf655d6f8ddd88e48575d0c9588c33eb07b" "reference": "da80de2b6456776eeabc1fb95fd42e5f3357d865"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/bnussbau/trmnl-pipeline-php/zipball/f7c86bf655d6f8ddd88e48575d0c9588c33eb07b", "url": "https://api.github.com/repos/bnussbau/trmnl-pipeline-php/zipball/da80de2b6456776eeabc1fb95fd42e5f3357d865",
"reference": "f7c86bf655d6f8ddd88e48575d0c9588c33eb07b", "reference": "da80de2b6456776eeabc1fb95fd42e5f3357d865",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -349,7 +349,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/bnussbau/trmnl-pipeline-php/issues", "issues": "https://github.com/bnussbau/trmnl-pipeline-php/issues",
"source": "https://github.com/bnussbau/trmnl-pipeline-php/tree/0.8.0" "source": "https://github.com/bnussbau/trmnl-pipeline-php/tree/0.7.0"
}, },
"funding": [ "funding": [
{ {
@ -365,7 +365,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2026-02-12T16:53:44+00:00" "time": "2026-02-07T22:22:18+00:00"
}, },
{ {
"name": "brick/math", "name": "brick/math",
@ -1894,16 +1894,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v12.52.0", "version": "v12.51.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "d5511fa74f4608dbb99864198b1954042aa8d5a7" "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/d5511fa74f4608dbb99864198b1954042aa8d5a7", "url": "https://api.github.com/repos/laravel/framework/zipball/ce4de3feb211e47c4f959d309ccf8a2733b1bc16",
"reference": "d5511fa74f4608dbb99864198b1954042aa8d5a7", "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2112,7 +2112,7 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2026-02-17T17:07:04+00:00" "time": "2026-02-10T18:20:19+00:00"
}, },
{ {
"name": "laravel/prompts", "name": "laravel/prompts",
@ -3128,16 +3128,16 @@
}, },
{ {
"name": "livewire/flux", "name": "livewire/flux",
"version": "v2.12.1", "version": "v2.12.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/livewire/flux.git", "url": "https://github.com/livewire/flux.git",
"reference": "24c139b97b6df1e67c0235637f0e08c206bf4486" "reference": "78bc26f54a29c28ff916751b9f796f4ce1592003"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/livewire/flux/zipball/24c139b97b6df1e67c0235637f0e08c206bf4486", "url": "https://api.github.com/repos/livewire/flux/zipball/78bc26f54a29c28ff916751b9f796f4ce1592003",
"reference": "24c139b97b6df1e67c0235637f0e08c206bf4486", "reference": "78bc26f54a29c28ff916751b9f796f4ce1592003",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3150,7 +3150,7 @@
"symfony/console": "^6.0|^7.0" "symfony/console": "^6.0|^7.0"
}, },
"conflict": { "conflict": {
"livewire/blaze": "<1.0.0-beta.2" "livewire/blaze": "<1.0.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -3188,9 +3188,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/livewire/flux/issues", "issues": "https://github.com/livewire/flux/issues",
"source": "https://github.com/livewire/flux/tree/v2.12.1" "source": "https://github.com/livewire/flux/tree/v2.12.0"
}, },
"time": "2026-02-17T21:12:27+00:00" "time": "2026-02-09T23:35:27+00:00"
}, },
{ {
"name": "livewire/livewire", "name": "livewire/livewire",
@ -3687,16 +3687,16 @@
}, },
{ {
"name": "nette/utils", "name": "nette/utils",
"version": "v4.1.3", "version": "v4.1.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nette/utils.git", "url": "https://github.com/nette/utils.git",
"reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", "url": "https://api.github.com/repos/nette/utils/zipball/f76b5dc3d6c6d3043c8d937df2698515b99cbaf5",
"reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3708,10 +3708,8 @@
}, },
"require-dev": { "require-dev": {
"jetbrains/phpstorm-attributes": "^1.2", "jetbrains/phpstorm-attributes": "^1.2",
"nette/phpstan-rules": "^1.0",
"nette/tester": "^2.5", "nette/tester": "^2.5",
"phpstan/extension-installer": "^1.4@stable", "phpstan/phpstan": "^2.0@stable",
"phpstan/phpstan": "^2.1@stable",
"tracy/tracy": "^2.9" "tracy/tracy": "^2.9"
}, },
"suggest": { "suggest": {
@ -3772,9 +3770,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/nette/utils/issues", "issues": "https://github.com/nette/utils/issues",
"source": "https://github.com/nette/utils/tree/v4.1.3" "source": "https://github.com/nette/utils/tree/v4.1.2"
}, },
"time": "2026-02-13T03:05:33+00:00" "time": "2026-02-03T17:21:09+00:00"
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
@ -3836,31 +3834,31 @@
}, },
{ {
"name": "nunomaduro/termwind", "name": "nunomaduro/termwind",
"version": "v2.4.0", "version": "v2.3.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nunomaduro/termwind.git", "url": "https://github.com/nunomaduro/termwind.git",
"reference": "712a31b768f5daea284c2169a7d227031001b9a8" "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8", "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/6fb2a640ff502caace8e05fd7be3b503a7e1c017",
"reference": "712a31b768f5daea284c2169a7d227031001b9a8", "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"ext-mbstring": "*", "ext-mbstring": "*",
"php": "^8.2", "php": "^8.2",
"symfony/console": "^7.4.4 || ^8.0.4" "symfony/console": "^7.3.6"
}, },
"require-dev": { "require-dev": {
"illuminate/console": "^11.47.0", "illuminate/console": "^11.46.1",
"laravel/pint": "^1.27.1", "laravel/pint": "^1.25.1",
"mockery/mockery": "^1.6.12", "mockery/mockery": "^1.6.12",
"pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2", "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.1.3",
"phpstan/phpstan": "^1.12.32", "phpstan/phpstan": "^1.12.32",
"phpstan/phpstan-strict-rules": "^1.6.2", "phpstan/phpstan-strict-rules": "^1.6.2",
"symfony/var-dumper": "^7.3.5 || ^8.0.4", "symfony/var-dumper": "^7.3.5",
"thecodingmachine/phpstan-strict-rules": "^1.0.0" "thecodingmachine/phpstan-strict-rules": "^1.0.0"
}, },
"type": "library", "type": "library",
@ -3892,7 +3890,7 @@
"email": "enunomaduro@gmail.com" "email": "enunomaduro@gmail.com"
} }
], ],
"description": "It's like Tailwind CSS, but for the console.", "description": "Its like Tailwind CSS, but for the console.",
"keywords": [ "keywords": [
"cli", "cli",
"console", "console",
@ -3903,7 +3901,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/nunomaduro/termwind/issues", "issues": "https://github.com/nunomaduro/termwind/issues",
"source": "https://github.com/nunomaduro/termwind/tree/v2.4.0" "source": "https://github.com/nunomaduro/termwind/tree/v2.3.3"
}, },
"funding": [ "funding": [
{ {
@ -3919,7 +3917,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2026-02-16T23:10:27+00:00" "time": "2025-11-20T02:34:59+00:00"
}, },
{ {
"name": "om/icalparser", "name": "om/icalparser",
@ -8538,16 +8536,16 @@
"packages-dev": [ "packages-dev": [
{ {
"name": "brianium/paratest", "name": "brianium/paratest",
"version": "v7.19.0", "version": "v7.17.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/paratestphp/paratest.git", "url": "https://github.com/paratestphp/paratest.git",
"reference": "7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6" "reference": "53cb90a6aa3ef3840458781600628ade058a18b9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/paratestphp/paratest/zipball/7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6", "url": "https://api.github.com/repos/paratestphp/paratest/zipball/53cb90a6aa3ef3840458781600628ade058a18b9",
"reference": "7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6", "reference": "53cb90a6aa3ef3840458781600628ade058a18b9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -8558,13 +8556,13 @@
"fidry/cpu-core-counter": "^1.3.0", "fidry/cpu-core-counter": "^1.3.0",
"jean85/pretty-package-versions": "^2.1.1", "jean85/pretty-package-versions": "^2.1.1",
"php": "~8.3.0 || ~8.4.0 || ~8.5.0", "php": "~8.3.0 || ~8.4.0 || ~8.5.0",
"phpunit/php-code-coverage": "^12.5.3 || ^13.0.1", "phpunit/php-code-coverage": "^12.5.2",
"phpunit/php-file-iterator": "^6.0.1 || ^7", "phpunit/php-file-iterator": "^6",
"phpunit/php-timer": "^8 || ^9", "phpunit/php-timer": "^8",
"phpunit/phpunit": "^12.5.9 || ^13", "phpunit/phpunit": "^12.5.8",
"sebastian/environment": "^8.0.3 || ^9", "sebastian/environment": "^8.0.3",
"symfony/console": "^7.4.4 || ^8.0.4", "symfony/console": "^7.3.4 || ^8.0.0",
"symfony/process": "^7.4.5 || ^8.0.5" "symfony/process": "^7.3.4 || ^8.0.0"
}, },
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^14.0.0", "doctrine/coding-standard": "^14.0.0",
@ -8575,7 +8573,7 @@
"phpstan/phpstan-deprecation-rules": "^2.0.3", "phpstan/phpstan-deprecation-rules": "^2.0.3",
"phpstan/phpstan-phpunit": "^2.0.12", "phpstan/phpstan-phpunit": "^2.0.12",
"phpstan/phpstan-strict-rules": "^2.0.8", "phpstan/phpstan-strict-rules": "^2.0.8",
"symfony/filesystem": "^7.4.0 || ^8.0.1" "symfony/filesystem": "^7.3.2 || ^8.0.0"
}, },
"bin": [ "bin": [
"bin/paratest", "bin/paratest",
@ -8615,7 +8613,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/paratestphp/paratest/issues", "issues": "https://github.com/paratestphp/paratest/issues",
"source": "https://github.com/paratestphp/paratest/tree/v7.19.0" "source": "https://github.com/paratestphp/paratest/tree/v7.17.0"
}, },
"funding": [ "funding": [
{ {
@ -8627,7 +8625,7 @@
"type": "paypal" "type": "paypal"
} }
], ],
"time": "2026-02-06T10:53:26+00:00" "time": "2026-02-05T09:14:44+00:00"
}, },
{ {
"name": "fakerphp/faker", "name": "fakerphp/faker",
@ -9068,16 +9066,16 @@
}, },
{ {
"name": "laravel/boost", "name": "laravel/boost",
"version": "v2.1.6", "version": "v2.1.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/boost.git", "url": "https://github.com/laravel/boost.git",
"reference": "b8923e6131e5b705da299891284d327562445618" "reference": "b96e0ab547d51d3810498dcc4d5535486991df6f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/boost/zipball/b8923e6131e5b705da299891284d327562445618", "url": "https://api.github.com/repos/laravel/boost/zipball/b96e0ab547d51d3810498dcc4d5535486991df6f",
"reference": "b8923e6131e5b705da299891284d327562445618", "reference": "b96e0ab547d51d3810498dcc4d5535486991df6f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9130,20 +9128,20 @@
"issues": "https://github.com/laravel/boost/issues", "issues": "https://github.com/laravel/boost/issues",
"source": "https://github.com/laravel/boost" "source": "https://github.com/laravel/boost"
}, },
"time": "2026-02-16T23:53:14+00:00" "time": "2026-02-11T19:22:04+00:00"
}, },
{ {
"name": "laravel/mcp", "name": "laravel/mcp",
"version": "v0.5.9", "version": "v0.5.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/mcp.git", "url": "https://github.com/laravel/mcp.git",
"reference": "39e8da60eb7bce4737c5d868d35a3fe78938c129" "reference": "87905978bf2a230d6c01f8d03e172249e37917f7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/mcp/zipball/39e8da60eb7bce4737c5d868d35a3fe78938c129", "url": "https://api.github.com/repos/laravel/mcp/zipball/87905978bf2a230d6c01f8d03e172249e37917f7",
"reference": "39e8da60eb7bce4737c5d868d35a3fe78938c129", "reference": "87905978bf2a230d6c01f8d03e172249e37917f7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9203,7 +9201,7 @@
"issues": "https://github.com/laravel/mcp/issues", "issues": "https://github.com/laravel/mcp/issues",
"source": "https://github.com/laravel/mcp" "source": "https://github.com/laravel/mcp"
}, },
"time": "2026-02-17T19:05:53+00:00" "time": "2026-02-09T22:08:43+00:00"
}, },
{ {
"name": "laravel/pail", "name": "laravel/pail",
@ -9621,36 +9619,39 @@
}, },
{ {
"name": "nunomaduro/collision", "name": "nunomaduro/collision",
"version": "v8.9.1", "version": "v8.8.3",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nunomaduro/collision.git", "url": "https://github.com/nunomaduro/collision.git",
"reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935" "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nunomaduro/collision/zipball/a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1dc9e88d105699d0fee8bb18890f41b274f6b4c4",
"reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"filp/whoops": "^2.18.4", "filp/whoops": "^2.18.1",
"nunomaduro/termwind": "^2.4.0", "nunomaduro/termwind": "^2.3.1",
"php": "^8.2.0", "php": "^8.2.0",
"symfony/console": "^7.4.4 || ^8.0.4" "symfony/console": "^7.3.0"
}, },
"conflict": { "conflict": {
"laravel/framework": "<11.48.0 || >=14.0.0", "laravel/framework": "<11.44.2 || >=13.0.0",
"phpunit/phpunit": "<11.5.50 || >=14.0.0" "phpunit/phpunit": "<11.5.15 || >=13.0.0"
}, },
"require-dev": { "require-dev": {
"brianium/paratest": "^7.8.5", "brianium/paratest": "^7.8.3",
"larastan/larastan": "^3.9.2", "larastan/larastan": "^3.4.2",
"laravel/framework": "^11.48.0 || ^12.52.0", "laravel/framework": "^11.44.2 || ^12.18",
"laravel/pint": "^1.27.1", "laravel/pint": "^1.22.1",
"orchestra/testbench-core": "^9.12.0 || ^10.9.0", "laravel/sail": "^1.43.1",
"pestphp/pest": "^3.8.5 || ^4.4.1 || ^5.0.0", "laravel/sanctum": "^4.1.1",
"sebastian/environment": "^7.2.1 || ^8.0.3 || ^9.0.0" "laravel/tinker": "^2.10.1",
"orchestra/testbench-core": "^9.12.0 || ^10.4",
"pestphp/pest": "^3.8.2 || ^4.0.0",
"sebastian/environment": "^7.2.1 || ^8.0"
}, },
"type": "library", "type": "library",
"extra": { "extra": {
@ -9713,45 +9714,45 @@
"type": "patreon" "type": "patreon"
} }
], ],
"time": "2026-02-17T17:33:08+00:00" "time": "2025-11-20T02:55:25+00:00"
}, },
{ {
"name": "pestphp/pest", "name": "pestphp/pest",
"version": "v4.4.1", "version": "v4.3.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/pestphp/pest.git", "url": "https://github.com/pestphp/pest.git",
"reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a" "reference": "3a4329ddc7a2b67c19fca8342a668b39be3ae398"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/pestphp/pest/zipball/f96a1b27864b585b0b29b0ee7331176726f7e54a", "url": "https://api.github.com/repos/pestphp/pest/zipball/3a4329ddc7a2b67c19fca8342a668b39be3ae398",
"reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a", "reference": "3a4329ddc7a2b67c19fca8342a668b39be3ae398",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"brianium/paratest": "^7.19.0", "brianium/paratest": "^7.16.1",
"nunomaduro/collision": "^8.9.0", "nunomaduro/collision": "^8.8.3",
"nunomaduro/termwind": "^2.4.0", "nunomaduro/termwind": "^2.3.3",
"pestphp/pest-plugin": "^4.0.0", "pestphp/pest-plugin": "^4.0.0",
"pestphp/pest-plugin-arch": "^4.0.0", "pestphp/pest-plugin-arch": "^4.0.0",
"pestphp/pest-plugin-mutate": "^4.0.1", "pestphp/pest-plugin-mutate": "^4.0.1",
"pestphp/pest-plugin-profanity": "^4.2.1", "pestphp/pest-plugin-profanity": "^4.2.1",
"php": "^8.3.0", "php": "^8.3.0",
"phpunit/phpunit": "^12.5.12", "phpunit/phpunit": "^12.5.8",
"symfony/process": "^7.4.5|^8.0.5" "symfony/process": "^7.4.4|^8.0.0"
}, },
"conflict": { "conflict": {
"filp/whoops": "<2.18.3", "filp/whoops": "<2.18.3",
"phpunit/phpunit": ">12.5.12", "phpunit/phpunit": ">12.5.8",
"sebastian/exporter": "<7.0.0", "sebastian/exporter": "<7.0.0",
"webmozart/assert": "<1.11.0" "webmozart/assert": "<1.11.0"
}, },
"require-dev": { "require-dev": {
"pestphp/pest-dev-tools": "^4.1.0", "pestphp/pest-dev-tools": "^4.0.0",
"pestphp/pest-plugin-browser": "^4.3.0", "pestphp/pest-plugin-browser": "^4.2.1",
"pestphp/pest-plugin-type-coverage": "^4.0.3", "pestphp/pest-plugin-type-coverage": "^4.0.3",
"psy/psysh": "^0.12.20" "psy/psysh": "^0.12.18"
}, },
"bin": [ "bin": [
"bin/pest" "bin/pest"
@ -9817,7 +9818,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/pestphp/pest/issues", "issues": "https://github.com/pestphp/pest/issues",
"source": "https://github.com/pestphp/pest/tree/v4.4.1" "source": "https://github.com/pestphp/pest/tree/v4.3.2"
}, },
"funding": [ "funding": [
{ {
@ -9829,7 +9830,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2026-02-17T15:27:18+00:00" "time": "2026-01-28T01:01:19+00:00"
}, },
{ {
"name": "pestphp/pest-plugin", "name": "pestphp/pest-plugin",
@ -10829,16 +10830,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "12.5.12", "version": "12.5.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "418e06b3b46b0d54bad749ff4907fc7dfb530199" "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/418e06b3b46b0d54bad749ff4907fc7dfb530199", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/37ddb96c14bfee10304825edbb7e66d341ec6889",
"reference": "418e06b3b46b0d54bad749ff4907fc7dfb530199", "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -10852,8 +10853,8 @@
"phar-io/manifest": "^2.0.4", "phar-io/manifest": "^2.0.4",
"phar-io/version": "^3.2.1", "phar-io/version": "^3.2.1",
"php": ">=8.3", "php": ">=8.3",
"phpunit/php-code-coverage": "^12.5.3", "phpunit/php-code-coverage": "^12.5.2",
"phpunit/php-file-iterator": "^6.0.1", "phpunit/php-file-iterator": "^6.0.0",
"phpunit/php-invoker": "^6.0.0", "phpunit/php-invoker": "^6.0.0",
"phpunit/php-text-template": "^5.0.0", "phpunit/php-text-template": "^5.0.0",
"phpunit/php-timer": "^8.0.0", "phpunit/php-timer": "^8.0.0",
@ -10864,7 +10865,6 @@
"sebastian/exporter": "^7.0.2", "sebastian/exporter": "^7.0.2",
"sebastian/global-state": "^8.0.2", "sebastian/global-state": "^8.0.2",
"sebastian/object-enumerator": "^7.0.0", "sebastian/object-enumerator": "^7.0.0",
"sebastian/recursion-context": "^7.0.1",
"sebastian/type": "^6.0.3", "sebastian/type": "^6.0.3",
"sebastian/version": "^6.0.0", "sebastian/version": "^6.0.0",
"staabm/side-effects-detector": "^1.0.5" "staabm/side-effects-detector": "^1.0.5"
@ -10907,7 +10907,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.12" "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.8"
}, },
"funding": [ "funding": [
{ {
@ -10931,7 +10931,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2026-02-16T08:34:36+00:00" "time": "2026-01-27T06:12:29+00:00"
}, },
{ {
"name": "rector/rector", "name": "rector/rector",
@ -11944,23 +11944,23 @@
}, },
{ {
"name": "ta-tikoma/phpunit-architecture-test", "name": "ta-tikoma/phpunit-architecture-test",
"version": "0.8.7", "version": "0.8.6",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git",
"reference": "1248f3f506ca9641d4f68cebcd538fa489754db8" "reference": "ad48430b92901fd7d003fdaf2d7b139f96c0906e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/1248f3f506ca9641d4f68cebcd538fa489754db8", "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/ad48430b92901fd7d003fdaf2d7b139f96c0906e",
"reference": "1248f3f506ca9641d4f68cebcd538fa489754db8", "reference": "ad48430b92901fd7d003fdaf2d7b139f96c0906e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"nikic/php-parser": "^4.18.0 || ^5.0.0", "nikic/php-parser": "^4.18.0 || ^5.0.0",
"php": "^8.1.0", "php": "^8.1.0",
"phpdocumentor/reflection-docblock": "^5.3.0 || ^6.0.0", "phpdocumentor/reflection-docblock": "^5.3.0 || ^6.0.0",
"phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0 || ^13.0.0", "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0",
"symfony/finder": "^6.4.0 || ^7.0.0 || ^8.0.0" "symfony/finder": "^6.4.0 || ^7.0.0 || ^8.0.0"
}, },
"require-dev": { "require-dev": {
@ -11997,9 +11997,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues",
"source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.7" "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.6"
}, },
"time": "2026-02-17T17:25:14+00:00" "time": "2026-01-30T07:16:00+00:00"
}, },
{ {
"name": "theseer/tokenizer", "name": "theseer/tokenizer",
@ -12053,16 +12053,16 @@
}, },
{ {
"name": "webmozart/assert", "name": "webmozart/assert",
"version": "2.1.4", "version": "2.1.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/webmozarts/assert.git", "url": "https://github.com/webmozarts/assert.git",
"reference": "b39f1870fc7c3e9e4a26106df5053354b9260a33" "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/webmozarts/assert/zipball/b39f1870fc7c3e9e4a26106df5053354b9260a33", "url": "https://api.github.com/repos/webmozarts/assert/zipball/ce6a2f100c404b2d32a1dd1270f9b59ad4f57649",
"reference": "b39f1870fc7c3e9e4a26106df5053354b9260a33", "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -12109,9 +12109,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/webmozarts/assert/issues", "issues": "https://github.com/webmozarts/assert/issues",
"source": "https://github.com/webmozarts/assert/tree/2.1.4" "source": "https://github.com/webmozarts/assert/tree/2.1.2"
}, },
"time": "2026-02-17T12:17:51+00:00" "time": "2026-01-13T14:02:24+00:00"
} }
], ],
"aliases": [], "aliases": [],

View file

@ -131,7 +131,7 @@ return [
'puppeteer_docker' => env('PUPPETEER_DOCKER', false), 'puppeteer_docker' => env('PUPPETEER_DOCKER', false),
'puppeteer_mode' => env('PUPPETEER_MODE', 'local'), 'puppeteer_mode' => env('PUPPETEER_MODE', 'local'),
'puppeteer_wait_for_network_idle' => env('PUPPETEER_WAIT_FOR_NETWORK_IDLE', true), 'puppeteer_wait_for_network_idle' => env('PUPPETEER_WAIT_FOR_NETWORK_IDLE', true),
'puppeteer_window_size_strategy' => env('PUPPETEER_WINDOW_SIZE_STRATEGY', 'v2'), 'puppeteer_window_size_strategy' => env('PUPPETEER_WINDOW_SIZE_STRATEGY', null),
'notifications' => [ 'notifications' => [
'battery_low' => [ 'battery_low' => [

View file

@ -1,29 +0,0 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('device_models', function (Blueprint $table) {
$table->string('css_name')->nullable()->after('kind');
$table->json('css_variables')->nullable()->after('css_name');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('device_models', function (Blueprint $table) {
$table->dropColumn(['css_name', 'css_variables']);
});
}
};

View file

@ -1,160 +0,0 @@
<?php
use App\Models\DeviceModel;
use Illuminate\Database\Migrations\Migration;
return new class extends Migration
{
/**
* CSS name and variables for device models created by seed_device_models (og_png until inky_impression_13_3).
*
* @var array<string, array{css_name: string, css_variables: array<string, string>}>
*/
private const SEEDED_CSS = [
'og_png' => [
'css_name' => 'og_png',
'css_variables' => [
'--screen-w' => '800px',
'--screen-h' => '480px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
'og_plus' => [
'css_name' => 'ogv2',
'css_variables' => [
'--screen-w' => '800px',
'--screen-h' => '480px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
'amazon_kindle_2024' => [
'css_name' => 'amazon_kindle_2024',
'css_variables' => [
'--screen-w' => '800px',
'--screen-h' => '480px',
'--ui-scale' => '0.8',
'--gap-scale' => '1.0',
],
],
'amazon_kindle_paperwhite_6th_gen' => [
'css_name' => 'amazon_kindle_paperwhite_6th_gen',
'css_variables' => [
'--screen-w' => '800px',
'--screen-h' => '600px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
'amazon_kindle_paperwhite_7th_gen' => [
'css_name' => 'amazon_kindle_paperwhite_7th_gen',
'css_variables' => [
'--screen-w' => '905px',
'--screen-h' => '670px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
'inkplate_10' => [
'css_name' => 'inkplate_10',
'css_variables' => [
'--screen-w' => '800px',
'--screen-h' => '547px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
'amazon_kindle_7' => [
'css_name' => 'amazon_kindle_7',
'css_variables' => [
'--screen-w' => '800px',
'--screen-h' => '600px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
'inky_impression_7_3' => [
'css_name' => 'inky_impression_7_3',
'css_variables' => [
'--screen-w' => '800px',
'--screen-h' => '480px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
'kobo_libra_2' => [
'css_name' => 'kobo_libra_2',
'css_variables' => [
'--screen-w' => '800px',
'--screen-h' => '602px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
'amazon_kindle_oasis_2' => [
'css_name' => 'amazon_kindle_oasis_2',
'css_variables' => [
'--screen-w' => '800px',
'--screen-h' => '602px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
'kobo_aura_one' => [
'css_name' => 'kobo_aura_one',
'css_variables' => [
'--screen-w' => '1040px',
'--screen-h' => '780px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
'kobo_aura_hd' => [
'css_name' => 'kobo_aura_hd',
'css_variables' => [
'--screen-w' => '800px',
'--screen-h' => '600px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
'inky_impression_13_3' => [
'css_name' => 'inky_impression_13_3',
'css_variables' => [
'--screen-w' => '800px',
'--screen-h' => '600px',
'--ui-scale' => '1.0',
'--gap-scale' => '1.0',
],
],
];
/**
* Run the migrations.
*/
public function up(): void
{
foreach (self::SEEDED_CSS as $name => $payload) {
DeviceModel::query()
->where('name', $name)
->update([
'css_name' => $payload['css_name'],
'css_variables' => $payload['css_variables'],
]);
}
}
/**
* Reverse the migrations.
*/
public function down(): void
{
DeviceModel::query()
->whereIn('name', array_keys(self::SEEDED_CSS))
->update([
'css_name' => null,
'css_variables' => null,
]);
}
};

View file

@ -5,14 +5,12 @@
'deviceOrientation' => null, 'deviceOrientation' => null,
'colorDepth' => '1bit', 'colorDepth' => '1bit',
'scaleLevel' => null, 'scaleLevel' => null,
'cssVariables' => null,
'pluginName' => 'Recipe', 'pluginName' => 'Recipe',
]) ])
<x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}" <x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}"
device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}" device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}"
scale-level="{{$scaleLevel}}" scale-level="{{$scaleLevel}}">
:css-variables="$cssVariables">
<x-trmnl::view> <x-trmnl::view>
<x-trmnl::layout> <x-trmnl::layout>
<x-trmnl::richtext gapSize="large" align="center"> <x-trmnl::richtext gapSize="large" align="center">

View file

@ -5,13 +5,11 @@
'deviceOrientation' => null, 'deviceOrientation' => null,
'colorDepth' => '1bit', 'colorDepth' => '1bit',
'scaleLevel' => null, 'scaleLevel' => null,
'cssVariables' => null,
]) ])
<x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}" <x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}"
device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}" device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}"
scale-level="{{$scaleLevel}}" scale-level="{{$scaleLevel}}">
:css-variables="$cssVariables">
<x-trmnl::view> <x-trmnl::view>
<x-trmnl::layout> <x-trmnl::layout>
<x-trmnl::richtext gapSize="large" align="center"> <x-trmnl::richtext gapSize="large" align="center">

View file

@ -5,13 +5,11 @@
'deviceOrientation' => null, 'deviceOrientation' => null,
'colorDepth' => '1bit', 'colorDepth' => '1bit',
'scaleLevel' => null, 'scaleLevel' => null,
'cssVariables' => null,
]) ])
<x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}" <x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}"
device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}" device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}"
scale-level="{{$scaleLevel}}" scale-level="{{$scaleLevel}}">
:css-variables="$cssVariables">
<x-trmnl::view> <x-trmnl::view>
<x-trmnl::layout> <x-trmnl::layout>
<x-trmnl::richtext gapSize="large" align="center"> <x-trmnl::richtext gapSize="large" align="center">

View file

@ -39,8 +39,6 @@ new class extends Component
public $palette_id; public $palette_id;
public $css_name;
protected $rules = [ protected $rules = [
'name' => 'required|string|max:255|unique:device_models,name', 'name' => 'required|string|max:255|unique:device_models,name',
'label' => 'required|string|max:255', 'label' => 'required|string|max:255',
@ -104,11 +102,10 @@ new class extends Component
$this->offset_y = $deviceModel->offset_y; $this->offset_y = $deviceModel->offset_y;
$this->published_at = $deviceModel->published_at?->format('Y-m-d\TH:i'); $this->published_at = $deviceModel->published_at?->format('Y-m-d\TH:i');
$this->palette_id = $deviceModel->palette_id; $this->palette_id = $deviceModel->palette_id;
$this->css_name = $deviceModel->css_name;
} else { } else {
$this->editingDeviceModelId = null; $this->editingDeviceModelId = null;
$this->viewingDeviceModelId = null; $this->viewingDeviceModelId = null;
$this->reset(['name', 'label', 'description', 'width', 'height', 'colors', 'bit_depth', 'scale_factor', 'rotation', 'mime_type', 'offset_x', 'offset_y', 'published_at', 'palette_id', 'css_name']); $this->reset(['name', 'label', 'description', 'width', 'height', 'colors', 'bit_depth', 'scale_factor', 'rotation', 'mime_type', 'offset_x', 'offset_y', 'published_at', 'palette_id']);
$this->mime_type = 'image/png'; $this->mime_type = 'image/png';
$this->scale_factor = 1.0; $this->scale_factor = 1.0;
$this->rotation = 0; $this->rotation = 0;
@ -134,7 +131,6 @@ new class extends Component
'offset_y' => 'required|integer', 'offset_y' => 'required|integer',
'published_at' => 'nullable|date', 'published_at' => 'nullable|date',
'palette_id' => 'nullable|exists:device_palettes,id', 'palette_id' => 'nullable|exists:device_palettes,id',
'css_name' => 'nullable|string|max:255',
]; ];
if ($this->editingDeviceModelId) { if ($this->editingDeviceModelId) {
@ -162,7 +158,6 @@ new class extends Component
'offset_y' => $this->offset_y, 'offset_y' => $this->offset_y,
'published_at' => $this->published_at, 'published_at' => $this->published_at,
'palette_id' => $this->palette_id ?: null, 'palette_id' => $this->palette_id ?: null,
'css_name' => $this->css_name ?: null,
]); ]);
$message = 'Device model updated successfully.'; $message = 'Device model updated successfully.';
} else { } else {
@ -181,13 +176,12 @@ new class extends Component
'offset_y' => $this->offset_y, 'offset_y' => $this->offset_y,
'published_at' => $this->published_at, 'published_at' => $this->published_at,
'palette_id' => $this->palette_id ?: null, 'palette_id' => $this->palette_id ?: null,
'css_name' => $this->css_name ?: null,
'source' => 'manual', 'source' => 'manual',
]); ]);
$message = 'Device model created successfully.'; $message = 'Device model created successfully.';
} }
$this->reset(['name', 'label', 'description', 'width', 'height', 'colors', 'bit_depth', 'scale_factor', 'rotation', 'mime_type', 'offset_x', 'offset_y', 'published_at', 'palette_id', 'css_name', 'editingDeviceModelId', 'viewingDeviceModelId']); $this->reset(['name', 'label', 'description', 'width', 'height', 'colors', 'bit_depth', 'scale_factor', 'rotation', 'mime_type', 'offset_x', 'offset_y', 'published_at', 'palette_id', 'editingDeviceModelId', 'viewingDeviceModelId']);
Flux::modal('device-model-modal')->close(); Flux::modal('device-model-modal')->close();
$this->deviceModels = DeviceModel::all(); $this->deviceModels = DeviceModel::all();
@ -223,7 +217,6 @@ new class extends Component
$this->offset_y = $deviceModel->offset_y; $this->offset_y = $deviceModel->offset_y;
$this->published_at = $deviceModel->published_at?->format('Y-m-d\TH:i'); $this->published_at = $deviceModel->published_at?->format('Y-m-d\TH:i');
$this->palette_id = $deviceModel->palette_id; $this->palette_id = $deviceModel->palette_id;
$this->css_name = $deviceModel->css_name;
$this->js('Flux.modal("device-model-modal").show()'); $this->js('Flux.modal("device-model-modal").show()');
} }
@ -351,11 +344,6 @@ new class extends Component
</flux:select> </flux:select>
</div> </div>
<div class="mb-4">
<flux:input label="CSS Model Identifier" wire:model="css_name" id="css_name" class="block mt-1 w-full" type="text"
name="css_name" :disabled="(bool) $viewingDeviceModelId"/>
</div>
@if (!$viewingDeviceModelId) @if (!$viewingDeviceModelId)
<div class="flex"> <div class="flex">
<flux:spacer/> <flux:spacer/>

View file

@ -248,7 +248,7 @@ new class extends Component
<flux:callout icon="check-circle" variant="success"> <flux:callout icon="check-circle" variant="success">
<flux:callout.heading>Up to Date</flux:callout.heading> <flux:callout.heading>Up to Date</flux:callout.heading>
<flux:callout.text> <flux:callout.text>
You are running the latest version. You are running the latest version {{ $latestVersion }}.
</flux:callout.text> </flux:callout.text>
</flux:callout> </flux:callout>
@endif @endif

View file

@ -6,22 +6,18 @@
'deviceOrientation' => null, 'deviceOrientation' => null,
'colorDepth' => '1bit', 'colorDepth' => '1bit',
'scaleLevel' => null, 'scaleLevel' => null,
'cssVariables' => null,
]) ])
@if(config('app.puppeteer_window_size_strategy') === 'v2') @if(config('app.puppeteer_window_size_strategy') === 'v2')
<x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}" <x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}"
device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}" device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}"
scale-level="{{$scaleLevel}}" scale-level="{{$scaleLevel}}">
:css-variables="$cssVariables">
<x-trmnl::mashup mashup-layout="{{ $mashupLayout }}"> <x-trmnl::mashup mashup-layout="{{ $mashupLayout }}">
{!! $slot !!} {!! $slot !!}
</x-trmnl::mashup> </x-trmnl::mashup>
</x-trmnl::screen> </x-trmnl::screen>
@else @else
<x-trmnl::screen colorDepth="{{$colorDepth}}" device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}" <x-trmnl::screen colorDepth="{{$colorDepth}}">
scale-level="{{$scaleLevel}}"
:css-variables="$cssVariables">
<x-trmnl::mashup mashup-layout="{{ $mashupLayout }}"> <x-trmnl::mashup mashup-layout="{{ $mashupLayout }}">
{!! $slot !!} {!! $slot !!}
</x-trmnl::mashup> </x-trmnl::mashup>

View file

@ -5,21 +5,16 @@
'deviceOrientation' => null, 'deviceOrientation' => null,
'colorDepth' => '1bit', 'colorDepth' => '1bit',
'scaleLevel' => null, 'scaleLevel' => null,
'cssVariables' => null,
]) ])
@if(config('app.puppeteer_window_size_strategy') === 'v2') @if(config('app.puppeteer_window_size_strategy') === 'v2')
<x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}" <x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}"
device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}" device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}"
scale-level="{{$scaleLevel}}" scale-level="{{$scaleLevel}}">
:css-variables="$cssVariables">
{!! $slot !!} {!! $slot !!}
</x-trmnl::screen> </x-trmnl::screen>
@else @else
<x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}" <x-trmnl::screen colorDepth="{{$colorDepth}}" no-bleed="{{$noBleed}}" dark-mode="{{$darkMode}}">
device-variant="{{$deviceVariant}}" device-orientation="{{$deviceOrientation}}"
scale-level="{{$scaleLevel}}"
:css-variables="$cssVariables">
{!! $slot !!} {!! $slot !!}
</x-trmnl::screen> </x-trmnl::screen>
@endif @endif

View file

@ -1,13 +1,19 @@
@props([ @props([
'noBleed' => false, 'noBleed' => false,
'darkMode' => false, 'darkMode' => false,
'deviceVariant' => 'ogv2', 'deviceVariant' => 'og',
'deviceOrientation' => null, 'deviceOrientation' => null,
'colorDepth' => '1bit', 'colorDepth' => '1bit',
'scaleLevel' => null, 'scaleLevel' => null,
'cssVariables' => null,
]) ])
@php
// HOTFIX Github Issue https://github.com/usetrmnl/byos_laravel/issues/190
if ($colorDepth == '2bit'){
$deviceVariant = 'ogv2';
}
@endphp
<!DOCTYPE html> <!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head> <head>
@ -27,18 +33,9 @@
<script src="{{ config('services.trmnl.base_url') }}/js/{{ config('trmnl-blade.framework_js_version') ?? config('trmnl-blade.framework_version', '2.1.0') }}/plugins.js"></script> <script src="{{ config('services.trmnl.base_url') }}/js/{{ config('trmnl-blade.framework_js_version') ?? config('trmnl-blade.framework_version', '2.1.0') }}/plugins.js"></script>
@endif @endif
<title>{{ $title ?? config('app.name') }}</title> <title>{{ $title ?? config('app.name') }}</title>
@if(config('app.puppeteer_window_size_strategy') === 'v2' && !empty($cssVariables) && is_array($cssVariables))
<style>
:root {
@foreach($cssVariables as $name => $value)
{{ $name }}: {{ $value }};
@endforeach
}
</style>
@endif
</head> </head>
<body class="environment trmnl"> <body class="environment trmnl">
<div class="screen {{ $noBleed ? 'screen--no-bleed' : '' }} {{ $darkMode ? 'dark-mode' : '' }} {{ $deviceVariant ? 'screen--' . $deviceVariant : '' }} {{ $deviceOrientation ? 'screen--' . $deviceOrientation : '' }} {{ $colorDepth ? 'screen--' . $colorDepth : '' }} {{ $scaleLevel ? 'screen--scale-' . $scaleLevel : '' }}"> <div class="screen {{$noBleed ? 'screen--no-bleed' : ''}} {{ $darkMode ? 'dark-mode' : '' }} {{$deviceVariant ? 'screen--' . $deviceVariant : ''}} {{ $deviceOrientation ? 'screen--' . $deviceOrientation : ''}} {{ $colorDepth ? 'screen--' . $colorDepth : ''}} {{ $scaleLevel ? 'screen--scale-' . $scaleLevel : ''}}">
{{ $slot }} {{ $slot }}
</div> </div>
</body> </body>

View file

@ -32,11 +32,6 @@
@endif @endif
</header> </header>
@auth @auth
@if(config('app.version'))
<flux:text class="text-xs">Version: <a href="https://github.com/usetrmnl/byos_laravel/releases/tag/{{ config('app.version') }}"
target="_blank">{{ config('app.version') }}</a>
</flux:text>
@endif
<livewire:update-check /> <livewire:update-check />
@endauth @endauth
</x-layouts::auth.card> </x-layouts::auth.card>