From fbc3b1196fa19526f3c66c4ecbe32141c8aef546 Mon Sep 17 00:00:00 2001 From: Gabriele Lauricella Date: Sat, 14 Feb 2026 00:26:48 +0100 Subject: [PATCH 01/30] feat: web mirror client - add fullscreen and lock screen on --- public/mirror/index.html | 450 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 426 insertions(+), 24 deletions(-) diff --git a/public/mirror/index.html b/public/mirror/index.html index ef60a19..02e99cf 100644 --- a/public/mirror/index.html +++ b/public/mirror/index.html @@ -22,6 +22,7 @@ refreshTimer: null, renderedAt: 0, ui: {}, + wakeLock: null, showStatus: function (message) { trmnl.ui.img.style.display = "none"; @@ -40,6 +41,8 @@ trmnl.ui.apiKeyInput.value = data.api_key || ""; trmnl.ui.baseURLInput.value = data.base_url || ""; trmnl.ui.displayModeSelect.value = data.display_mode || ""; + trmnl.ui.fullscreenToggle.checked = !!data.fullscreen; + trmnl.ui.wakeLockToggle.checked = !!trmnl.wakeLock || !!data.wake_lock; trmnl.ui.setup.style.display = "flex"; }, @@ -50,6 +53,8 @@ var apiKey = trmnl.ui.apiKeyInput.value; var baseURL = trmnl.ui.baseURLInput.value; var displayMode = trmnl.ui.displayModeSelect.value; + var fullscreenEnabled = trmnl.ui.fullscreenToggle.checked; + var wakeLockEnabled = trmnl.ui.wakeLockToggle.checked; if (!apiKey) { return; @@ -58,9 +63,26 @@ trmnl.saveSettings({ api_key: apiKey, base_url: baseURL, - display_mode: displayMode + display_mode: displayMode, + fullscreen: fullscreenEnabled, + wake_lock: wakeLockEnabled }); + if (wakeLockEnabled) { + trmnl.acquireWakeLock().then(function () { + trmnl.ui.wakeLockToggle.checked = !!trmnl.wakeLock; + }).catch(function (err) { + console.warn("Wake Lock request failed:", err); + trmnl.ui.wakeLockToggle.checked = false; + }); + } else { + trmnl.releaseWakeLock().then(function () { + trmnl.ui.wakeLockToggle.checked = false; + }).catch(function (err) { + console.warn("Wake Lock release failed:", err); + }); + } + trmnl.fetchDisplay(); }, @@ -68,6 +90,144 @@ trmnl.ui.setup.style.display = "none"; }, + isFullscreenSupported: function () { + return !!( + document.fullscreenEnabled || + document.webkitFullscreenEnabled || + document.msFullscreenEnabled + ); + }, + + isFullscreenActive: function () { + return !!( + document.fullscreenElement || + document.webkitFullscreenElement || + document.msFullscreenElement + ); + }, + + enterFullscreen: function () { + if (!trmnl.isFullscreenSupported()) return; + + var el = document.documentElement; + var promise; + + if (el.requestFullscreen) { + promise = el.requestFullscreen(); + } else if (el.webkitRequestFullscreen) { + promise = el.webkitRequestFullscreen(); + } else if (el.msRequestFullscreen) { + promise = el.msRequestFullscreen(); + } + + if (promise && promise.catch) { + promise.catch(function (err) { + console.warn("Enter fullscreen failed:", err); + }); + } + }, + + exitFullscreen: function () { + if (!trmnl.isFullscreenSupported()) return; + if (!trmnl.isFullscreenActive()) return; + + var promise; + + if (document.exitFullscreen) { + promise = document.exitFullscreen(); + } else if (document.webkitExitFullscreen) { + promise = document.webkitExitFullscreen(); + } else if (document.msExitFullscreen) { + promise = document.msExitFullscreen(); + } + + if (promise && promise.catch) { + promise.catch(function (err) { + console.warn("Exit fullscreen failed:", err); + }); + } + }, + + syncFullscreenToggle: function () { + var active = trmnl.isFullscreenActive(); + trmnl.ui.fullscreenToggle.checked = active; + }, + + isWakeLockSupported: function () { + return ( + window.isSecureContext && + navigator.wakeLock && + typeof navigator.wakeLock.request === "function" + ); + }, + + acquireWakeLock: function () { + + if (!trmnl.isWakeLockSupported()) { + return { + then: function () { return this; }, + catch: function () { return this; } + }; + } + + if (trmnl.wakeLock) { + return Promise.resolve(); + } + + return navigator.wakeLock.request("screen") + .then(function (sentinel) { + + trmnl.wakeLock = sentinel; + + sentinel.addEventListener("release", function () { + trmnl.wakeLock = null; + trmnl.ui.wakeLockToggle.checked = false; + }); + + console.log("Wake Lock attivo"); + + }) + .catch(function (err) { + console.warn("Wake Lock failed:", err); + trmnl.wakeLock = null; + trmnl.ui.wakeLockToggle.checked = false; + }); + }, + + + releaseWakeLock: function () { + + if (!trmnl.wakeLock) { + return Promise.resolve(); + } + + return trmnl.wakeLock.release() + .then(function () { + trmnl.wakeLock = null; + console.log("Wake Lock rilasciato"); + }) + .catch(function (err) { + console.warn("Release failed:", err); + trmnl.wakeLock = null; + }); + }, + + + toggleWakeLock: function () { + if (!trmnl.isWakeLockSupported()) return; + if (trmnl.wakeLock) { + trmnl.releaseWakeLock().then(function () { + trmnl.ui.wakeLockToggle.checked = false; + }); + } else { + trmnl.acquireWakeLock().then(function () { + trmnl.ui.wakeLockToggle.checked = !!trmnl.wakeLock; + }); + } + }, + + + fetchDisplay: function (opts) { opts = opts || {}; clearTimeout(trmnl.refreshTimer); @@ -132,8 +292,12 @@ trmnl.showStatus("Error processing response: " + e.message); } } else { + var msg = xhr.statusText + if (xhr.status == 404) { + msg = "Maybe wrong API key"; + } trmnl.showStatus( - "Failed to fetch screen: " + xhr.status + " " + xhr.statusText + "Failed to fetch screen: " + xhr.status + " " + msg ); } }; @@ -266,15 +430,110 @@ trmnl.ui.apiKeyInput = document.getElementById("api_key"); trmnl.ui.baseURLInput = document.getElementById("base_url"); trmnl.ui.displayModeSelect = document.getElementById("display_mode"); + trmnl.ui.fullscreenToggle = document.getElementById("fullscreenToggle"); + trmnl.ui.wakeLockToggle = document.getElementById("wakeLockToggle"); trmnl.ui.setup = document.getElementById("setup"); + // Sync fullscreen state + document.addEventListener("fullscreenchange", trmnl.syncFullscreenToggle); + document.addEventListener("webkitfullscreenchange", trmnl.syncFullscreenToggle); + document.addEventListener("msfullscreenchange", trmnl.syncFullscreenToggle); + + // Fullscreen toggle + if (!trmnl.isFullscreenSupported()) { + trmnl.ui.fullscreenToggle.disabled = true; + trmnl.ui.fullscreenToggle.parentElement.style.opacity = "0.5"; + trmnl.ui.fullscreenToggle.parentElement.style.cursor = "not-allowed"; + } else { + trmnl.ui.fullscreenToggle.addEventListener("change", function (e) { + e.stopPropagation(); + + if (e.target.checked) { + trmnl.enterFullscreen(); + } else { + trmnl.exitFullscreen(); + } + }); + } + + var wakeLockHint = document.getElementById("wakeLockHint"); + + // Wake Lock toggle + if (trmnl.isWakeLockSupported()) { + + trmnl.ui.wakeLockToggle.disabled = false; + trmnl.ui.wakeLockToggle.parentElement.style.opacity = "1"; + trmnl.ui.wakeLockToggle.parentElement.style.cursor = "pointer"; + + if (wakeLockHint) wakeLockHint.style.display = "none"; + + trmnl.ui.wakeLockToggle.addEventListener("change", function () { + trmnl.toggleWakeLock(); + }); + + document.addEventListener("visibilitychange", function () { + if ( + document.visibilityState === "visible" && + trmnl.ui.wakeLockToggle.checked + ) { + trmnl.acquireWakeLock(); + } + }); + + } else { + + // unsupported (HTTP or old browser) + trmnl.ui.wakeLockToggle.disabled = true; + trmnl.ui.wakeLockToggle.checked = false; + trmnl.ui.wakeLockToggle.parentElement.style.opacity = "0.5"; + trmnl.ui.wakeLockToggle.parentElement.style.cursor = "not-allowed"; + + if (!window.isSecureContext && wakeLockHint) { + wakeLockHint.style.display = "block"; + } + + } + + // get settings from localstorage var settings = trmnl.getSettings(); + + // show setup form if missing apikey if (!settings || !settings.api_key) { trmnl.showSetupForm(); } else { trmnl.fetchDisplay(); } - } + + // Auto fullscreen at first click/touch if option enabled + if (settings.fullscreen && trmnl.isFullscreenSupported()) { + var activateFullscreenOnce = function () { + trmnl.enterFullscreen(); + document.removeEventListener("click", activateFullscreenOnce); + document.removeEventListener("touchstart", activateFullscreenOnce); + }; + document.addEventListener("click", activateFullscreenOnce, { once: true }); + document.addEventListener("touchstart", activateFullscreenOnce, { once: true }); + } + + // Auto Wake Lock at first click/touch if option enabled + if (settings.wake_lock && trmnl.isWakeLockSupported()) { + var acquireWakeLockOnce = function () { + trmnl.acquireWakeLock().then(function () { + trmnl.ui.wakeLockToggle.checked = !!trmnl.wakeLock; + }).catch(function (err) { + console.warn("Wake Lock request failed:", err); + trmnl.ui.wakeLockToggle.checked = false; + }); + document.removeEventListener("click", acquireWakeLockOnce); + document.removeEventListener("touchstart", acquireWakeLockOnce); + }; + document.addEventListener("click", acquireWakeLockOnce, { once: true }); + document.addEventListener("touchstart", acquireWakeLockOnce, { once: true }); + } + + trmnl.syncFullscreenToggle(); + } //init end + }; document.addEventListener("DOMContentLoaded", function () { @@ -393,8 +652,7 @@ display: block; } - label, - summary { + label { font-size: 1.25em; margin-bottom: 0.5em; cursor: pointer; @@ -423,6 +681,10 @@ width: 100%; } + .btn-secondary { + background-color: #777; + } + .btn-clear { margin-top: 1em; background-color: #777; @@ -447,8 +709,127 @@ background-color: #ffffff; } - #unsupported { - color: red; + .setting-row { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 1em; + flex-wrap: nowrap; + } + + .setting-row label, + .setting-row .toggle-label { + font-size: 1.25em; + margin: 0; + cursor: default; + } + + .setting-row select, + .setting-row .switch { + width: auto; + min-width: 52px; + height: 28px; + } + + .switch { + position: relative; + display: inline-block; + width: 52px; + height: 28px; + } + + .switch input { + opacity: 0; + width: 0; + height: 0; + } + + .slider { + position: absolute; + cursor: pointer; + inset: 0; + background-color: #ccc; + border-radius: 28px; + transition: background-color 0.2s ease; + } + + .slider::before { + content: ""; + position: absolute; + height: 22px; + width: 22px; + left: 3px; + top: 3px; + background-color: white; + border-radius: 50%; + transition: transform 0.2s ease; + } + + .switch input:checked+.slider { + background-color: #f54900; + } + + .switch input:checked+.slider::before { + transform: translateX(24px); + } + + .switch input:disabled+.slider { + background-color: #ccc; + cursor: not-allowed; + } + + .switch input:disabled+.slider::before { + background-color: #eee; + } + + .form-select-small { + width: 6em; + font-size: 1em; + padding: 0.4em 0.5em; + border: 1px solid #ccc; + border-radius: 0.5em; + background-color: #ffffff; + } + + .toggle-label { + font-size: 1.25em; + margin: 0; + cursor: default; + pointer-events: auto; + } + + .setting-hint { + font-size: 0.75em; + color: #f41414; + margin-top: 0.2em; + margin-left: 0.5em; + } + + /* Fallback for iOS 9 */ + @media screen and (max-width: 1024px) and (-webkit-min-device-pixel-ratio: 1) { + .setting-row { + display: block; + overflow: hidden; + } + + .setting-row label, + .setting-row .toggle-label { + float: left; + line-height: 28px; + margin-right: 0.5em; + } + + .setting-row select, + .setting-row .switch { + float: right; + width: auto; + min-width: 52px; + height: 28px; + } + + .setting-hint { + display: none !important; + } } @@ -459,18 +840,6 @@ TRMNL Logo
-
- - -
- -
- -
@@ -478,11 +847,43 @@ class="form-control" value="" />
- +
+ + +
- +
+ + +
+ +
+ Fullscreen + +
+ +
+
+ Screen Wake Lock + +
+ +
+ + +
@@ -496,10 +897,11 @@
- +
+ \ No newline at end of file From e595a37a4df1df15e0868d1471bd429f190ee4a0 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Sun, 15 Feb 2026 13:48:35 +0100 Subject: [PATCH 02/30] fix(#190): mashups rendering blank --- resources/views/vendor/trmnl/components/screen.blade.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/resources/views/vendor/trmnl/components/screen.blade.php b/resources/views/vendor/trmnl/components/screen.blade.php index fbb4607..1ff7d23 100644 --- a/resources/views/vendor/trmnl/components/screen.blade.php +++ b/resources/views/vendor/trmnl/components/screen.blade.php @@ -7,6 +7,13 @@ 'scaleLevel' => null, ]) +@php +// HOTFIX Github Issue https://github.com/usetrmnl/byos_laravel/issues/190 +if ($colorDepth == '2bit'){ + $deviceVariant = 'ogv2'; +} +@endphp + From 3419085325d027cab9c427b3c50b940e01a87460 Mon Sep 17 00:00:00 2001 From: dowjames Date: Tue, 17 Feb 2026 13:34:11 -0500 Subject: [PATCH 03/30] Update Dockerfile to install extra fonts My solution to: https://github.com/usetrmnl/byos_laravel/issues/179 --- Dockerfile | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Dockerfile b/Dockerfile index 5af7b33..c198c9c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,6 +30,17 @@ COPY --chown=www-data:www-data .env.example .env # Install the composer dependencies 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 ######################## From d83a4095cb71261a43760e0a082c4bf99edc23ff Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Tue, 17 Feb 2026 13:40:38 +0100 Subject: [PATCH 04/30] chore: update dependencies --- composer.json | 4 +- composer.lock | 248 +++++++++++++++++++++++++------------------------- 2 files changed, 126 insertions(+), 126 deletions(-) diff --git a/composer.json b/composer.json index 6f00826..feb30c8 100644 --- a/composer.json +++ b/composer.json @@ -15,8 +15,8 @@ "ext-imagick": "*", "ext-simplexml": "*", "ext-zip": "*", - "bnussbau/laravel-trmnl-blade": "2.3.*", - "bnussbau/trmnl-pipeline-php": "0.7.*", + "bnussbau/laravel-trmnl-blade": "^2.3", + "bnussbau/trmnl-pipeline-php": "^0.8", "keepsuit/laravel-liquid": "^0.5.2", "laravel/fortify": "^1.30", "laravel/framework": "^12.1", diff --git a/composer.lock b/composer.lock index b22316d..73efe3f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "909d7acdf3f0ace9fb6d20b4de1eeaca", + "content-hash": "a1b56974da6a4f33fe847dba0549a6e0", "packages": [ { "name": "aws/aws-crt-php", @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.369.32", + "version": "3.369.36", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "4779292a30aa2d4a7ddfd519f80a94c2706ee64e" + "reference": "2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/4779292a30aa2d4a7ddfd519f80a94c2706ee64e", - "reference": "4779292a30aa2d4a7ddfd519f80a94c2706ee64e", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0", + "reference": "2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0", "shasum": "" }, "require": { @@ -153,9 +153,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.369.32" + "source": "https://github.com/aws/aws-sdk-php/tree/3.369.36" }, - "time": "2026-02-11T19:29:10+00:00" + "time": "2026-02-17T19:45:01+00:00" }, { "name": "bacon/bacon-qr-code", @@ -298,16 +298,16 @@ }, { "name": "bnussbau/trmnl-pipeline-php", - "version": "0.7.0", + "version": "0.8.0", "source": { "type": "git", "url": "https://github.com/bnussbau/trmnl-pipeline-php.git", - "reference": "da80de2b6456776eeabc1fb95fd42e5f3357d865" + "reference": "f7c86bf655d6f8ddd88e48575d0c9588c33eb07b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bnussbau/trmnl-pipeline-php/zipball/da80de2b6456776eeabc1fb95fd42e5f3357d865", - "reference": "da80de2b6456776eeabc1fb95fd42e5f3357d865", + "url": "https://api.github.com/repos/bnussbau/trmnl-pipeline-php/zipball/f7c86bf655d6f8ddd88e48575d0c9588c33eb07b", + "reference": "f7c86bf655d6f8ddd88e48575d0c9588c33eb07b", "shasum": "" }, "require": { @@ -349,7 +349,7 @@ ], "support": { "issues": "https://github.com/bnussbau/trmnl-pipeline-php/issues", - "source": "https://github.com/bnussbau/trmnl-pipeline-php/tree/0.7.0" + "source": "https://github.com/bnussbau/trmnl-pipeline-php/tree/0.8.0" }, "funding": [ { @@ -365,7 +365,7 @@ "type": "github" } ], - "time": "2026-02-07T22:22:18+00:00" + "time": "2026-02-12T16:53:44+00:00" }, { "name": "brick/math", @@ -1894,16 +1894,16 @@ }, { "name": "laravel/framework", - "version": "v12.51.0", + "version": "v12.52.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16" + "reference": "d5511fa74f4608dbb99864198b1954042aa8d5a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/ce4de3feb211e47c4f959d309ccf8a2733b1bc16", - "reference": "ce4de3feb211e47c4f959d309ccf8a2733b1bc16", + "url": "https://api.github.com/repos/laravel/framework/zipball/d5511fa74f4608dbb99864198b1954042aa8d5a7", + "reference": "d5511fa74f4608dbb99864198b1954042aa8d5a7", "shasum": "" }, "require": { @@ -2112,7 +2112,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-02-10T18:20:19+00:00" + "time": "2026-02-17T17:07:04+00:00" }, { "name": "laravel/prompts", @@ -3128,16 +3128,16 @@ }, { "name": "livewire/flux", - "version": "v2.12.0", + "version": "v2.12.1", "source": { "type": "git", "url": "https://github.com/livewire/flux.git", - "reference": "78bc26f54a29c28ff916751b9f796f4ce1592003" + "reference": "24c139b97b6df1e67c0235637f0e08c206bf4486" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/flux/zipball/78bc26f54a29c28ff916751b9f796f4ce1592003", - "reference": "78bc26f54a29c28ff916751b9f796f4ce1592003", + "url": "https://api.github.com/repos/livewire/flux/zipball/24c139b97b6df1e67c0235637f0e08c206bf4486", + "reference": "24c139b97b6df1e67c0235637f0e08c206bf4486", "shasum": "" }, "require": { @@ -3150,7 +3150,7 @@ "symfony/console": "^6.0|^7.0" }, "conflict": { - "livewire/blaze": "<1.0.0" + "livewire/blaze": "<1.0.0-beta.2" }, "type": "library", "extra": { @@ -3188,9 +3188,9 @@ ], "support": { "issues": "https://github.com/livewire/flux/issues", - "source": "https://github.com/livewire/flux/tree/v2.12.0" + "source": "https://github.com/livewire/flux/tree/v2.12.1" }, - "time": "2026-02-09T23:35:27+00:00" + "time": "2026-02-17T21:12:27+00:00" }, { "name": "livewire/livewire", @@ -3687,16 +3687,16 @@ }, { "name": "nette/utils", - "version": "v4.1.2", + "version": "v4.1.3", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5" + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/f76b5dc3d6c6d3043c8d937df2698515b99cbaf5", - "reference": "f76b5dc3d6c6d3043c8d937df2698515b99cbaf5", + "url": "https://api.github.com/repos/nette/utils/zipball/bb3ea637e3d131d72acc033cfc2746ee893349fe", + "reference": "bb3ea637e3d131d72acc033cfc2746ee893349fe", "shasum": "" }, "require": { @@ -3708,8 +3708,10 @@ }, "require-dev": { "jetbrains/phpstorm-attributes": "^1.2", + "nette/phpstan-rules": "^1.0", "nette/tester": "^2.5", - "phpstan/phpstan": "^2.0@stable", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1@stable", "tracy/tracy": "^2.9" }, "suggest": { @@ -3770,9 +3772,9 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.1.2" + "source": "https://github.com/nette/utils/tree/v4.1.3" }, - "time": "2026-02-03T17:21:09+00:00" + "time": "2026-02-13T03:05:33+00:00" }, { "name": "nikic/php-parser", @@ -3834,31 +3836,31 @@ }, { "name": "nunomaduro/termwind", - "version": "v2.3.3", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017" + "reference": "712a31b768f5daea284c2169a7d227031001b9a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/6fb2a640ff502caace8e05fd7be3b503a7e1c017", - "reference": "6fb2a640ff502caace8e05fd7be3b503a7e1c017", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/712a31b768f5daea284c2169a7d227031001b9a8", + "reference": "712a31b768f5daea284c2169a7d227031001b9a8", "shasum": "" }, "require": { "ext-mbstring": "*", "php": "^8.2", - "symfony/console": "^7.3.6" + "symfony/console": "^7.4.4 || ^8.0.4" }, "require-dev": { - "illuminate/console": "^11.46.1", - "laravel/pint": "^1.25.1", + "illuminate/console": "^11.47.0", + "laravel/pint": "^1.27.1", "mockery/mockery": "^1.6.12", - "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.1.3", + "pestphp/pest": "^2.36.0 || ^3.8.4 || ^4.3.2", "phpstan/phpstan": "^1.12.32", "phpstan/phpstan-strict-rules": "^1.6.2", - "symfony/var-dumper": "^7.3.5", + "symfony/var-dumper": "^7.3.5 || ^8.0.4", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -3890,7 +3892,7 @@ "email": "enunomaduro@gmail.com" } ], - "description": "Its like Tailwind CSS, but for the console.", + "description": "It's like Tailwind CSS, but for the console.", "keywords": [ "cli", "console", @@ -3901,7 +3903,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.3.3" + "source": "https://github.com/nunomaduro/termwind/tree/v2.4.0" }, "funding": [ { @@ -3917,7 +3919,7 @@ "type": "github" } ], - "time": "2025-11-20T02:34:59+00:00" + "time": "2026-02-16T23:10:27+00:00" }, { "name": "om/icalparser", @@ -8536,16 +8538,16 @@ "packages-dev": [ { "name": "brianium/paratest", - "version": "v7.17.0", + "version": "v7.19.0", "source": { "type": "git", "url": "https://github.com/paratestphp/paratest.git", - "reference": "53cb90a6aa3ef3840458781600628ade058a18b9" + "reference": "7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paratestphp/paratest/zipball/53cb90a6aa3ef3840458781600628ade058a18b9", - "reference": "53cb90a6aa3ef3840458781600628ade058a18b9", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6", + "reference": "7c6c29af7c4b406b49ce0c6b0a3a81d3684474e6", "shasum": "" }, "require": { @@ -8556,13 +8558,13 @@ "fidry/cpu-core-counter": "^1.3.0", "jean85/pretty-package-versions": "^2.1.1", "php": "~8.3.0 || ~8.4.0 || ~8.5.0", - "phpunit/php-code-coverage": "^12.5.2", - "phpunit/php-file-iterator": "^6", - "phpunit/php-timer": "^8", - "phpunit/phpunit": "^12.5.8", - "sebastian/environment": "^8.0.3", - "symfony/console": "^7.3.4 || ^8.0.0", - "symfony/process": "^7.3.4 || ^8.0.0" + "phpunit/php-code-coverage": "^12.5.3 || ^13.0.1", + "phpunit/php-file-iterator": "^6.0.1 || ^7", + "phpunit/php-timer": "^8 || ^9", + "phpunit/phpunit": "^12.5.9 || ^13", + "sebastian/environment": "^8.0.3 || ^9", + "symfony/console": "^7.4.4 || ^8.0.4", + "symfony/process": "^7.4.5 || ^8.0.5" }, "require-dev": { "doctrine/coding-standard": "^14.0.0", @@ -8573,7 +8575,7 @@ "phpstan/phpstan-deprecation-rules": "^2.0.3", "phpstan/phpstan-phpunit": "^2.0.12", "phpstan/phpstan-strict-rules": "^2.0.8", - "symfony/filesystem": "^7.3.2 || ^8.0.0" + "symfony/filesystem": "^7.4.0 || ^8.0.1" }, "bin": [ "bin/paratest", @@ -8613,7 +8615,7 @@ ], "support": { "issues": "https://github.com/paratestphp/paratest/issues", - "source": "https://github.com/paratestphp/paratest/tree/v7.17.0" + "source": "https://github.com/paratestphp/paratest/tree/v7.19.0" }, "funding": [ { @@ -8625,7 +8627,7 @@ "type": "paypal" } ], - "time": "2026-02-05T09:14:44+00:00" + "time": "2026-02-06T10:53:26+00:00" }, { "name": "fakerphp/faker", @@ -9066,16 +9068,16 @@ }, { "name": "laravel/boost", - "version": "v2.1.3", + "version": "v2.1.6", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "b96e0ab547d51d3810498dcc4d5535486991df6f" + "reference": "b8923e6131e5b705da299891284d327562445618" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/b96e0ab547d51d3810498dcc4d5535486991df6f", - "reference": "b96e0ab547d51d3810498dcc4d5535486991df6f", + "url": "https://api.github.com/repos/laravel/boost/zipball/b8923e6131e5b705da299891284d327562445618", + "reference": "b8923e6131e5b705da299891284d327562445618", "shasum": "" }, "require": { @@ -9128,20 +9130,20 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2026-02-11T19:22:04+00:00" + "time": "2026-02-16T23:53:14+00:00" }, { "name": "laravel/mcp", - "version": "v0.5.6", + "version": "v0.5.9", "source": { "type": "git", "url": "https://github.com/laravel/mcp.git", - "reference": "87905978bf2a230d6c01f8d03e172249e37917f7" + "reference": "39e8da60eb7bce4737c5d868d35a3fe78938c129" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/mcp/zipball/87905978bf2a230d6c01f8d03e172249e37917f7", - "reference": "87905978bf2a230d6c01f8d03e172249e37917f7", + "url": "https://api.github.com/repos/laravel/mcp/zipball/39e8da60eb7bce4737c5d868d35a3fe78938c129", + "reference": "39e8da60eb7bce4737c5d868d35a3fe78938c129", "shasum": "" }, "require": { @@ -9201,7 +9203,7 @@ "issues": "https://github.com/laravel/mcp/issues", "source": "https://github.com/laravel/mcp" }, - "time": "2026-02-09T22:08:43+00:00" + "time": "2026-02-17T19:05:53+00:00" }, { "name": "laravel/pail", @@ -9619,39 +9621,36 @@ }, { "name": "nunomaduro/collision", - "version": "v8.8.3", + "version": "v8.9.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4" + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/1dc9e88d105699d0fee8bb18890f41b274f6b4c4", - "reference": "1dc9e88d105699d0fee8bb18890f41b274f6b4c4", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", + "reference": "a1ed3fa530fd60bc515f9303e8520fcb7d4bd935", "shasum": "" }, "require": { - "filp/whoops": "^2.18.1", - "nunomaduro/termwind": "^2.3.1", + "filp/whoops": "^2.18.4", + "nunomaduro/termwind": "^2.4.0", "php": "^8.2.0", - "symfony/console": "^7.3.0" + "symfony/console": "^7.4.4 || ^8.0.4" }, "conflict": { - "laravel/framework": "<11.44.2 || >=13.0.0", - "phpunit/phpunit": "<11.5.15 || >=13.0.0" + "laravel/framework": "<11.48.0 || >=14.0.0", + "phpunit/phpunit": "<11.5.50 || >=14.0.0" }, "require-dev": { - "brianium/paratest": "^7.8.3", - "larastan/larastan": "^3.4.2", - "laravel/framework": "^11.44.2 || ^12.18", - "laravel/pint": "^1.22.1", - "laravel/sail": "^1.43.1", - "laravel/sanctum": "^4.1.1", - "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" + "brianium/paratest": "^7.8.5", + "larastan/larastan": "^3.9.2", + "laravel/framework": "^11.48.0 || ^12.52.0", + "laravel/pint": "^1.27.1", + "orchestra/testbench-core": "^9.12.0 || ^10.9.0", + "pestphp/pest": "^3.8.5 || ^4.4.1 || ^5.0.0", + "sebastian/environment": "^7.2.1 || ^8.0.3 || ^9.0.0" }, "type": "library", "extra": { @@ -9714,45 +9713,45 @@ "type": "patreon" } ], - "time": "2025-11-20T02:55:25+00:00" + "time": "2026-02-17T17:33:08+00:00" }, { "name": "pestphp/pest", - "version": "v4.3.2", + "version": "v4.4.1", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "3a4329ddc7a2b67c19fca8342a668b39be3ae398" + "reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/3a4329ddc7a2b67c19fca8342a668b39be3ae398", - "reference": "3a4329ddc7a2b67c19fca8342a668b39be3ae398", + "url": "https://api.github.com/repos/pestphp/pest/zipball/f96a1b27864b585b0b29b0ee7331176726f7e54a", + "reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a", "shasum": "" }, "require": { - "brianium/paratest": "^7.16.1", - "nunomaduro/collision": "^8.8.3", - "nunomaduro/termwind": "^2.3.3", + "brianium/paratest": "^7.19.0", + "nunomaduro/collision": "^8.9.0", + "nunomaduro/termwind": "^2.4.0", "pestphp/pest-plugin": "^4.0.0", "pestphp/pest-plugin-arch": "^4.0.0", "pestphp/pest-plugin-mutate": "^4.0.1", "pestphp/pest-plugin-profanity": "^4.2.1", "php": "^8.3.0", - "phpunit/phpunit": "^12.5.8", - "symfony/process": "^7.4.4|^8.0.0" + "phpunit/phpunit": "^12.5.12", + "symfony/process": "^7.4.5|^8.0.5" }, "conflict": { "filp/whoops": "<2.18.3", - "phpunit/phpunit": ">12.5.8", + "phpunit/phpunit": ">12.5.12", "sebastian/exporter": "<7.0.0", "webmozart/assert": "<1.11.0" }, "require-dev": { - "pestphp/pest-dev-tools": "^4.0.0", - "pestphp/pest-plugin-browser": "^4.2.1", + "pestphp/pest-dev-tools": "^4.1.0", + "pestphp/pest-plugin-browser": "^4.3.0", "pestphp/pest-plugin-type-coverage": "^4.0.3", - "psy/psysh": "^0.12.18" + "psy/psysh": "^0.12.20" }, "bin": [ "bin/pest" @@ -9818,7 +9817,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v4.3.2" + "source": "https://github.com/pestphp/pest/tree/v4.4.1" }, "funding": [ { @@ -9830,7 +9829,7 @@ "type": "github" } ], - "time": "2026-01-28T01:01:19+00:00" + "time": "2026-02-17T15:27:18+00:00" }, { "name": "pestphp/pest-plugin", @@ -10830,16 +10829,16 @@ }, { "name": "phpunit/phpunit", - "version": "12.5.8", + "version": "12.5.12", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889" + "reference": "418e06b3b46b0d54bad749ff4907fc7dfb530199" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/37ddb96c14bfee10304825edbb7e66d341ec6889", - "reference": "37ddb96c14bfee10304825edbb7e66d341ec6889", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/418e06b3b46b0d54bad749ff4907fc7dfb530199", + "reference": "418e06b3b46b0d54bad749ff4907fc7dfb530199", "shasum": "" }, "require": { @@ -10853,8 +10852,8 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.3", - "phpunit/php-code-coverage": "^12.5.2", - "phpunit/php-file-iterator": "^6.0.0", + "phpunit/php-code-coverage": "^12.5.3", + "phpunit/php-file-iterator": "^6.0.1", "phpunit/php-invoker": "^6.0.0", "phpunit/php-text-template": "^5.0.0", "phpunit/php-timer": "^8.0.0", @@ -10865,6 +10864,7 @@ "sebastian/exporter": "^7.0.2", "sebastian/global-state": "^8.0.2", "sebastian/object-enumerator": "^7.0.0", + "sebastian/recursion-context": "^7.0.1", "sebastian/type": "^6.0.3", "sebastian/version": "^6.0.0", "staabm/side-effects-detector": "^1.0.5" @@ -10907,7 +10907,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.8" + "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.12" }, "funding": [ { @@ -10931,7 +10931,7 @@ "type": "tidelift" } ], - "time": "2026-01-27T06:12:29+00:00" + "time": "2026-02-16T08:34:36+00:00" }, { "name": "rector/rector", @@ -11944,23 +11944,23 @@ }, { "name": "ta-tikoma/phpunit-architecture-test", - "version": "0.8.6", + "version": "0.8.7", "source": { "type": "git", "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", - "reference": "ad48430b92901fd7d003fdaf2d7b139f96c0906e" + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/ad48430b92901fd7d003fdaf2d7b139f96c0906e", - "reference": "ad48430b92901fd7d003fdaf2d7b139f96c0906e", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/1248f3f506ca9641d4f68cebcd538fa489754db8", + "reference": "1248f3f506ca9641d4f68cebcd538fa489754db8", "shasum": "" }, "require": { "nikic/php-parser": "^4.18.0 || ^5.0.0", "php": "^8.1.0", "phpdocumentor/reflection-docblock": "^5.3.0 || ^6.0.0", - "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0 || ^13.0.0", "symfony/finder": "^6.4.0 || ^7.0.0 || ^8.0.0" }, "require-dev": { @@ -11997,9 +11997,9 @@ ], "support": { "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", - "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.6" + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.7" }, - "time": "2026-01-30T07:16:00+00:00" + "time": "2026-02-17T17:25:14+00:00" }, { "name": "theseer/tokenizer", @@ -12053,16 +12053,16 @@ }, { "name": "webmozart/assert", - "version": "2.1.2", + "version": "2.1.4", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649" + "reference": "b39f1870fc7c3e9e4a26106df5053354b9260a33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/ce6a2f100c404b2d32a1dd1270f9b59ad4f57649", - "reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/b39f1870fc7c3e9e4a26106df5053354b9260a33", + "reference": "b39f1870fc7c3e9e4a26106df5053354b9260a33", "shasum": "" }, "require": { @@ -12109,9 +12109,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.1.2" + "source": "https://github.com/webmozarts/assert/tree/2.1.4" }, - "time": "2026-01-13T14:02:24+00:00" + "time": "2026-02-17T12:17:51+00:00" } ], "aliases": [], From 89a2edfcbb5d517e9b200f898af8230e79330b81 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Tue, 17 Feb 2026 13:46:12 +0100 Subject: [PATCH 05/30] feat: show version number on welcome page --- resources/views/pages/settings/update.blade.php | 2 +- resources/views/welcome.blade.php | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/resources/views/pages/settings/update.blade.php b/resources/views/pages/settings/update.blade.php index f613c29..099b896 100644 --- a/resources/views/pages/settings/update.blade.php +++ b/resources/views/pages/settings/update.blade.php @@ -248,7 +248,7 @@ new class extends Component Up to Date - You are running the latest version {{ $latestVersion }}. + You are running the latest version. @endif diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index 100b57b..abf6a69 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -32,6 +32,11 @@ @endif @auth + @if(config('app.version')) + Version: {{ config('app.version') }} + + @endif @endauth From d884ac0a581c3137d9577c69fa7f04f4d718d9fe Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Tue, 17 Feb 2026 21:10:54 +0100 Subject: [PATCH 06/30] feat(#149): add css_name and css_variables to DeviceModel and update related views --- .../Commands/GenerateDefaultImagesCommand.php | 3 +- app/Jobs/FetchDeviceModelsJob.php | 31 ++++ app/Models/DeviceModel.php | 1 + app/Models/PlaylistItem.php | 6 +- app/Models/Plugin.php | 12 +- app/Services/ImageGenerationService.php | 3 +- ...d_css_variables_to_device_models_table.php | 29 ++++ ...css_variables_for_seeded_device_models.php | 160 ++++++++++++++++++ .../views/default-screens/error.blade.php | 4 +- .../views/default-screens/setup.blade.php | 4 +- .../views/default-screens/sleep.blade.php | 4 +- .../livewire/device-models/index.blade.php | 16 +- .../views/trmnl-layouts/mashup.blade.php | 8 +- .../views/trmnl-layouts/single.blade.php | 9 +- .../vendor/trmnl/components/screen.blade.php | 21 ++- 15 files changed, 285 insertions(+), 26 deletions(-) create mode 100644 database/migrations/2026_02_17_153908_add_css_device_and_css_variables_to_device_models_table.php create mode 100644 database/migrations/2026_02_17_221924_set_css_name_and_css_variables_for_seeded_device_models.php diff --git a/app/Console/Commands/GenerateDefaultImagesCommand.php b/app/Console/Commands/GenerateDefaultImagesCommand.php index e2887df..42e22ba 100644 --- a/app/Console/Commands/GenerateDefaultImagesCommand.php +++ b/app/Console/Commands/GenerateDefaultImagesCommand.php @@ -184,7 +184,7 @@ class GenerateDefaultImagesCommand extends Command }; // Determine device properties from DeviceModel - $deviceVariant = $deviceModel->name ?? 'og'; + $deviceVariant = $deviceModel->css_name ?? $deviceModel->name ?? 'og'; $colorDepth = $deviceModel->color_depth ?? '1bit'; // Use the accessor method $scaleLevel = $deviceModel->scale_level; // Use the accessor method $darkMode = $imageType === 'sleep'; // Sleep mode uses dark mode, setup uses light mode @@ -196,6 +196,7 @@ class GenerateDefaultImagesCommand extends Command 'deviceVariant' => $deviceVariant, 'colorDepth' => $colorDepth, 'scaleLevel' => $scaleLevel, + 'cssVariables' => $deviceModel->css_variables, ])->render(); } } diff --git a/app/Jobs/FetchDeviceModelsJob.php b/app/Jobs/FetchDeviceModelsJob.php index 9e148b9..2cd39d7 100644 --- a/app/Jobs/FetchDeviceModelsJob.php +++ b/app/Jobs/FetchDeviceModelsJob.php @@ -12,8 +12,10 @@ use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; +use Illuminate\Support\Arr; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Str; final class FetchDeviceModelsJob implements ShouldQueue { @@ -209,12 +211,41 @@ final class FetchDeviceModelsJob implements ShouldQueue $attributes['palette_id'] = $firstPaletteId; } + $attributes['css_name'] = $this->parseCssNameFromApi($modelData['css'] ?? null); + $attributes['css_variables'] = $this->parseCssVariablesFromApi($modelData['css'] ?? null); + DeviceModel::updateOrCreate( ['name' => $name], $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. */ diff --git a/app/Models/DeviceModel.php b/app/Models/DeviceModel.php index 6132a76..f2a757f 100644 --- a/app/Models/DeviceModel.php +++ b/app/Models/DeviceModel.php @@ -27,6 +27,7 @@ final class DeviceModel extends Model 'offset_x' => 'integer', 'offset_y' => 'integer', 'published_at' => 'datetime', + 'css_variables' => 'array', ]; public function getColorDepthAttribute(): ?string diff --git a/app/Models/PlaylistItem.php b/app/Models/PlaylistItem.php index 31a6b69..744a012 100644 --- a/app/Models/PlaylistItem.php +++ b/app/Models/PlaylistItem.php @@ -140,8 +140,9 @@ class PlaylistItem extends Model if (! $this->isMashup()) { return view('trmnl-layouts.single', [ 'colorDepth' => $device?->colorDepth(), - 'deviceVariant' => $device?->deviceVariant() ?? 'og', + 'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'scaleLevel' => $device?->scaleLevel(), + 'cssVariables' => $device?->deviceModel?->css_variables, 'slot' => $this->plugin instanceof Plugin ? $this->plugin->render('full', false, $device) : throw new Exception('Invalid plugin instance'), @@ -162,8 +163,9 @@ class PlaylistItem extends Model return view('trmnl-layouts.mashup', [ 'colorDepth' => $device?->colorDepth(), - 'deviceVariant' => $device?->deviceVariant() ?? 'og', + 'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'scaleLevel' => $device?->scaleLevel(), + 'cssVariables' => $device?->deviceModel?->css_variables, 'mashupLayout' => $this->getMashupLayoutType(), 'slot' => implode('', $pluginMarkups), ])->render(); diff --git a/app/Models/Plugin.php b/app/Models/Plugin.php index fab8203..31a08ad 100644 --- a/app/Models/Plugin.php +++ b/app/Models/Plugin.php @@ -584,10 +584,11 @@ class Plugin extends Model if ($size === 'full') { return view('trmnl-layouts.single', [ 'colorDepth' => $device?->colorDepth(), - 'deviceVariant' => $device?->deviceVariant() ?? 'og', + 'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'noBleed' => $this->no_bleed, 'darkMode' => $this->dark_mode, 'scaleLevel' => $device?->scaleLevel(), + 'cssVariables' => $device?->deviceModel?->css_variables, 'slot' => $renderedContent, ])->render(); } @@ -595,9 +596,10 @@ class Plugin extends Model return view('trmnl-layouts.mashup', [ 'mashupLayout' => $this->getPreviewMashupLayoutForSize($size), 'colorDepth' => $device?->colorDepth(), - 'deviceVariant' => $device?->deviceVariant() ?? 'og', + 'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'darkMode' => $this->dark_mode, 'scaleLevel' => $device?->scaleLevel(), + 'cssVariables' => $device?->deviceModel?->css_variables, 'slot' => $renderedContent, ])->render(); @@ -617,10 +619,11 @@ class Plugin extends Model if ($size === 'full') { return view('trmnl-layouts.single', [ 'colorDepth' => $device?->colorDepth(), - 'deviceVariant' => $device?->deviceVariant() ?? 'og', + 'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'noBleed' => $this->no_bleed, 'darkMode' => $this->dark_mode, 'scaleLevel' => $device?->scaleLevel(), + 'cssVariables' => $device?->deviceModel?->css_variables, 'slot' => $renderedView, ])->render(); } @@ -628,9 +631,10 @@ class Plugin extends Model return view('trmnl-layouts.mashup', [ 'mashupLayout' => $this->getPreviewMashupLayoutForSize($size), 'colorDepth' => $device?->colorDepth(), - 'deviceVariant' => $device?->deviceVariant() ?? 'og', + 'deviceVariant' => $device?->deviceModel?->css_name ?? $device?->deviceVariant() ?? 'og', 'darkMode' => $this->dark_mode, 'scaleLevel' => $device?->scaleLevel(), + 'cssVariables' => $device?->deviceModel?->css_variables, 'slot' => $renderedView, ])->render(); } diff --git a/app/Services/ImageGenerationService.php b/app/Services/ImageGenerationService.php index 87fb6d9..903a493 100644 --- a/app/Services/ImageGenerationService.php +++ b/app/Services/ImageGenerationService.php @@ -514,7 +514,7 @@ class ImageGenerationService }; // Determine device properties from DeviceModel or device settings - $deviceVariant = $device->deviceVariant(); + $deviceVariant = $device->deviceModel?->css_name ?? $device->deviceVariant(); $deviceOrientation = $device->rotate > 0 ? 'portrait' : 'landscape'; $colorDepth = $device->colorDepth() ?? '1bit'; $scaleLevel = $device->scaleLevel(); @@ -528,6 +528,7 @@ class ImageGenerationService 'deviceOrientation' => $deviceOrientation, 'colorDepth' => $colorDepth, 'scaleLevel' => $scaleLevel, + 'cssVariables' => $device->deviceModel?->css_variables, ]; // Add plugin name for error screens diff --git a/database/migrations/2026_02_17_153908_add_css_device_and_css_variables_to_device_models_table.php b/database/migrations/2026_02_17_153908_add_css_device_and_css_variables_to_device_models_table.php new file mode 100644 index 0000000..cd1b7db --- /dev/null +++ b/database/migrations/2026_02_17_153908_add_css_device_and_css_variables_to_device_models_table.php @@ -0,0 +1,29 @@ +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']); + }); + } +}; diff --git a/database/migrations/2026_02_17_221924_set_css_name_and_css_variables_for_seeded_device_models.php b/database/migrations/2026_02_17_221924_set_css_name_and_css_variables_for_seeded_device_models.php new file mode 100644 index 0000000..728fe4f --- /dev/null +++ b/database/migrations/2026_02_17_221924_set_css_name_and_css_variables_for_seeded_device_models.php @@ -0,0 +1,160 @@ +}> + */ + 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, + ]); + } +}; diff --git a/resources/views/default-screens/error.blade.php b/resources/views/default-screens/error.blade.php index be8063a..7f0d084 100644 --- a/resources/views/default-screens/error.blade.php +++ b/resources/views/default-screens/error.blade.php @@ -5,12 +5,14 @@ 'deviceOrientation' => null, 'colorDepth' => '1bit', 'scaleLevel' => null, + 'cssVariables' => null, 'pluginName' => 'Recipe', ]) + scale-level="{{$scaleLevel}}" + :css-variables="$cssVariables"> diff --git a/resources/views/default-screens/setup.blade.php b/resources/views/default-screens/setup.blade.php index 3b0ff05..ab7ec60 100644 --- a/resources/views/default-screens/setup.blade.php +++ b/resources/views/default-screens/setup.blade.php @@ -5,11 +5,13 @@ 'deviceOrientation' => null, 'colorDepth' => '1bit', 'scaleLevel' => null, + 'cssVariables' => null, ]) + scale-level="{{$scaleLevel}}" + :css-variables="$cssVariables"> diff --git a/resources/views/default-screens/sleep.blade.php b/resources/views/default-screens/sleep.blade.php index 89d6baa..fa0c8cd 100644 --- a/resources/views/default-screens/sleep.blade.php +++ b/resources/views/default-screens/sleep.blade.php @@ -5,11 +5,13 @@ 'deviceOrientation' => null, 'colorDepth' => '1bit', 'scaleLevel' => null, + 'cssVariables' => null, ]) + scale-level="{{$scaleLevel}}" + :css-variables="$cssVariables"> diff --git a/resources/views/livewire/device-models/index.blade.php b/resources/views/livewire/device-models/index.blade.php index 1aebeb1..7de5872 100644 --- a/resources/views/livewire/device-models/index.blade.php +++ b/resources/views/livewire/device-models/index.blade.php @@ -39,6 +39,8 @@ new class extends Component public $palette_id; + public $css_name; + protected $rules = [ 'name' => 'required|string|max:255|unique:device_models,name', 'label' => 'required|string|max:255', @@ -102,10 +104,11 @@ new class extends Component $this->offset_y = $deviceModel->offset_y; $this->published_at = $deviceModel->published_at?->format('Y-m-d\TH:i'); $this->palette_id = $deviceModel->palette_id; + $this->css_name = $deviceModel->css_name; } else { $this->editingDeviceModelId = 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']); + $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->mime_type = 'image/png'; $this->scale_factor = 1.0; $this->rotation = 0; @@ -131,6 +134,7 @@ new class extends Component 'offset_y' => 'required|integer', 'published_at' => 'nullable|date', 'palette_id' => 'nullable|exists:device_palettes,id', + 'css_name' => 'nullable|string|max:255', ]; if ($this->editingDeviceModelId) { @@ -158,6 +162,7 @@ new class extends Component 'offset_y' => $this->offset_y, 'published_at' => $this->published_at, 'palette_id' => $this->palette_id ?: null, + 'css_name' => $this->css_name ?: null, ]); $message = 'Device model updated successfully.'; } else { @@ -176,12 +181,13 @@ new class extends Component 'offset_y' => $this->offset_y, 'published_at' => $this->published_at, 'palette_id' => $this->palette_id ?: null, + 'css_name' => $this->css_name ?: null, 'source' => 'manual', ]); $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', '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', 'css_name', 'editingDeviceModelId', 'viewingDeviceModelId']); Flux::modal('device-model-modal')->close(); $this->deviceModels = DeviceModel::all(); @@ -217,6 +223,7 @@ new class extends Component $this->offset_y = $deviceModel->offset_y; $this->published_at = $deviceModel->published_at?->format('Y-m-d\TH:i'); $this->palette_id = $deviceModel->palette_id; + $this->css_name = $deviceModel->css_name; $this->js('Flux.modal("device-model-modal").show()'); } @@ -344,6 +351,11 @@ new class extends Component +
+ +
+ @if (!$viewingDeviceModelId)
diff --git a/resources/views/trmnl-layouts/mashup.blade.php b/resources/views/trmnl-layouts/mashup.blade.php index 1d8321f..0e1cb3c 100644 --- a/resources/views/trmnl-layouts/mashup.blade.php +++ b/resources/views/trmnl-layouts/mashup.blade.php @@ -6,18 +6,22 @@ 'deviceOrientation' => null, 'colorDepth' => '1bit', 'scaleLevel' => null, + 'cssVariables' => null, ]) @if(config('app.puppeteer_window_size_strategy') === 'v2') + scale-level="{{$scaleLevel}}" + :css-variables="$cssVariables"> {!! $slot !!} @else - + {!! $slot !!} diff --git a/resources/views/trmnl-layouts/single.blade.php b/resources/views/trmnl-layouts/single.blade.php index c6d6499..09f5e52 100644 --- a/resources/views/trmnl-layouts/single.blade.php +++ b/resources/views/trmnl-layouts/single.blade.php @@ -5,16 +5,21 @@ 'deviceOrientation' => null, 'colorDepth' => '1bit', 'scaleLevel' => null, + 'cssVariables' => null, ]) @if(config('app.puppeteer_window_size_strategy') === 'v2') + scale-level="{{$scaleLevel}}" + :css-variables="$cssVariables"> {!! $slot !!} @else - + {!! $slot !!} @endif diff --git a/resources/views/vendor/trmnl/components/screen.blade.php b/resources/views/vendor/trmnl/components/screen.blade.php index 1ff7d23..320a34b 100644 --- a/resources/views/vendor/trmnl/components/screen.blade.php +++ b/resources/views/vendor/trmnl/components/screen.blade.php @@ -1,19 +1,13 @@ @props([ 'noBleed' => false, 'darkMode' => false, - 'deviceVariant' => 'og', + 'deviceVariant' => 'ogv2', 'deviceOrientation' => null, 'colorDepth' => '1bit', 'scaleLevel' => null, + 'cssVariables' => null, ]) -@php -// HOTFIX Github Issue https://github.com/usetrmnl/byos_laravel/issues/190 -if ($colorDepth == '2bit'){ - $deviceVariant = 'ogv2'; -} -@endphp - @@ -33,9 +27,18 @@ if ($colorDepth == '2bit'){ @endif {{ $title ?? config('app.name') }} + @if(config('app.puppeteer_window_size_strategy') === 'v2' && !empty($cssVariables) && is_array($cssVariables)) + + @endif -
+
{{ $slot }}
From cc2cb070da4d9fd84f6da55aba19e774027ce8df Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Tue, 17 Feb 2026 22:08:44 +0100 Subject: [PATCH 07/30] feat: set PUPPETEER_WINDOW_SIZE_STRATEGY=v2 as default --- config/app.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/app.php b/config/app.php index 6a47a72..fe8499c 100644 --- a/config/app.php +++ b/config/app.php @@ -131,7 +131,7 @@ return [ 'puppeteer_docker' => env('PUPPETEER_DOCKER', false), 'puppeteer_mode' => env('PUPPETEER_MODE', 'local'), 'puppeteer_wait_for_network_idle' => env('PUPPETEER_WAIT_FOR_NETWORK_IDLE', true), - 'puppeteer_window_size_strategy' => env('PUPPETEER_WINDOW_SIZE_STRATEGY', null), + 'puppeteer_window_size_strategy' => env('PUPPETEER_WINDOW_SIZE_STRATEGY', 'v2'), 'notifications' => [ 'battery_low' => [ From 1be02bb510b7f822e5618e4d1af70c4e224c4e31 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Wed, 18 Feb 2026 13:14:19 +0100 Subject: [PATCH 08/30] feat(#149): add UIfor css_variables to DeviceModel --- .../livewire/device-models/index.blade.php | 70 ++++++++++++++++++- 1 file changed, 68 insertions(+), 2 deletions(-) diff --git a/resources/views/livewire/device-models/index.blade.php b/resources/views/livewire/device-models/index.blade.php index 7de5872..fea740a 100644 --- a/resources/views/livewire/device-models/index.blade.php +++ b/resources/views/livewire/device-models/index.blade.php @@ -41,6 +41,9 @@ new class extends Component public $css_name; + /** @var array */ + public array $css_variables = []; + protected $rules = [ 'name' => 'required|string|max:255|unique:device_models,name', 'label' => 'required|string|max:255', @@ -105,10 +108,11 @@ new class extends Component $this->published_at = $deviceModel->published_at?->format('Y-m-d\TH:i'); $this->palette_id = $deviceModel->palette_id; $this->css_name = $deviceModel->css_name; + $this->css_variables = collect($deviceModel->css_variables ?? [])->map(fn (string $value, string $key): array => ['key' => $key, 'value' => $value])->values()->all(); } else { $this->editingDeviceModelId = 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', 'css_name', 'css_variables']); $this->mime_type = 'image/png'; $this->scale_factor = 1.0; $this->rotation = 0; @@ -135,6 +139,9 @@ new class extends Component 'published_at' => 'nullable|date', 'palette_id' => 'nullable|exists:device_palettes,id', 'css_name' => 'nullable|string|max:255', + 'css_variables' => 'nullable|array', + 'css_variables.*.key' => 'nullable|string|max:255', + 'css_variables.*.value' => 'nullable|string|max:500', ]; if ($this->editingDeviceModelId) { @@ -163,6 +170,7 @@ new class extends Component 'published_at' => $this->published_at, 'palette_id' => $this->palette_id ?: null, 'css_name' => $this->css_name ?: null, + 'css_variables' => $this->normalizeCssVariables(), ]); $message = 'Device model updated successfully.'; } else { @@ -182,12 +190,13 @@ new class extends Component 'published_at' => $this->published_at, 'palette_id' => $this->palette_id ?: null, 'css_name' => $this->css_name ?: null, + 'css_variables' => $this->normalizeCssVariables(), 'source' => 'manual', ]); $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', 'css_name', 'css_variables', 'editingDeviceModelId', 'viewingDeviceModelId']); Flux::modal('device-model-modal')->close(); $this->deviceModels = DeviceModel::all(); @@ -224,9 +233,37 @@ new class extends Component $this->published_at = $deviceModel->published_at?->format('Y-m-d\TH:i'); $this->palette_id = $deviceModel->palette_id; $this->css_name = $deviceModel->css_name; + $this->css_variables = collect($deviceModel->css_variables ?? [])->map(fn (string $value, string $key): array => ['key' => $key, 'value' => $value])->values()->all(); $this->js('Flux.modal("device-model-modal").show()'); } + + public function addCssVariable(): void + { + $this->css_variables = array_merge($this->css_variables, [['key' => '', 'value' => '']]); + } + + public function removeCssVariable(int $index): void + { + $vars = $this->css_variables; + array_splice($vars, $index, 1); + $this->css_variables = array_values($vars); + } + + /** + * @return array|null + */ + private function normalizeCssVariables(): ?array + { + $pairs = collect($this->css_variables) + ->filter(fn (array $p): bool => trim($p['key'] ?? '') !== ''); + + if ($pairs->isEmpty()) { + return null; + } + + return $pairs->mapWithKeys(fn (array $p): array => [$p['key'] => $p['value'] ?? ''])->all(); + } } ?> @@ -356,6 +393,35 @@ new class extends Component name="css_name" :disabled="(bool) $viewingDeviceModelId"/>
+
+ CSS Variables + @if ($viewingDeviceModelId) + @if (count($css_variables) > 0) +
+ @foreach ($css_variables as $var) +
+
{{ $var['key'] }}
+
{{ $var['value'] }}
+
+ @endforeach +
+ @else +

No CSS variables

+ @endif + @else +
+ @foreach ($css_variables as $index => $var) +
+ + + +
+ @endforeach + Add variable +
+ @endif +
+ @if (!$viewingDeviceModelId)
From 84c340be4b5093c9979017bf28ee8b5bee178e54 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Thu, 19 Feb 2026 12:57:28 +0100 Subject: [PATCH 09/30] docs: README edit env variable descriptions Updated descriptions for FORCE_HTTPS and APP_TIMEZONE variables, and added experimental environment variables section. --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 670b62c..442cc15 100644 --- a/README.md +++ b/README.md @@ -121,11 +121,16 @@ php artisan db:seed --class=ExampleRecipesSeeder | `TRMNL_PROXY_REFRESH_MINUTES` | How often should the server fetch new images from native service | 15 | | `REGISTRATION_ENABLED` | Allow user registration via Webinterface | 1 | | `SSL_MODE` | SSL Mode, if not using a Reverse Proxy ([docs](https://serversideup.net/open-source/docker-php/docs/customizing-the-image/configuring-ssl)) | `off` | -| `FORCE_HTTPS` | If your server handles SSL termination, enforce HTTPS. | 0 | +| `FORCE_HTTPS` | If your server handles SSL termination, enforce HTTPS. Alternative: `TRUSTED_PROXIES`. | 0 | | `TRUSTED_PROXIES` | If your server handles SSL termination, allow mixed mode. e.g. `"172.0.0.0/8"` or `*` | null | | `PHP_OPCACHE_ENABLE` | Enable PHP Opcache | 0 | | `TRMNL_IMAGE_URL_TIMEOUT` | How long TRMNL waits for a response on the display endpoint. (sec) | 30 | -| `APP_TIMEZONE` | Default timezone, which will be used by the PHP date functions | UTC | +| `APP_TIMEZONE` | Default timezone, which will be used by the PHP date functions. UTC is recommended. | UTC | + +##### Experimental Environment Variables +| Environment Variable | Description | Default | +|----------------------------------|--------------------------------------------------------------------------------|---------| +| `PUPPETEER_WINDOW_SIZE_STRATEGY` | Set to `v2` to size the browser window to match the device’s screen dimensions | `null` | #### Login From 83b9ca89ee4436d0aa26d9f8fb7b9fc831b3d2f2 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Fri, 20 Feb 2026 12:11:13 +0100 Subject: [PATCH 10/30] chore: update composer & npm dependencies * update to puppeteer: v24.37.0 --- composer.lock | 58 +-- package-lock.json | 883 +++++++++++++++++++++++----------------------- package.json | 2 +- 3 files changed, 469 insertions(+), 474 deletions(-) diff --git a/composer.lock b/composer.lock index 73efe3f..2d15fd8 100644 --- a/composer.lock +++ b/composer.lock @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.369.36", + "version": "3.369.38", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0" + "reference": "6b39dcc5284fae1a1f7e5d4fd64878092a56594b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0", - "reference": "2a69e7df5e03be9e08f9f73fb6a8cc9dd63b59c0", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/6b39dcc5284fae1a1f7e5d4fd64878092a56594b", + "reference": "6b39dcc5284fae1a1f7e5d4fd64878092a56594b", "shasum": "" }, "require": { @@ -153,9 +153,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "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.38" }, - "time": "2026-02-17T19:45:01+00:00" + "time": "2026-02-19T19:06:55+00:00" }, { "name": "bacon/bacon-qr-code", @@ -5177,16 +5177,16 @@ }, { "name": "spatie/browsershot", - "version": "5.2.2", + "version": "5.2.3", "source": { "type": "git", "url": "https://github.com/spatie/browsershot.git", - "reference": "c07bbd63f4cb698a0b163995a5851ecf33a16f90" + "reference": "d2e4ac7c69162999940172a674bf83ddc5ac59ea" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/browsershot/zipball/c07bbd63f4cb698a0b163995a5851ecf33a16f90", - "reference": "c07bbd63f4cb698a0b163995a5851ecf33a16f90", + "url": "https://api.github.com/repos/spatie/browsershot/zipball/d2e4ac7c69162999940172a674bf83ddc5ac59ea", + "reference": "d2e4ac7c69162999940172a674bf83ddc5ac59ea", "shasum": "" }, "require": { @@ -5233,7 +5233,7 @@ "webpage" ], "support": { - "source": "https://github.com/spatie/browsershot/tree/5.2.2" + "source": "https://github.com/spatie/browsershot/tree/5.2.3" }, "funding": [ { @@ -5241,7 +5241,7 @@ "type": "github" } ], - "time": "2026-02-10T15:34:05+00:00" + "time": "2026-02-18T16:10:58+00:00" }, { "name": "spatie/laravel-package-tools", @@ -9068,16 +9068,16 @@ }, { "name": "laravel/boost", - "version": "v2.1.6", + "version": "v2.1.8", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "b8923e6131e5b705da299891284d327562445618" + "reference": "a475ecb520c94357201c70039e984bce6c67c917" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/b8923e6131e5b705da299891284d327562445618", - "reference": "b8923e6131e5b705da299891284d327562445618", + "url": "https://api.github.com/repos/laravel/boost/zipball/a475ecb520c94357201c70039e984bce6c67c917", + "reference": "a475ecb520c94357201c70039e984bce6c67c917", "shasum": "" }, "require": { @@ -9130,7 +9130,7 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2026-02-16T23:53:14+00:00" + "time": "2026-02-20T08:12:25+00:00" }, { "name": "laravel/mcp", @@ -10935,16 +10935,16 @@ }, { "name": "rector/rector", - "version": "2.3.6", + "version": "2.3.7", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "ca9ebb81d280cd362ea39474dabd42679e32ca6b" + "reference": "9c46ad17f57963932c9788fd1b0f1d07ff450370" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/ca9ebb81d280cd362ea39474dabd42679e32ca6b", - "reference": "ca9ebb81d280cd362ea39474dabd42679e32ca6b", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/9c46ad17f57963932c9788fd1b0f1d07ff450370", + "reference": "9c46ad17f57963932c9788fd1b0f1d07ff450370", "shasum": "" }, "require": { @@ -10983,7 +10983,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.3.6" + "source": "https://github.com/rectorphp/rector/tree/2.3.7" }, "funding": [ { @@ -10991,7 +10991,7 @@ "type": "github" } ], - "time": "2026-02-06T14:25:06+00:00" + "time": "2026-02-19T14:44:16+00:00" }, { "name": "sebastian/cli-parser", @@ -12053,16 +12053,16 @@ }, { "name": "webmozart/assert", - "version": "2.1.4", + "version": "2.1.5", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "b39f1870fc7c3e9e4a26106df5053354b9260a33" + "reference": "79155f94852fa27e2f73b459f6503f5e87e2c188" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/b39f1870fc7c3e9e4a26106df5053354b9260a33", - "reference": "b39f1870fc7c3e9e4a26106df5053354b9260a33", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/79155f94852fa27e2f73b459f6503f5e87e2c188", + "reference": "79155f94852fa27e2f73b459f6503f5e87e2c188", "shasum": "" }, "require": { @@ -12109,9 +12109,9 @@ ], "support": { "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.5" }, - "time": "2026-02-17T12:17:51+00:00" + "time": "2026-02-18T14:09:36+00:00" } ], "aliases": [], diff --git a/package-lock.json b/package-lock.json index 8c24285..4984f65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,7 +24,7 @@ "codemirror": "^6.0.2", "concurrently": "^9.0.1", "laravel-vite-plugin": "^2.0", - "puppeteer": "24.30.0", + "puppeteer": "24.37.0", "tailwindcss": "^4.0.7", "vite": "^7.0.4" }, @@ -35,9 +35,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", - "integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -70,9 +70,9 @@ } }, "node_modules/@codemirror/commands": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.1.tgz", - "integrity": "sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.2.tgz", + "integrity": "sha512-vvX1fsih9HledO1c9zdotZYUZnE4xV0m6i3m25s5DIfXofuprk6cRcLUZvSk3CASUbwjQX21tOGbkY2BH8TpnQ==", "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", @@ -182,9 +182,9 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.9.3", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.3.tgz", - "integrity": "sha512-y3YkYhdnhjDBAe0VIA0c4wVoFOvnp8CnAvfLqi0TqotIv92wIlAAP7HELOpLBsKwjAX6W92rSflA6an/2zBvXw==", + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.4.tgz", + "integrity": "sha512-ABc9vJ8DEmvOWuH26P3i8FpMWPQkduD9Rvba5iwb6O3hxASgclm3T3krGo8NASXkHCidz6b++LWlzWIUfEPSWw==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -225,9 +225,9 @@ } }, "node_modules/@codemirror/view": { - "version": "6.39.11", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.39.11.tgz", - "integrity": "sha512-bWdeR8gWM87l4DB/kYSF9A+dVackzDb/V56Tq7QVrQ7rn86W0rgZFtlL3g3pem6AeGcb9NQNoy3ao4WpW4h5tQ==", + "version": "6.39.15", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.39.15.tgz", + "integrity": "sha512-aCWjgweIIXLBHh7bY6cACvXuyrZ0xGafjQ2VInjp4RM4gMfscK5uESiNdrH0pE+e1lZr2B4ONGsjchl2KsKZzg==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.5.0", @@ -237,9 +237,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", "cpu": [ "ppc64" ], @@ -253,9 +253,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", "cpu": [ "arm" ], @@ -269,9 +269,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", "cpu": [ "arm64" ], @@ -285,9 +285,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", "cpu": [ "x64" ], @@ -301,9 +301,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], @@ -317,9 +317,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", "cpu": [ "x64" ], @@ -333,9 +333,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", "cpu": [ "arm64" ], @@ -349,9 +349,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", "cpu": [ "x64" ], @@ -365,9 +365,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", "cpu": [ "arm" ], @@ -381,9 +381,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", "cpu": [ "arm64" ], @@ -397,9 +397,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", "cpu": [ "ia32" ], @@ -413,9 +413,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", "cpu": [ "loong64" ], @@ -429,9 +429,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", "cpu": [ "mips64el" ], @@ -445,9 +445,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", "cpu": [ "ppc64" ], @@ -461,9 +461,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], @@ -477,9 +477,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], @@ -493,9 +493,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", "cpu": [ "x64" ], @@ -509,9 +509,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", "cpu": [ "arm64" ], @@ -525,9 +525,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", "cpu": [ "x64" ], @@ -541,9 +541,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", "cpu": [ "arm64" ], @@ -557,9 +557,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", "cpu": [ "x64" ], @@ -573,9 +573,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", "cpu": [ "arm64" ], @@ -589,9 +589,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", "cpu": [ "x64" ], @@ -605,9 +605,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", "cpu": [ "arm64" ], @@ -621,9 +621,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", "cpu": [ "ia32" ], @@ -637,9 +637,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", "cpu": [ "x64" ], @@ -710,15 +710,15 @@ } }, "node_modules/@lezer/common": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.0.tgz", - "integrity": "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.5.1.tgz", + "integrity": "sha512-6YRVG9vBkaY7p1IVxL4s44n5nUnaNnGM2/AckNgYOnxTG2kWh1vR8BMxPseWPjRNpb5VtXnMpeYAEAADoRV1Iw==", "license": "MIT" }, "node_modules/@lezer/css": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.0.tgz", - "integrity": "sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.1.tgz", + "integrity": "sha512-PYAKeUVBo3HFThruRyp/iK91SwiZJnzXh8QzkQlwijB5y+N5iB28+iLk78o2zmKqqV0uolNhCwFqB8LA7b0Svg==", "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", @@ -795,9 +795,9 @@ "license": "MIT" }, "node_modules/@puppeteer/browsers": { - "version": "2.10.13", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.13.tgz", - "integrity": "sha512-a9Ruw3j3qlnB5a/zHRTkruppynxqaeE4H9WNj5eYGRWqw0ZauZ23f4W2ARf3hghF5doozyD+CRtt7XSYuYRI/Q==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.12.0.tgz", + "integrity": "sha512-Xuq42yxcQJ54ti8ZHNzF5snFvtpgXzNToJ1bXUGQRaiO8t+B6UM8sTUJfvV+AJnqtkJU/7hdy6nbKyA12aHtRw==", "license": "Apache-2.0", "dependencies": { "debug": "^4.4.3", @@ -816,9 +816,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.0.tgz", - "integrity": "sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", + "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", "cpu": [ "arm" ], @@ -829,9 +829,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.0.tgz", - "integrity": "sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", + "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", "cpu": [ "arm64" ], @@ -842,9 +842,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.0.tgz", - "integrity": "sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", + "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", "cpu": [ "arm64" ], @@ -855,9 +855,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.0.tgz", - "integrity": "sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", + "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", "cpu": [ "x64" ], @@ -868,9 +868,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.0.tgz", - "integrity": "sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", + "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", "cpu": [ "arm64" ], @@ -881,9 +881,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.0.tgz", - "integrity": "sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", + "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", "cpu": [ "x64" ], @@ -894,9 +894,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.0.tgz", - "integrity": "sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", + "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", "cpu": [ "arm" ], @@ -907,9 +907,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.0.tgz", - "integrity": "sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", + "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", "cpu": [ "arm" ], @@ -920,9 +920,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.0.tgz", - "integrity": "sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", + "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", "cpu": [ "arm64" ], @@ -933,9 +933,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.0.tgz", - "integrity": "sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", + "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", "cpu": [ "arm64" ], @@ -946,9 +946,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.0.tgz", - "integrity": "sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", + "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", "cpu": [ "loong64" ], @@ -959,9 +959,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.0.tgz", - "integrity": "sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", + "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", "cpu": [ "loong64" ], @@ -972,9 +972,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.0.tgz", - "integrity": "sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", + "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", "cpu": [ "ppc64" ], @@ -985,9 +985,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.0.tgz", - "integrity": "sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", + "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", "cpu": [ "ppc64" ], @@ -998,9 +998,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.0.tgz", - "integrity": "sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", + "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", "cpu": [ "riscv64" ], @@ -1011,9 +1011,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.0.tgz", - "integrity": "sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", + "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", "cpu": [ "riscv64" ], @@ -1024,9 +1024,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.0.tgz", - "integrity": "sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", + "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", "cpu": [ "s390x" ], @@ -1050,9 +1050,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.0.tgz", - "integrity": "sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", + "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", "cpu": [ "x64" ], @@ -1063,9 +1063,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.0.tgz", - "integrity": "sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", + "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", "cpu": [ "x64" ], @@ -1076,9 +1076,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.0.tgz", - "integrity": "sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", + "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", "cpu": [ "arm64" ], @@ -1089,9 +1089,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.0.tgz", - "integrity": "sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", + "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", "cpu": [ "arm64" ], @@ -1102,9 +1102,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.0.tgz", - "integrity": "sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", + "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", "cpu": [ "ia32" ], @@ -1115,9 +1115,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.0.tgz", - "integrity": "sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", + "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", "cpu": [ "x64" ], @@ -1128,9 +1128,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.0.tgz", - "integrity": "sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", + "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", "cpu": [ "x64" ], @@ -1141,47 +1141,47 @@ ] }, "node_modules/@tailwindcss/node": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", - "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.0.tgz", + "integrity": "sha512-Yv+fn/o2OmL5fh/Ir62VXItdShnUxfpkMA4Y7jdeC8O81WPB8Kf6TT6GSHvnqgSwDzlB5iT7kDpeXxLsUS0T6Q==", "license": "MIT", "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "enhanced-resolve": "^5.18.3", + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", - "lightningcss": "1.30.2", + "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", - "tailwindcss": "4.1.18" + "tailwindcss": "4.2.0" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", - "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.0.tgz", + "integrity": "sha512-AZqQzADaj742oqn2xjl5JbIOzZB/DGCYF/7bpvhA8KvjUj9HJkag6bBuwZvH1ps6dfgxNHyuJVlzSr2VpMgdTQ==", "license": "MIT", "engines": { - "node": ">= 10" + "node": ">= 20" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-x64": "4.1.18", - "@tailwindcss/oxide-freebsd-x64": "4.1.18", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-x64-musl": "4.1.18", - "@tailwindcss/oxide-wasm32-wasi": "4.1.18", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" + "@tailwindcss/oxide-android-arm64": "4.2.0", + "@tailwindcss/oxide-darwin-arm64": "4.2.0", + "@tailwindcss/oxide-darwin-x64": "4.2.0", + "@tailwindcss/oxide-freebsd-x64": "4.2.0", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.0", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.0", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.0", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.0", + "@tailwindcss/oxide-linux-x64-musl": "4.2.0", + "@tailwindcss/oxide-wasm32-wasi": "4.2.0", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.0", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.0" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", - "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.0.tgz", + "integrity": "sha512-F0QkHAVaW/JNBWl4CEKWdZ9PMb0khw5DCELAOnu+RtjAfx5Zgw+gqCHFvqg3AirU1IAd181fwOtJQ5I8Yx5wtw==", "cpu": [ "arm64" ], @@ -1191,13 +1191,13 @@ "android" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", - "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.0.tgz", + "integrity": "sha512-I0QylkXsBsJMZ4nkUNSR04p6+UptjcwhcVo3Zu828ikiEqHjVmQL9RuQ6uT/cVIiKpvtVA25msu/eRV97JeNSA==", "cpu": [ "arm64" ], @@ -1207,13 +1207,13 @@ "darwin" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", - "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.0.tgz", + "integrity": "sha512-6TmQIn4p09PBrmnkvbYQ0wbZhLtbaksCDx7Y7R3FYYx0yxNA7xg5KP7dowmQ3d2JVdabIHvs3Hx4K3d5uCf8xg==", "cpu": [ "x64" ], @@ -1223,13 +1223,13 @@ "darwin" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", - "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.0.tgz", + "integrity": "sha512-qBudxDvAa2QwGlq9y7VIzhTvp2mLJ6nD/G8/tI70DCDoneaUeLWBJaPcbfzqRIWraj+o969aDQKvKW9dvkUizw==", "cpu": [ "x64" ], @@ -1239,13 +1239,13 @@ "freebsd" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", - "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.0.tgz", + "integrity": "sha512-7XKkitpy5NIjFZNUQPeUyNJNJn1CJeV7rmMR+exHfTuOsg8rxIO9eNV5TSEnqRcaOK77zQpsyUkBWmPy8FgdSg==", "cpu": [ "arm" ], @@ -1255,13 +1255,13 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", - "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.0.tgz", + "integrity": "sha512-Mff5a5Q3WoQR01pGU1gr29hHM1N93xYrKkGXfPw/aRtK4bOc331Ho4Tgfsm5WDGvpevqMpdlkCojT3qlCQbCpA==", "cpu": [ "arm64" ], @@ -1271,13 +1271,13 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", - "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.0.tgz", + "integrity": "sha512-XKcSStleEVnbH6W/9DHzZv1YhjE4eSS6zOu2eRtYAIh7aV4o3vIBs+t/B15xlqoxt6ef/0uiqJVB6hkHjWD/0A==", "cpu": [ "arm64" ], @@ -1287,13 +1287,13 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", - "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.0.tgz", + "integrity": "sha512-/hlXCBqn9K6fi7eAM0RsobHwJYa5V/xzWspVTzxnX+Ft9v6n+30Pz8+RxCn7sQL/vRHHLS30iQPrHQunu6/vJA==", "cpu": [ "x64" ], @@ -1303,13 +1303,13 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", - "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.0.tgz", + "integrity": "sha512-lKUaygq4G7sWkhQbfdRRBkaq4LY39IriqBQ+Gk6l5nKq6Ay2M2ZZb1tlIyRNgZKS8cbErTwuYSor0IIULC0SHw==", "cpu": [ "x64" ], @@ -1319,13 +1319,13 @@ "linux" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", - "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.0.tgz", + "integrity": "sha512-xuDjhAsFdUuFP5W9Ze4k/o4AskUtI8bcAGU4puTYprr89QaYFmhYOPfP+d1pH+k9ets6RoE23BXZM1X1jJqoyw==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -1340,21 +1340,21 @@ "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.4.0" + "tslib": "^2.8.1" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", - "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.0.tgz", + "integrity": "sha512-2UU/15y1sWDEDNJXxEIrfWKC2Yb4YgIW5Xz2fKFqGzFWfoMHWFlfa1EJlGO2Xzjkq/tvSarh9ZTjvbxqWvLLXA==", "cpu": [ "arm64" ], @@ -1364,13 +1364,13 @@ "win32" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", - "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.0.tgz", + "integrity": "sha512-CrFadmFoc+z76EV6LPG1jx6XceDsaCG3lFhyLNo/bV9ByPrE+FnBPckXQVP4XRkN76h3Fjt/a+5Er/oA/nCBvQ==", "cpu": [ "x64" ], @@ -1380,18 +1380,18 @@ "win32" ], "engines": { - "node": ">= 10" + "node": ">= 20" } }, "node_modules/@tailwindcss/vite": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.18.tgz", - "integrity": "sha512-jVA+/UpKL1vRLg6Hkao5jldawNmRo7mQYrZtNHMIVpLfLhDml5nMRUo/8MwoX2vNXvnaXNNMedrMfMugAVX1nA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.0.tgz", + "integrity": "sha512-da9mFCaHpoOgtQiWtDGIikTrSpUFBtIZCG3jy/u2BGV+l/X1/pbxzmIUxNt6JWm19N3WtGi4KlJdSH/Si83WOA==", "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.1.18", - "@tailwindcss/oxide": "4.1.18", - "tailwindcss": "4.1.18" + "@tailwindcss/node": "4.2.0", + "@tailwindcss/oxide": "4.2.0", + "tailwindcss": "4.2.0" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7" @@ -1410,13 +1410,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz", - "integrity": "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==", + "version": "25.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", + "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "license": "MIT", "optional": true, "dependencies": { - "undici-types": "~7.16.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/yauzl": { @@ -1487,9 +1487,9 @@ "license": "MIT" }, "node_modules/autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", + "version": "10.4.24", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.24.tgz", + "integrity": "sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==", "funding": [ { "type": "opencollective", @@ -1507,7 +1507,7 @@ "license": "MIT", "dependencies": { "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", + "caniuse-lite": "^1.0.30001766", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" @@ -1534,9 +1534,9 @@ } }, "node_modules/b4a": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.7.3.tgz", - "integrity": "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", "license": "Apache-2.0", "peerDependencies": { "react-native-b4a": "*" @@ -1562,9 +1562,9 @@ } }, "node_modules/bare-fs": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.3.tgz", - "integrity": "sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.4.tgz", + "integrity": "sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==", "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1607,13 +1607,14 @@ } }, "node_modules/bare-stream": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.7.0.tgz", - "integrity": "sha512-oyXQNicV1y8nc2aKffH+BUHFRXmx6VrPzlnaEvMhram0nPBrKcEdcyBg5r08D0i8VxngHFAiVyn1QKXpSG0B8A==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.0.tgz", + "integrity": "sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==", "license": "Apache-2.0", "optional": true, "dependencies": { - "streamx": "^2.21.0" + "streamx": "^2.21.0", + "teex": "^1.0.1" }, "peerDependencies": { "bare-buffer": "*", @@ -1639,12 +1640,15 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.9.18", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz", - "integrity": "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/basic-ftp": { @@ -1721,9 +1725,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001766", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz", - "integrity": "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA==", + "version": "1.0.30001770", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz", + "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==", "funding": [ { "type": "opencollective", @@ -1769,12 +1773,13 @@ } }, "node_modules/chromium-bidi": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-11.0.0.tgz", - "integrity": "sha512-cM3DI+OOb89T3wO8cpPSro80Q9eKYJ7hGVXoGS3GkDPxnYSqiv+6xwpIf6XERyJ9Tdsl09hmNmY94BkgZdVekw==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-13.1.0.tgz", + "integrity": "sha512-IdGNojX6S04+wgJOALzvkkIyLelhEGqI8xSctwiYJJGSi9T2eBjwAQW2UjBD/mCXv/rUkNlH2+h7jz+58vT74A==", "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", + "puppeteer": "^24.36.0", "zod": "^3.24.1" }, "peerDependencies": { @@ -1955,9 +1960,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1521046", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1521046.tgz", - "integrity": "sha512-vhE6eymDQSKWUXwwA37NtTTVEzjtGVfDr3pRbsWEQ5onH/Snp2c+2xZHWJJawG/0hCCJLRGt4xVtEVUVILol4w==", + "version": "0.0.1566079", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1566079.tgz", + "integrity": "sha512-MJfAEA1UfVhSs7fbSQOG4czavUp1ajfg6prlAN0+cmfa2zNjaIbvq8VneP7do1WAQQIvgNJWSMeP6UyI90gIlQ==", "license": "BSD-3-Clause" }, "node_modules/dunder-proto": { @@ -1975,9 +1980,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.279", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.279.tgz", - "integrity": "sha512-0bblUU5UNdOt5G7XqGiJtpZMONma6WAfq9vsFmtn9x1+joAObr6x1chfqyxFSDCAFwFhCQDrqeAr6MYdpwJ9Hg==", + "version": "1.5.302", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", + "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -1996,13 +2001,13 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", + "version": "5.19.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", + "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" + "tapable": "^2.3.0" }, "engines": { "node": ">=10.13.0" @@ -2072,9 +2077,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -2084,32 +2089,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" } }, "node_modules/escalade": { @@ -2566,9 +2571,9 @@ } }, "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.31.1.tgz", + "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -2581,23 +2586,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", "cpu": [ "arm64" ], @@ -2615,9 +2620,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", "cpu": [ "arm64" ], @@ -2635,9 +2640,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", + "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", "cpu": [ "x64" ], @@ -2655,9 +2660,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", "cpu": [ "x64" ], @@ -2675,9 +2680,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", "cpu": [ "arm" ], @@ -2695,9 +2700,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", "cpu": [ "arm64" ], @@ -2715,9 +2720,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", "cpu": [ "arm64" ], @@ -2755,9 +2760,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", "cpu": [ "x64" ], @@ -2775,9 +2780,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", "cpu": [ "arm64" ], @@ -2795,9 +2800,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "version": "1.31.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", "cpu": [ "x64" ], @@ -2814,26 +2819,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lightningcss/node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -3107,17 +3092,17 @@ } }, "node_modules/puppeteer": { - "version": "24.30.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.30.0.tgz", - "integrity": "sha512-A5OtCi9WpiXBQgJ2vQiZHSyrAzQmO/WDsvghqlN4kgw21PhxA5knHUaUQq/N3EMt8CcvSS0RM+kmYLJmedR3TQ==", + "version": "24.37.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.37.0.tgz", + "integrity": "sha512-s1jHugVhPtQjiJE6wUyonj4VEGWF+mfRDASqPMPsXgKcjZX0GaznBmcT9nLQ7bBL90phuQUqO4jiV5vTecZg4g==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.13", - "chromium-bidi": "11.0.0", + "@puppeteer/browsers": "2.12.0", + "chromium-bidi": "13.1.0", "cosmiconfig": "^9.0.0", - "devtools-protocol": "0.0.1521046", - "puppeteer-core": "24.30.0", + "devtools-protocol": "0.0.1566079", + "puppeteer-core": "24.37.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -3128,18 +3113,18 @@ } }, "node_modules/puppeteer-core": { - "version": "24.30.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.30.0.tgz", - "integrity": "sha512-2S3Smy0t0W4wJnNvDe7W0bE7wDmZjfZ3ljfMgJd6hn2Hq/f0jgN+x9PULZo2U3fu5UUIJ+JP8cNUGllu8P91Pg==", + "version": "24.37.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.37.0.tgz", + "integrity": "sha512-WoCBK36cBlbaxwuvPWhOp2+lR6O6ynHdDuvD8rEIkxPOPpUoMXSJuyiOWhHtexJBCLaMCAJk33QdYambvQl+og==", "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.13", - "chromium-bidi": "11.0.0", + "@puppeteer/browsers": "2.12.0", + "chromium-bidi": "13.1.0", "debug": "^4.4.3", - "devtools-protocol": "0.0.1521046", + "devtools-protocol": "0.0.1566079", "typed-query-selector": "^2.12.0", - "webdriver-bidi-protocol": "0.3.8", - "ws": "^8.18.3" + "webdriver-bidi-protocol": "0.4.0", + "ws": "^8.19.0" }, "engines": { "node": ">=18" @@ -3164,9 +3149,9 @@ } }, "node_modules/rollup": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.0.tgz", - "integrity": "sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", + "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -3179,38 +3164,38 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.0", - "@rollup/rollup-android-arm64": "4.57.0", - "@rollup/rollup-darwin-arm64": "4.57.0", - "@rollup/rollup-darwin-x64": "4.57.0", - "@rollup/rollup-freebsd-arm64": "4.57.0", - "@rollup/rollup-freebsd-x64": "4.57.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.0", - "@rollup/rollup-linux-arm-musleabihf": "4.57.0", - "@rollup/rollup-linux-arm64-gnu": "4.57.0", - "@rollup/rollup-linux-arm64-musl": "4.57.0", - "@rollup/rollup-linux-loong64-gnu": "4.57.0", - "@rollup/rollup-linux-loong64-musl": "4.57.0", - "@rollup/rollup-linux-ppc64-gnu": "4.57.0", - "@rollup/rollup-linux-ppc64-musl": "4.57.0", - "@rollup/rollup-linux-riscv64-gnu": "4.57.0", - "@rollup/rollup-linux-riscv64-musl": "4.57.0", - "@rollup/rollup-linux-s390x-gnu": "4.57.0", - "@rollup/rollup-linux-x64-gnu": "4.57.0", - "@rollup/rollup-linux-x64-musl": "4.57.0", - "@rollup/rollup-openbsd-x64": "4.57.0", - "@rollup/rollup-openharmony-arm64": "4.57.0", - "@rollup/rollup-win32-arm64-msvc": "4.57.0", - "@rollup/rollup-win32-ia32-msvc": "4.57.0", - "@rollup/rollup-win32-x64-gnu": "4.57.0", - "@rollup/rollup-win32-x64-msvc": "4.57.0", + "@rollup/rollup-android-arm-eabi": "4.57.1", + "@rollup/rollup-android-arm64": "4.57.1", + "@rollup/rollup-darwin-arm64": "4.57.1", + "@rollup/rollup-darwin-x64": "4.57.1", + "@rollup/rollup-freebsd-arm64": "4.57.1", + "@rollup/rollup-freebsd-x64": "4.57.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", + "@rollup/rollup-linux-arm-musleabihf": "4.57.1", + "@rollup/rollup-linux-arm64-gnu": "4.57.1", + "@rollup/rollup-linux-arm64-musl": "4.57.1", + "@rollup/rollup-linux-loong64-gnu": "4.57.1", + "@rollup/rollup-linux-loong64-musl": "4.57.1", + "@rollup/rollup-linux-ppc64-gnu": "4.57.1", + "@rollup/rollup-linux-ppc64-musl": "4.57.1", + "@rollup/rollup-linux-riscv64-gnu": "4.57.1", + "@rollup/rollup-linux-riscv64-musl": "4.57.1", + "@rollup/rollup-linux-s390x-gnu": "4.57.1", + "@rollup/rollup-linux-x64-gnu": "4.57.1", + "@rollup/rollup-linux-x64-musl": "4.57.1", + "@rollup/rollup-openbsd-x64": "4.57.1", + "@rollup/rollup-openharmony-arm64": "4.57.1", + "@rollup/rollup-win32-arm64-msvc": "4.57.1", + "@rollup/rollup-win32-ia32-msvc": "4.57.1", + "@rollup/rollup-win32-x64-gnu": "4.57.1", + "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" } }, "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.0.tgz", - "integrity": "sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==", + "version": "4.57.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", + "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", "cpu": [ "x64" ], @@ -3230,9 +3215,9 @@ } }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3369,9 +3354,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", - "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.0.tgz", + "integrity": "sha512-yYzTZ4++b7fNYxFfpnberEEKu43w44aqDMNM9MHMmcKuCH7lL8jJ4yJ7LGHv7rSwiqM0nkiobF9I6cLlpS2P7Q==", "license": "MIT" }, "node_modules/tapable": { @@ -3412,10 +3397,20 @@ "streamx": "^2.15.0" } }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "optional": true, + "dependencies": { + "streamx": "^2.12.5" + } + }, "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", "license": "Apache-2.0", "dependencies": { "b4a": "^1.6.4" @@ -3459,9 +3454,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "license": "MIT", "optional": true }, @@ -3598,9 +3593,9 @@ "license": "MIT" }, "node_modules/webdriver-bidi-protocol": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.3.8.tgz", - "integrity": "sha512-21Yi2GhGntMc671vNBCjiAeEVknXjVRoyu+k+9xOMShu+ZQfpGQwnBqbNz/Sv4GXZ6JmutlPAi2nIJcrymAWuQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.0.tgz", + "integrity": "sha512-U9VIlNRrq94d1xxR9JrCEAx5Gv/2W7ERSv8oWRoNe/QYbfccS0V3h/H6qeNeCRJxXGMhhnkqvwNrvPAYeuP9VA==", "license": "Apache-2.0" }, "node_modules/wrap-ansi": { diff --git a/package.json b/package.json index 830c825..ec6e486 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "codemirror": "^6.0.2", "concurrently": "^9.0.1", "laravel-vite-plugin": "^2.0", - "puppeteer": "24.30.0", + "puppeteer": "24.37.0", "tailwindcss": "^4.0.7", "vite": "^7.0.4" }, From f23fbf3a3d356b0a1f70109c5f0af32639956113 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Fri, 20 Feb 2026 12:18:28 +0100 Subject: [PATCH 11/30] chore(#179): move chinese fonts into base image * see: https://github.com/bnussbau/php-docker/commit/3d68bab9a95f4a19f9aca1134fd139619f162200 --- Dockerfile | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/Dockerfile b/Dockerfile index c198c9c..5af7b33 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,17 +30,6 @@ COPY --chown=www-data:www-data .env.example .env # Install the composer dependencies 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 ######################## From 64e2b6cdbd67b05f298ad9a146f97357d03854f0 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Fri, 20 Feb 2026 12:20:39 +0100 Subject: [PATCH 12/30] chore(docker): update base image * #179: adds chinese fonts * update dependencies * PHP 8.4.18 * Chromium 144.0.7559.132 * ImageMagick 7.1.2-13 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 5af7b33..c679db8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ ######################## # Base Image ######################## -FROM bnussbau/serversideup-php:8.4-fpm-nginx-alpine-imagick-chromium@sha256:52ac545fdb57b2ab7568b1c7fc0a98cb1a69a275d8884249778a80914272fa48 AS base +FROM bnussbau/serversideup-php:8.4-fpm-nginx-alpine-imagick-chromium@sha256:ed705a4060d50143ddc538c1288afff217eaf76ad5791f7556a97943854cf745 AS base LABEL org.opencontainers.image.source=https://github.com/usetrmnl/byos_laravel LABEL org.opencontainers.image.description="TRMNL BYOS Laravel" From 0797f17ebb47a1540f5e8fae53f1e0b4fc7a3567 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Fri, 20 Feb 2026 17:58:58 +0100 Subject: [PATCH 13/30] feat: inject device dimensions into framework --- app/Models/DeviceModel.php | 31 +++++++ app/Services/ImageGenerationService.php | 2 +- tests/Feature/ScreenCssVariablesTest.php | 100 +++++++++++++++++++++++ 3 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 tests/Feature/ScreenCssVariablesTest.php diff --git a/app/Models/DeviceModel.php b/app/Models/DeviceModel.php index f2a757f..fbc104f 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,33 @@ 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 + { + return Attribute::get(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; + } + + 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/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'); +}); From c7abc14e268d72ff6d02c8726d9ae62ffe425eb7 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Fri, 20 Feb 2026 20:00:57 +0100 Subject: [PATCH 14/30] chore: generate screens for new models --- .../setup-logo_1024_768_4_90.png | Bin 0 -> 7940 bytes .../default-screens/setup-logo_1648_824_8_0.png | Bin 0 -> 23140 bytes .../setup-logo_1872_1404_12_90.png | Bin 0 -> 40192 bytes .../setup-logo_1872_1404_4_0.png | Bin 0 -> 13539 bytes .../setup-logo_1880_1264_4_90.png | Bin 0 -> 15600 bytes .../setup-logo_1920_1080_8_0.png | Bin 0 -> 29173 bytes .../setup-logo_1920_1440_4_90.png | Bin 0 -> 13567 bytes .../setup-logo_2480_1860_8_90.png | Bin 0 -> 40645 bytes .../default-screens/setup-logo_960_540_4_0.png | Bin 0 -> 4548 bytes .../default-screens/sleep_1024_768_4_90.png | Bin 0 -> 4957 bytes .../default-screens/sleep_1648_824_8_0.png | Bin 0 -> 11982 bytes .../default-screens/sleep_1872_1404_12_90.png | Bin 0 -> 25599 bytes .../default-screens/sleep_1872_1404_4_0.png | Bin 0 -> 6057 bytes .../default-screens/sleep_1880_1264_4_90.png | Bin 0 -> 13176 bytes .../default-screens/sleep_1920_1080_8_0.png | Bin 0 -> 16019 bytes .../default-screens/sleep_1920_1440_4_90.png | Bin 0 -> 8885 bytes .../default-screens/sleep_2480_1860_8_90.png | Bin 0 -> 26358 bytes .../default-screens/sleep_800_480_1_0.png | Bin 0 -> 686 bytes .../default-screens/sleep_800_480_2_0.png | Bin 0 -> 901 bytes .../default-screens/sleep_960_540_4_0.png | Bin 0 -> 2089 bytes 20 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 storage/app/public/images/default-screens/setup-logo_1024_768_4_90.png create mode 100644 storage/app/public/images/default-screens/setup-logo_1648_824_8_0.png create mode 100644 storage/app/public/images/default-screens/setup-logo_1872_1404_12_90.png create mode 100644 storage/app/public/images/default-screens/setup-logo_1872_1404_4_0.png create mode 100644 storage/app/public/images/default-screens/setup-logo_1880_1264_4_90.png create mode 100644 storage/app/public/images/default-screens/setup-logo_1920_1080_8_0.png create mode 100644 storage/app/public/images/default-screens/setup-logo_1920_1440_4_90.png create mode 100644 storage/app/public/images/default-screens/setup-logo_2480_1860_8_90.png create mode 100644 storage/app/public/images/default-screens/setup-logo_960_540_4_0.png create mode 100644 storage/app/public/images/default-screens/sleep_1024_768_4_90.png create mode 100644 storage/app/public/images/default-screens/sleep_1648_824_8_0.png create mode 100644 storage/app/public/images/default-screens/sleep_1872_1404_12_90.png create mode 100644 storage/app/public/images/default-screens/sleep_1872_1404_4_0.png create mode 100644 storage/app/public/images/default-screens/sleep_1880_1264_4_90.png create mode 100644 storage/app/public/images/default-screens/sleep_1920_1080_8_0.png create mode 100644 storage/app/public/images/default-screens/sleep_1920_1440_4_90.png create mode 100644 storage/app/public/images/default-screens/sleep_2480_1860_8_90.png create mode 100644 storage/app/public/images/default-screens/sleep_800_480_1_0.png create mode 100644 storage/app/public/images/default-screens/sleep_800_480_2_0.png create mode 100644 storage/app/public/images/default-screens/sleep_960_540_4_0.png 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 0000000000000000000000000000000000000000..f02b9e9c404256aaed9ac5333cea3ab3ec0522af GIT binary patch literal 7940 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..3bc23a9c0d02af03648c799ee72fe6c11e5c8eb9 GIT binary patch literal 23140 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 xffp3(5X@B5V_^1c70aF4$w{i>%e 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 U`RNLf>Ol|hsVEfwWAOU_02T;SBme*a literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6f9c2cb71ce8926e74752015fba31e8e5be59a27 GIT binary patch literal 13539 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 bwI(EG%40p*7kz)fUUIwSd9e|4^QZpxK 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..1633f3166ea84d9bc24ee768006c096cf238fbd8 GIT binary patch literal 29173 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..f40d4517b309a6f47d47d0223e908ba40303e64b GIT binary patch literal 13567 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 GiuoV&haIf| literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ec4e753e3b3343c16182085d012876816c432094 GIT binary patch literal 40645 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

jVpSV9y|;L72@?yp>>w3wjWhV84$Wzl&W8 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 AP5=M^ literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..0f176426e4e5fe652f22e50fdda1b5c94e560a65 GIT binary patch literal 25599 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..67e5a280d6d132c9f6503d4f19c939c6ec37035e GIT binary patch literal 6057 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 J*V^2|{1;&w`e*lx$Zy67LgD*fbuJa% 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c0f2ca0b94daaa2e6e5b594fd31806ce18d84615 GIT binary patch literal 16019 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d1908974e7251ba5d456ae9249c4f4b4838edde2 GIT binary patch literal 8885 zcmeHNX;@R&*0wFZ5k%0^f@O*m(19{kWDaRSi%22ut&e~RDT9d0Jcfh>4Fb2N5G_?o zB1tM%yrqJQ5azU`no=4PL}Um7Lqx)m5X=MtlDiMI{o3c=`}F?&e#jrrIeYK3*Lv5x z-nI8W`Siokz^z7>Mw>Qm+8T7|z~47*dYQ3l6YQ)3c(7@Bvp;CqogZ`nbp$&q6{62r zhh3G&G!?nqUoa1FkJ(Ane8ElI)pvg6{8<(W@q?8aKTI*Ui@J>;_EQHt>6f!zhjow3 zwmqzqHOFNKSM^678H_|CO^0uWQv;ULJ+r^nKJ4EPO|sQR+WT+$Vr1w?T)_1avVIoo>CRNt+7Y)tl*w!pL+p5=n1xu2BSyidwLj3_8hb1}`T2 zm`^A0ITlnytt7e2dF;*jboFIxOca_g$jc*SDf^do?i|RQ;fW@E6RxYel6=&;z7meK zF{BiYOf*NrO$9-?#xoxC6K`FC+*$EB>h7@_lcHM|*-L^^jczbzR~TE)?(eDLzQYy? znivt3fx@dE4c{46_(S27fcu}K**q!UMn73&gqbm7xo zj~@$Y`~VjD`ZRl>hC7mjCeLTwIsn_Jl=qgIq8dF*&PZwnJdx@!-?2aX?i{a}$D~hJ z0s^ZG{qR=Gor&f%E)wY%afEa*$xK?$;?t`i@*M|=O>krC)^^x5V8{)2a(fI`H5t2u zcqf^&TN;KZ>~B#V;X6J+HNzKhU7eHL+)C3fNVU`uUL`s7WsnQA>H&)h1cpv)dn5j0 z3iro3ZgAJo+o;Av9>HC%A*@&2O0)JzEXWf_I&iMo%Y`S}wkz+|PpTG|fjzVD^Vw7G zV`Qhlp&F0iQJAoNW$X%}y8(LdW}M<)omhIayO+bnnS)vPNE$`6%L%QntJ3a21g@zpQubbe;ZYvEb4h*1)ZzA#5`;b-fAWMK5Q?3G3ZYr9ew$lwmJ5pB znfKCVpe1Xk$rHAZmI}f6wbO7}`9P=q!A|qjtWk819WpDfsAv@9k6b)#bXh8=$Q9Ds z%D>(IkYqmvqLgHD*ACX3h5cwrBa~H_`d>c90y0y_8IsbrHY5vf9|FWNW=|=Q1^bMV zMwEl24eBB0Cj=*8-_FR?A7V#L?g$apcOwpMq1buP=cpzzVH4y1jf{x%K5WEmZd6l~2L$m9Kt|F{yGZw9rLZ-T{28|8*iFLArA5G%LXpaYJy+8JsQ%%~ zpiIqZ2(v)~t@XZPGQ;T@J$-+7X@x3)Xe49k zPePLM$=0>}xqc}Pr013KAxO)&L5eoT{5HyvVy7)j_5rc5Uw2$)qMZdOTx*_r}PKll;IEj%Ev`$ny#{cRHX!_77|G z$BdKH0gXwpL2o$agrMQkGT(8G*wj~&AX3+5`?+ml7KBLh6U}8ViJ)8J3d#pgDf+dW zsJUA4b;RAZ)77TjZfV#Y)a_B(YoK2|YrAq9Xrs(z6uj@@50=nB!Hn=xj#v1#cD$d~ z8Aw>Jx&s#jCT%;@nw~GaZ?q+wlOZ11QcJ#bgo!7LJfkkpl~3KjKFw*ChF>c@jcglM zu1ZJ!+w1)+}gxUkhEJ^gM~+mvllUr z>k5%cT^B`AP{WEK!irr4=-ic@KwzOsJ0bJrlzOpd{keKHwtYjN=AJF!MxcdB{noO% z6D2@nd^A^v>eihas8b|_^{DS)2-HcnnS`|j>{+tP%Qmau#0kYroj_wa*k=DX>4I5aYK!ulNe}XkCc1{U5q}&4)eyDONwORIC1-%1TvKLZ-9xGCt z-vtkcoA>;OD*UHJUtb3PPm=Jw=YLt%Jje5YS^GUl={ZUpo6hHI^Y1&OKW7KxQ#8E~ zLDCd4YUP7+v09PqOheM}j_D-Y_v{!8Wsi$-7^tH_M>}2(w3GB#cT`m%chtMXr`tPTFJT1c+9=hEMq#;dM9v=D z^Ol)X5}LD5k=?_Z_ak1xAAnxbLnV|cgb!B_@Z(-lO2&WT*Le&TlWZ@6!JWm?@J_+_ zt>X2&sAu9DsoCKar5Q!--B`s5f->-G*>Nkr%j`d_h&-t@E~(42N55*MFAziB$2O zG`#02fL+dK;|Q~4l5G{hbt;=*Ak-;^n5VYER~Qb9k4t&ew%vIDKg0&nH4U@nAsFwX z$f=(44A~2p3~~7++64y3L1OsZCG#08!}|~6lLYxPxIX zM7icH2v@!<7Q;VafH>F4WFF~=K9NPTomfn071@j2K!7Gp*>i#D;#!PXd_q2G8F{+7 zaE=jH{(=>q!O3-9C1mz3e+=6n`X0Xqe~XJXQ)Z7k10GZZWILh~lM4OJl*0yyHeqmK zGYXlG(?d5E(((K55}pCV9Ysz_Ehc(t5@*3!NiA+1)YQrhHY`;`8HU_(o5|D;P3K% z19ebQA)4XXKHUL9)SPFGQ=HYS9>mFRKLI9Nq_S>jOfL5W*RnVZp`qT)f7nt1T9Z$% zfe2=WhEl#@1WrG>_9nP-Fridk0BvGre`dRN9ANfQmMp_s&}>x=-h4a4i`9Dj4h`>; z4W?aAQ!RN*PGZ_r2tU9&4O_0D7A6qC!aL?c0d23S0K~cM3t*X-_5|s3Wfzr(xEDDV zph4%Qd2jqB60N&OE2%3WXjEftEc}nhCxK1gs}n6W`~fi0U|hX#nZ zQ0S0fFTWK#yZ04~o(ZNWF#5FufGX%E_OUHyCHtX2;EO?e6ZPs=onC!bF9EP&c)_^G z=OhpkrsISPKC>&(LDDbnn;On=;(!iqRwy5%B*4dNM(tkE5DFK1Z_r7ci?_0P#9v2* zE!POqp>j9?n+akvIy?3e6rd$&XFe1d$P)NIaMgrEVUm`{H#oT$=n3nQcyWBMj|~d_ zeS25!9zcn^QK|E`yH6Y;(S9tnnCR51XU1y&j6%>~mI?C0@;OeX=?&nkVv_NDLjGTF zI%MZNNzx5*hcVG#eH~~onfb13q~254O2h9wL8ASV)9Pxh->2~ex_L>soKp!zGY}}j zvsmUB)=lFHlH^m^geNh}5{gyMa=t1_mfisasf*6-o#p_J5_U=!J8wmL*Z_TKA6x1L zE}%E#@^d`w_evI%Nkm`G&T$Jshn$`mPKqVCsC6;|-W$$0e=SteNQ~OY?~CFM5M|Eq z_*~y5`85AYifAveC61T*0g7LdrzpCV3QPhbe>d_F#*c!x239{v8ClGb#e504?NQ#e zqR^0l(s8C4RsX?%j^^GuaP<3@*`F4!lAwI$+CBNt{ni@^CpfE{9us3tH{)J(NKO6c zYW4w%Ke z7=cX7V%7q&EgJ7zjdueS7B0H@5*6a2gX_{%k-MdAABqe}?DM+QgbtjO#K`&|0#1@> zAQN-}JO6J;O@%vVXcArj1>Tw7VNEjF-%TB2r-|YiNJ^o>tnwdcBLwo_<3{_P4 zQr*0P5Dc%7uJ4g767J-U%FrAh5AlmDq!0641voJd4YdSH4e-I_APMtthl9M4loxQZ zC$=NN*uI{ik3qS#cH3u%BFoukl4i43+nBsdkK(B&MAFrN0xgdX+iUF~Jt{WhB zp~wJ`S3u&z0ol*~{JYEG+;(7Ta#_(ZZOg`^_#bdfmY5Jz%WEdbkgcn(vo1L!J*H^61d%ykN~#NgvWzFiNV}`9%hPcesnbQ1yG2Z zqP$Z{(Gdrr3IsGu<&+qBt_;nu5!kpX;ypt2E*n*jpxVjsvS?FR>!%#sK&6LgCC|Y<=V`TET z>bpV%fXv|2hy4!GWxj?Wh-5*nw4;M)1mYY<_CT$Kia?KxuzQ2PZ$Ag*IUxUUmEmUsKAH!<+MA*( z?!4k=r`d{=rFXAwrhK^)(m&T)VyKA+pPc+YRzkn;=$xrCN4)gg&p|dR5hWM&urPep($%jXJ$B@LUv@rJOaZUaBBK}|wMX&%$9&}F2O6~e6K$J`PvwkTlCoW- zP^gF5a_Vp2>wYKw7yVu-{!hwDgBl*c7E|5bQ_9V%2$&h;hVuh@jAlPjd#6{HS5{d& z_ZPO||I5Fq%Q1jTPYb9c~n31sxEHHF36~JLxQcMQjykT-^k^}nR9|! zNED+c6I!I9q~;pPSikJHT>&XIs#eRbI^=2~kYiQ{4Wf_CIqi+&mKymVyyj?qP6eLk zt$&EW06AVT!5zPO{*`!Q4*6yLu2MOw2g+ORS3Sl0t#8_{Yku5w16p5#9}K?s$@@-? zTV?+->^G3(%@HPn;RZ=;X1IzuHy5I=ZyZqKSpUt2u?pP!&#>zXSAoZ#UXldFu_C%Vd!sW|HWW zorB*G$%vHJUQx{rHW9JCIfJKrQe5pmPl?><>xPmamA6-~TgA=@lpt0a`xtSWO(G)4 zhuxFuE~8NCOAwi76qWj4V4F41OjhKaAWwDvw5|9?R16|!i4ytY{6C*tIhxAz+9Sp) zYZ12zq5_f9r|MQH)gd#K`pPjG2@%tI1kZ zg!;b^5@^A%uhmxPQ`A>TQV<`vjak{ntj+2mMV+1l;u7NGXirp23Nnnu%pE;I(uL1Y z&AqiK)|y3r5AnH>6B{su_VTP$R2(e1g+eXTyge7WsZeP5t8&~ah*WN$5xJq7xY=p8 z?w%$=)PZ|7xGU2l(v0`?^~B^-pDun3K0cwTzU#(`qpP=>pE>x=eo_J+ zkM*mcYezQCy>zOC!#8UElE)8YV3D&kxD(ns)he;UNmK?d`G4iA)cXjEQpXQM zSE!a2IK%lWC{!!rUArH0VR*dkrsyqj%&y+JU}h5jIp2GswH>DdcbN`qU?FJOP2Ur& z1fB}qZ@Z-(J@yFKsRu$ZWfvP&6QQje34=llXb4{DKohh*h;1VgI=ba1h=ly2c09KT zk9Q&no?~n5xBHo&m2uxgp_oR_dqL6}x3KAUm6>`QX^2eOE{WOdu=RsYw6~(l;mdC& z##P~P>!p6Xh(%qM>&jsZDAWVmIQ9=?Zqz8;W$q8gw(LRS0KSrCUu|v%xA3F}UIr5% zybR9Y{*=glk($XJOBlcHi$Y~+^R)j;Kquhk)VRo9kegClrO|C^dN#_Nc&+uBCQKlD zCfdWS<$XMZC%PE7tMsW9M^jy?vre&DmjPB;Qd zIRA(pSIp31B@#%11rP}>CF=H6o2nop_!!)4lxhXBy|V9t=hC!0I@HN-k#S$R47vuFZMwyPOc1RCbB{>FY`BFVRO4_tJj{`tJ*1!ZVK%q`yGa@B|OQ?+g2#E2Tqual-)ArStdN$YN@jT7Y z_b*MBA}*j%`;*Z@XD}{dOy|6e%@0c#C7f#*yi|MJf4y<}?JP<)4FJlaSfA^w9!qg} ze2zmkf1~@@nZJk6G=yWdG{4`8+yk?NaClbPs~pBqW1emRJ8k1hx+dk%E>jfB*A3Nj zg(84Les~^*PXe82Hh78DvE0r}EKs0!1?LSF)_JcvCLyK?XkH+yBoAVBde7M8$@(Tq zC|a4{1){NOGa$Wap^(awqOPZtI^DMCdc#LTTACWh6rtU_XkPmuVlSe?2c8rq;zJhv z^2}O32Q<~UcA8_KC7O#fq_yFbuLueFqtHFs_u}6Vd150_Ey}HPWixZBY?-9Rx+Qar z8Ahw(asobxD9uHzJ+mAO^kO|Dh_wfZlIwniyR5U`J%$oz zr%eL~QK*(wkL~GG@Poa3vj2z=JIanXSGB>N<{czOxchA^oqBRmv24A|5t99Ve7xra z^lQ2jajx^3T?BW?E<9tCC6=riCs!s$~a=n-EBy?u$SWvEzE z7g{|mQBtgPIuKjiJ2|RujD;5?TV1|fX4)s`~*y%(Vva6E~{RK7=z8n!# zS2uwNBudHVGvbEtPYOj(%TzhD5{V&v|2zVyhEAFG->;--Ma(s%BPDJ>Gr9yhmj5Yy z0ItJ`V?v=&2_C?ABP93U(D?Vz1ybZD#X}I1fRuNb{PPIp>XqB5Sh!9@yPLpH#T0?~ zo45R+y=kQoAHtup>`NS>=M$|U$6kNRd~?0U9ZFTL7Y%6G*dDeyfFCZ*F}@H?>3(Dn zIacrqf55~?KSNPX1-2oZUc}=mll-REcri~F%NPD;U`Lc8>c1KUSq8ebyzcdB3TqYB zjIhG^)!o}=6(szcfOpEg^G+ijy}T(1y@2uwSNH*PWvB;F_w6TGo1!uVpOSr=TIme} z{df2I5c+O|DdrzDRN^yczsz9ceA$q1^+u9}X^1Hl5|K^E`}rHzU;-}K`+pSGWrSvh zx6c$nvdi~{5$LAuYWQTLnqLFAdepB0TQQw17#f#0@yJwwUQ+H2uVe4vsS^2g1yLc8 z)hqDPhWqgn8&u%I<_wV?6eWX6@=(7<=Bd6M=hKxKV4ohyp3#eFxZ3%a<)?Nzc8zef`aN(bdzw)bGoO6CQ#A-~3s7g@eXAnM1& zf}(quH7{TTs-)cn?vNub?;H*{+#Cu+wJe9M{tk{fDYm&u%vrHkiy=1biHa=C?k&A) z1>wZy!60YC=TAb~7W`YS%sQMeT~p%zuLqR`8yxO;CYP zvbFFN6C5iIeX^g<=t?%aU_UOu-9WiAK04|?Fhd!xlusO5 zPfS&>(!JQ0Bd9wGpUkmI?w#E%!wV~SNRS`)*ti}Hx-yiSSSUwjwHjYYZ5J;A2`kYG zXe{8SFWwlDJJ!1fO;HyQ2C_Ac?Mhxd1=ylmcH?vi4wtZix*y)djMJIKfX4mZ&{oYK zEc47#hC)?Q6^l;$A$yJ<&+QI5i$d8epDL~|5^wE=!zZ(c$-0=`Z(Oe0qYR*2Q&da2 zFH9xt0Vr7}Qc+Ep>`|lr5(-#PeGGAlww3e4_bO7JUdGaubCb zn{XyVSc#KqI#R^7tXM?N>ALCH8}%WdQ$S-p;QP+fj+EZ2sx32EYoZR7&=x;>9#XkZw^9H@7Tj$QZQb3)n9PJkO9;$v4u`ys zop%x>KgV{_s4xmSwny0M&%5bEmTfqts=29_)0i=$&-9O?e%H%6+20rmOv~#j-iWPc$tcQq+3An%5sqT(49} zv{s!7c%Cney$@_{x4ctpgulk&dCZ_LYR-=j7#Mmmr+ZaFu%J*N)1t zv@)cD_LXEjJDALGFd!t%?v!I#rZZ>VN z14x`A@$N^@pbTMSTO50_luL0tM~p)wY+LS@;3CwWbf*R%TUU@5QM}E|SvDKV|BA|V z&Vu^3BB0Q+FsikzY!GOr!Q_uxk#+sq5Z0?uWE{E#kKc5D;8R`L?`2U1561R%DLZU{ z8Od}XhdKZ`KpIKlBtZ`LYDlc%2OIF~#Tnjj%vV(_^b)iKdBCZ5xjYV^^XSn;4uhMNnI)vThj)^r#n z`31XB+SeBpp~;5pSM9U}?22Be%WtST>3AVagF+K6Twg=Wwx4MsgBMN{wik63PF&HV zmlp4U=lA4p*fZ`(5iMM2rL5P1k~9$pO_lq?@1TizFa?V(%aWEx{tKrIdJNfVpk1Lf z&11qgx0-0@_Iqhxhhhzvq|JPZ^Yax5LBbZY_7`E7;~#jUD$^6)4JO~GIGvah*`FFQ zc>!Zm)Z_y*3)+E#Pk2*Qf!@G;%W%Kr21~x6hx;*lp?!8`^|WxXk0NrRnS)mlx)Z zRfv?ID#^{w(`PIGP;+;Q5pJo!M3bAh>ugytr=Zho{e{|-db8^&=eD269pk)>SXK1;*jNJ6KRCdX@;+R2 z;kG7-fwxdbp>GQ)?Vq2i6`xtJA1Nn?9L@YwpnT`sW={w=bANq`CT(N6a0Z{iN^HSDh8_Sgd^Z6si?@`JW&!! zc)T)tYT$TPEdmZd0GvFIX%3X($gU_#t=iw32{6}=LXw5-yKIm0CKJ`POmj1 zsvGz#00>F6)Np0kcCNu%l5K^FiNS(yi(P#MU=0F5DO6TS1z-$XbgPF7(d!luf=3hw zFSZ>mS&HO1eppJ(g_MR!Z6e4y;tY;IxE%I^7VY?ePu2Azch~06R~q;)C4zLf-lQ(9 zh03OVq5NAisc|!inss*@BIA^z@@XU|gM_Hm<$fX*%26gts4W#jp$UM&)qH!QODD2^ zS#gL~=iUlP&)n~c37VU{35S_ewmaE>GS?sNJ+!2x!<`?H;7+fSxAyM@>^`Dxa3~`y z&+7P(`)zppO!Jpl>x0X&T6$hIAHj2m-*3}sJ5b(grY(ek z>JY{2MTqNX&k3>4%_HOGK^V;Yv>hW@74B7)lfzklScBiyhYL1E8Ds`~2j=(B1?I|B zrA6)PBY>Q5AbVE1&iyeL5u_)ApQ}_{7`*tHXD5lKmSw{67g4`oxQ$yT9p6`)X#as^%LKh`57DXXx1Cnku&Bs zNt)?SCe+DYfSuDP#yZ>^r+`*CqkkQGS#h#x)>2p7VtY{JGW?sf%17^5Rz_GFvNM>A zY~^dpXxgaW%xHQEY2p#4SngTx4aSZ}tW(vOS6Q0th7tdgPsw!X8F%63pe3aLm5q~< zBlpCFkaPN#H}HcoAuD(7{QNoS>NEpR5v0^sT8`}A($x?knYR??ebFSNa{Vw);cLRr zqJ}IIX^K#&WHPbdxzl(#b5JSj+dNc<(>#D-V_`oG@IDGw{6#?cs>xB%?dFO6$? zAT{Wok9i3q**~YCBRTFE1YN-*66gva?Gw%&P zscl{jK+9j22d`s49HK@$`6L%U^H~yffJKOw7WR%ly3uc{I@QSZ)lki<^`G!?@i9KQ z^?W=pz>p;Yxc}!1b*gDtflqjW3AQpg-4hn>x-|8pZenlV2<)r`h`-N4hznCmHGWm} z2Q#)0TFeU?2;&j`_~&&%O2L79oQSIrOE{#vO^{0nYpDT>tC1A{!cE`^IdU-vlcBDZ zrq3Vgmd&Vjr&#Sb+x9@U=xKRrDr$1syUsfAOQiR$j?Ak%)U8aloFdsNC*+H_vf^);du>(GKvft{8lu>pz_08doZRaY-Woo zXKc{gDjOl6eqJah)+wzsCq~5=;JG^GH^0}~S#hNb{L z5qS&sao!I1s$EK?FS+r`9>^akssHnz`8^T6i8dxEdz+13k*Me|?!dAJ#y7*R{-)}I z;5)n?fdp9HD|l)|HW!WdUfYy`D1^KekZ_kqCvx2(+{>b*V zMGi1q=m^HE;0m&Qu?ed3@Mxl`hbLd&mr3s$gxpX)7A#s;;pgDpaY3^#qFKY6$=i6P zc6g{7ELK8AYgC8+f$0iD;aEgFsj$NDnB%gR;*vCPPSUR+*{mh4ZFdQ`bF?J>#f2HY z;SQw;*Q1a{R5UZr!lE@D*)SI>7VA)s2{;K?SlK)?K|JkOu6>&6gRb+wPc^1j1;R`j=#R;HfgNYS~-DG?xf>(NP!D~N7zQ2viylk0l8%W#q3wIIGgchAzX1NbV{^k^@XvGvMw-Y%@|XE{{ZNe zKh)PuE0^G{sRVP>uVfklT>g}=aqUE4`-OT%C8cBg&XSG@2^#PrCvneVmlWd!z^kD> z2;Q%ipydD@8VOk;EAxjInT$z7p)~-pZ`&I{q5h~!6;n8H`GLptZ=Poi9Rf=RYWmO< z2N_)|aM*VYe15wCKxNhhOcr4AU0Iod$##I;PL=ge+ZA|xbFLD!+1~-IR=ETE+H~m# z$}9|Ogm_u+6z+;@xw~$S3Uo;Zh+gvvQzCLUbf3?N=NR`f@X>~JD_#0~W+NGR&lWU5 z&)yyI1c9o-KLgh3(p`K{<-&xp`Xf2+m4%@paO!|~6B<5M-v0gRa5#Uab}%g{rHH9V zK67%g#7>cfaRD{qoUkVB(eZt)wDPt>1+E$C5YfzW*Vc;1hg|X*{w}#LzoA=V=U$(< zsPt~z>w?aDRg;#>j&(l04jZF_(&zBWH@lw@Hmfm#x^Po{dNpqcq#h#)hDLp_Bg>V)f^qM7lxVll{E{JID=x+xPga z(6)z4U>e$YnX-5#uQUp}1>TSwk8Dfvj{e(<>0M@>{5r5O9+pE3p3oev#eYKxtCLp7PLv7i;XKjLfI2 zp01W*ycH-E$xA6QY1uR^XI%9J40DfZVDo1kS&aS(7C99};F8mK&1y6LkZVG%29_4{ zDj2PdSFbpfUf{8sMW8$W4*iD~KcE-tdn;aO+M?s}30c35`of%k5|$1z{~$l#YZsf4 zVBKpQZ}CORTzhC|A7eUok2#hC%nQ1#SO9_kOCjk;I2?8a^dm7kj&9X557O}=ps2bs zi*Y7Y-NYnQk1X15NJ8s7RHagtF&yr4C(G$ykc9SksK8@w^%DQucH5u&g$E%Fbiw*R z!$Q@?)3aYApJ95@0tXi0I3^QNU(3^g(V~Ebb&@wNnQqko7TAt-SrfCsW?;uXUN0~auiV2?HZ8~m#6&eG1XXy;aJjyuk@woR{$|$wFXqrWHcB;b zvYS9n2vKOzS0$K`#sV-PwrPzgPH^De!`eg1ljVJ zEP2ZHHMdpQ6m`%RZGuwW0PE^l;-88_jO{m_8ZSYi8XKE(q|<{DY;QA^3fM*gkJJ91UI7@bMw9YRhpz7k^Eiu(L6Z}pl{=Jqj}E9t>Elw+72Wo#!NPQ(px(H)M`e-J zkxil`C?m4}`0tk)c!?|}sQ=2syyBql^UzDEmIRmPn2--9RNu&*gxW<@9r0=Vn`1L* zbQGSo+UbU6mecsLO43kKSm|~P;3y3pt;&TO>Fqa&LVM%pM(WL_rsqzl>-Y%tu81C4 zv(#SK(v$^RI%yxoCw7lfeLZK}_O}g*y-~U9o+z4L)y)t-Z5Je=`J5^1!>O1>khe&g zn1h0u=UJv#7wy3r<^Y4p3tim1eQk;?s~LZ!O~J^EHl} zAon@>r*a^ylFT3r*8E!2#(npX^U;ne3mL!)?yzVq^_&zV2-;%g6ktWNLBH&H)4}rt zbthKldLtU-jn^N!=pthRY&Y;^DTeVkn6APN@^!SA6`C8clffaMvhFce3@2+-)#{-kYiU;zfq_) z_T34?lcaXdFGiuzV-9#ti5pqUV7-wy<7JfkCQ}wF4?wc<|_R>kq%tta`W5*_Uoh1z) zg)+45x~=oLzovqp!D>;w1sG?O-$5E{%{;241ipM(kG7*kOlx9_nriy}+LqtbZxa!N zKH8&SY|a&^??oMz10jRThS_W>j$-6$t5%7hxrTfZkdr`M@qSW=s6Wh=m<>Lx`aJUQ z3rW;FbFG9;AMcxUx91ggr~ZpgJmFy!HWRPrxRH`Gy+&nxnT6!yV(YXIm+%eNm7h@~$g)lGVKz$1nJi>1d zR<)0D?r+c=_wGpAXs}eB7twM$pa{uV?3%rLX?DksHdL+8QS!LhixY^)YDC~rEms?| zN>}FAl;s_Vj((|R59l`yKMym<=2elayNAq!XP1lwhhiNDGmThm{mcKjzEIzqDK~1J z8f<%g;!rwIamZ-yIkj%6{U1&725-??-VZ3u`Wo|kxl4c0`DQg!{gS#L;P51zRo4nY z5R#E0nh(BJi+6i*18X89Rcm`!;kx4 z1@~OCCBdt>|EyJ^d&+WCr`^uqe4Z9vS7jZ(E5xR8dQ5hhCEqJIjH>)&H>yZi28K^ z+|}XqVlyWxs3fw;cfC~-#}~yUhu+bI@ctSe)royF#0=pms!lF2G%VvR8hP26nkV%@ z95ns5EHcPh4Ju;eHn$3LVdMx7ZGO~`KjUUoqVUDNM^bCBZ+?=TXvsZ|Qy?)%M9Ygzc~AHABJ*PYGo0HelWLT+LC zb{;j!7D(4Bx!2zcAw4f6zffEvcBl%{w**4R)k{=xsdJ5 zT&Lww%^QuJXO`m(ARjK=t*O0OoZNH3C-MWP4O98a&tK%m34fII|7!Te6I-VlT{XB- z!ed^)$c;$ww_AH{>z=4z)oxn`dYTcQELfcc{s$088139~=B~3Zq(d#PNQuZDIq>Q~ zCC&eh{VxA=kN+9-|A~SBiGlx#f&Ynt|A~SBKgYniLjydttc-}j`1j7xHwohcMw>w= zY|nR>w6KsjNuhmCL|{^HRS#)mhdUpukZLE|s@x5tVsoI?M`!HBK1 zHnhNBDO1srs<~E5$=idQi)v15aqjgfM*{Sg+ZoRd#*Zb>n)&^8^JNV|1$?X({(89Q;?!Z31?dxX&dSE)NzaLxo3=`L8G}p5-XGieGjo;o1o^T;@jDL3zE`U~hVU%(W8d2CCZlOeuMAm1vp8oSr9LT8riq zYS_iT8ZZVqvgCxCvUv=)AGhFBx1Dy?Zu_X!8ECZEFv(zx;9Hp1bcZfxSF-7jIoaO7 z>u#vJ{a_nlhJojn zR^X3Z>D0;kNNFfMqWP@sB{@_5okz$y!gt_W*!mQrd-1bKP2LBO&l^3@#~uE;lJU~7 zqePFwGoR>8R^u!Af&)woKdrBgwt2_xwOv^pXL+9z%!p7seBF|jI8X5BPH&eRJlpzV zEG4Y}f=8izq!q@?QYu&mbcfEcfHjO-cPS4Wq+uEBr}&?b61#$JQjLP?cEZ68K!=T4 zcM(R@dm7&!8t+SYl>IVzPD|!A{l?bGk)ye#B75l4D;w*NdVO z%RdBS%W2Ns#<70(W%QCkrS2Nq&es7eV9Apca920p=itDAw)8g9()A`6L@l+j&B|=| z@z4dC(WLG1Sx2Oiz{XADAjj5s@N~kme|pM77fj?&I^Dc?9ZRF}kHKM^?0(Db^jZNm z-M4nM!AZMmrP<601K&OQ{$K2udTf9pzuGhE9^5!!JiAV4|%5}OWL?c z;eWa+u-bT-LjsL|zm=Tzv~F2RIm>q~1-O+_IlbW94oq^rSHU64-f*t^XcKxmuM?)p zGJr<^TE~aBJ5+AXTJi@;=zs<_{zfFa>G|T@bF_dU%_}{|gn-T6$?egZ3K|F56W;ayi+^4e2yAyb4u zL6X_QxT4bJ4*tYz?qlJf2mad{&`trfv(JWWj-1|#9eQkZhwcQFTGUUm|7}D5*T*-% z{@)>)ko`xno(qAuLB$D-mNuu0YG~D*`O|L6qI<#Mt*hfY*9Z;Me*}CTJ$FAZfY^zT}j{$G6+)Q-0yKrY;7i{EWw>w28s$2;} zneuR8KkR32E?H1^|9*FJ-ah{!M_#rh!*zYrOzYb3u@AG8h0}s{3{X})$lWR{Z~x|g z%Y=P?(&ce1A^qT;zSK_Gq5a=sbFJjt!+rXQtDqrYhbgFpFv3-b6Kn+K1+s0tm{}?Hu2cl05j#w8&=LYKu=pvVRdW57pg9g zj(@tBy5Y{RT+Dg*1^@;gId5T&tT{0%qrBkI$So9oY-BAb1u}T~;rP!Z$hwFP-|?Yz zMA72gciBRGX>Le~)9Nnk&RklukkG)E9zOy=Z{iK}GvV;;2%S)$BKoJ1?al>m-^Sb- z&rqcHWu8&pCk8sGz@%kvhxa7vQ$6IAbi$ozd!^2SZ^L3eZF-3Vy#TnnU>f_sfkq#@ z7NLxGmSb34XY4v%UK0|S!LAT~&i1!cb`-QNS zx!=gAClNN9IcB?Y!`TXS-FWF|li1!mG6AES`sAOs^M%r1o_+*?pY|2|iJ`VwFa!707tU;JD_gg6+?V z%7VWZAHDmO|DWYnf7MLU!xB8g2rt%iQA{Upe<&B-cfUF7$d%TC^q!zd>_!oyIH&YB zxZ{+T7QMT$K620(JPqlV{QcfIP|mfT#v&X%!*30m^XUVLSb+cO~$@tpvbhVPm85K=6Y}D}^_L*V>~1^TQYQSoYAHHq(=cu&vQ;hcJSRKb_OkIyE#RN zd)%L4LaZy$X~_1Rj&AtV=vTQP;QJo0%n$iwIIItuF;*2V>vZ67#PTvRD|oQ&v{}}v z-!{%T-v;5<`baq|t6}0i8@C{#Yj-MW;uSVSk2ld#LdikznfV#yxdkC>tM3tQ(TBKN zoT^N!*9F@ra!aj*37l-ha(CpIdDm3&728=BiLlMZ^4NX5jZryp3#PeX#kIocHjm|I zhStR93nT5d^QJg;P8z4ba2OeK3lsKnsuQNZe;-JMke0jDIj0XR8C$(9iv-x^ufhD5 z+996WTh<*znzN8N`Ze(R)Q(vF0AJQC=I6U^5;A+ELFs3~!#Y6vQix~SrRAbx_y5UN z^fPRMGT2pd*VQdqX7BGi2XYqbYOW7tE?(X6bUq8lpcy>8Q^@>4yjqgA@HJb7ww_vQ zH*sKs+F|td)UlDw4-pfL^2cCdvEJdIvyGSZ_60bFjAFf*mS4M5OEl1PDfW$_jbu9B zadO%#1%^bSc-~^XcJ|D5_B z?%lZ;9#s3UNvwfG8nI&*YKG-`-R&9tfzz`G^?Cm5>7B5n`;$fry@R!|o~O)Y(PXCHrd|XPs{kOGdx0WrQkv%+|(ES1IfhGXtc&C&C6j^Ln7d zZ|$8#DhRrt01mHgSO(|K_Ex{0H_LR`kaNxk<7>t}ln16j*ZrD+PvbaJjDLR%x^l?F zki$JODjCP0h|(<{FGKI1c_qvg9i`IL+kx9S3kaVWR+6IfjtSmzk4F!}45 z7#^q1t_!wr|6$=SvHyMQ{?~MN_P-v9R%MiQ!VHD6)_Uuvp`fPWiBX6U_aW#1`)9pe z6ynpLR+HrCy|SR=P>E%9lj^6KkBICswsZQE%n%H!MX+-=SlW{=XPadWWM1R7UeI(h zB3ANCRT0zYsg$c)+rbpq-+u=ERBDg(a|4^r8>c^r+ZE~08?|FR#y5&BD9yjW1*j}< zi6j|Bw9|?xZ6h?^#hOxOPD(Ikcl6y8h6`!n?GwH)-76NMXX9X7-AvZB^3##Qc|`$l zOSoByQr`$*_)V$mKIyW>SmDmi^Mo|t1W`vaRW@Sts#~)3-e@6V86WngKdaEuF299qBXSqRZY5l1q}&!kiE%HrJUo-cIs`^y-oR*C5!+pE!azHXr5ogZB?>(a*i&Xs{%>@2|mF`WTLYF*tb*Z)`ejoi`_QrtHx47EkWa9Yz~Si=6N1bKM0MUuVr);FuhYGn=S*|`w$Gr`*n$}QN1DDboN>o zD2-CHsGRFC4*9ut2Lq(uyliOWwV%jc0L5(6t@1~tvF^{Cm!%*(u z|Jl`2>a|Bn9%5GBPIHT|=d^X6^8B92Pq|j-r_2_KcL3ua`6~z?dVotYqT@y%_P<;y0K8REvdmy3< zJWKow*s}B=pF0U+S6W^>EO{raLoZ+M2K$t*VDEe$E^imRe-_lP;7_KH%T#$20bMZ7 z{r`eSBTj`au4U;uZv1cqlnYkMM7!bA%{|e3RC4=}Nro#QAD@yb4#QEJ?*UEMr)rI0 zSE_gbLHjJVstYF1(t<`u9%ucYN;nfRSEY>L_LQ6LjW9>$a5k{y0*TBz7NM8pN7;Q} z=zjP&TN?T*vMcPj9%)_t)954}2l6EN&G{0e+imaSaC!^4PMDmqN%OCj1@Ru;_F*e# zq?6ZxJ`mQi0iM&U*(tQ=wTL!Vv^w_24$FSU|FhrXX&p<IiT!&Y;Li;_KrkxvdhEjnNf8Z~zbcO1mIz;P;8nq$9tYupkMQTBA7tJh zSve(R5x(te^VsOPoE2!J|K`z>%&nLwXkM2rkVePlY(Y(0xn~12aHY)SwmyQ&D7(M> zKTA!Pe5$y4_MHXx3A{+a}+=oW=Fu&kGr|qrQd*_^*CktTT+Z6 z@OQv#dC=V(=NK|>gFcEii~`By6XZ;mo{glW%;fk8E8)@uEUJXlGRsIl_bR3n1}Tl$ zh-8}BY3R)>TRW`2b8|};+Y4R`ke_615yp5hI|Dj0g*<|_KVAxM`&Z<)TGnaTi7I9O z7^oO>AljqjDN80Lh`_dY0X>Z$pUd8u03ynQ;jd*B+V*b1Bb?(Q9GN8iIcWy}o{f^8 z>%dl75tMdhM;==7IWuGIyfu z4_pXFXo5^5Kx*DOBm2KDb^h1=?uKRGyna>9MQ|4zXiWB4@F=5(M$yD-AI}EC>{)^g zdApL1e1U!wfJa913dL0oJMq|>2AALEWUjk zhkApB-J*? z*7%m;Z8LUCnDdmWow_eQWdkeo=U-NCxI=w;TEz^>4pKy3JjhEaHv^?(pw3EKi#pu5 z7P;`(1zm4X?WQ#jSJ2OjT>uzUHfPkIIW`1@km>qt(l}ep^`;~(q9Lo&% z=t(SIw18dt%HV&bb|eP)1=?XI-84(j3Qt{TetxN^J0Do0ub?b(<40jpPh;L}949rU8ZW2}j=*8eBr zx;3cOM-`3e1H#NVWeNd^JXi2osK+-zpd&t}XPvNv6N3EFGZC5P?fdS(1Nha#Xornu z>iJPH)&61^cvlJZZu5-!1G2V1fOC!^jvKAbC|W8~y{LW4jsb0LjK)6{Wqt+rUBl9w z8uf=A>u$-AU$1b7I}~SaB3OSfp~H9G;MEW|b5(S~WAiKCU4X3v)1cFKHPKZ^5c0N{ zSv!@rLS*Z+&Zi@fVb;;K>;H(l_Hi3n7-96_dNWYbyITNeCK*KHCYy9ZV`ARz0;u#* zU^ID8Z^((etd(knk~;$5ceQ-}_mtUT`G`@p)71@#b7?K01=D7PGoODPbzI}+5x{%Z z0GSZRc7>qAG33KwS22$z8~NKt?TuwHh2)=m5i?Q7Ho?Hm4`0AVtfZBj{cHDmR8Dye zd(5K-Yc1%!b>K*%5EK6U3oL|Udx!ZKzQ8hw?ezns`i4dSH=jT|vnQStw(@!G^vFc| z>vY`eG&)35_s=&GxmKrLld)}U);+diOj)h^f`2DCZ>{s%;C3rl_fMlUa>q5*@BOMr z?{dm0%2~k`M_!~f-xpEIwfeDYh!*(nV1Y!#Wb@Q0&*9CsUWS$Bt45;z&7`D<(-hVaC*jV1SCXl|2}YQlkE=H2et94qL?;mvl3=E z@rBS66SDQv)s68FVhG*Q!?E@h?1APo!6l(K1^Mn3audzzxTdI}Yq3-av-_GMZ;5lG zz)c$SZs`BF|J5fpg&aH6u2V!>v{3$=zfiiS-St3M5VJ)8jt~^FEc@;TV7px(&3@#l5B93BMX- zetxK@tDvV1*V!vOEG+vu?0u=UjDY9k17-q;ukDqsPpSE^b>I^){}BJ~gs&{v6y>b- z)HVIS6L_PRq?6hgopNl_f!blb7-Y*w=KY3zQ`7F)x^an`83;re^ zPbF}ogGR@*H~2PSfBx0H>YZ^eId}iH9G5M8;;*WmR$nw=th_k|_D`MRsP1refRpiq zv&v!MO)2Aft+?LsnRh8Ykzn(BA;Q$y`7M}2)3vdxb~Dri9#gqUFd!pw==#R*5~Q^# z@Jz_3Te^>pF3SCIVD{YOgIg4puz-RdL9!E{GsJ%I|Lo1q-}Bt%%Kv=%W&htJ{n-7S zi0ymt^Sx03wmyEGj|J`qG~ai)zM{Fja#%)dD z9_FdQdpztIwCVb=ECmK5&PB zLA=l1sQ7OT3<=tYi`Tx{;(l80{+4UIz}Jn;G+uOZ)z#B-3E|K0LGB;1UUYE{fByaN zZ&I@FD03ZHR2<)%)1%XNy=;AS4u2g(!|%R~90|SJ_$`~uHrjq?WJt0G-s2&mS>ExM zbA3K=!{DvHyJym}mxMjym@PbS6T^W;TWTv~Hf>q+ajUxcWnp=S1moK~`y->R!j8ST z^?EKZYr@4_@0ho4y?BvzU-}l{u}FGf>iHOM)LEBoE8Y?(Ew$?HAK@i){dV7-Rg|qk h%ylpbHOw#mv(I|9V&1MB`?rBaJzf1=);T3K0RZ7~lYRgI literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..6f1ec2e1f142ce77925c35750286225dfa5424cd GIT binary patch literal 686 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#`6ksT=F^OPcU@G-=aSW-r_4dyGyjuYh z?GGnMtditdqkibnk)4eTbk4cxADtrYaiw*YY>c8Pzs8!E0Z+sHgfw*oceb>ZoT$2V za;nmb{|cr-)}MCfez6ncN_wFFdn>1~7uX7rHMqbZb{T2WdRz4{Eg`AG%Uo_!aX-)H zh8HY}Tc7sisn}Yu+fX=ac>XiuFIUX_AF! z4qUu7A?K(3rF^^U2yV6m}+6A=k&rU4#H2%j?6AO z6rQ-C`||eqc}LBee1l9wc2#WqH}QDJXJ5Nz8-34pEnocg#IxBsk*T5C*FN06@v(fF zuJZ_AFoygNt#Owgi}zu6Z@J=5Fof6M&rzMl#gpUk~`ZlBEE z^#6NveqP#kq;^tTzwYPkl+Rh6QfcaWBG2znFq3{h%5Z)bOJ(!9H0M7LH+#qU yE;;<(_etm06?;0*?EUByb93UJ87d6_IPDqp=d!PPn4y#i3TjVRKbLh*2~7aD%{Ddw literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ccd82b345e3c3b6cd0658dbe9cb66cc8438b2b4f GIT binary patch literal 901 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#?6kssA3p{dhSS&`j~RTC zT+$NE733{(tROVMc}uDA>zZxK$+K(MB(K=|_lcOol{?pbS3NG-ru^3J)-szTlZvAC z6!-CmUp^>stgP&9_ive%TND(J$`tQD9W~)_=)C;xFW=k}{~q~jC5z-Iv#V0KnPxW2 z@U`z&$i4YxiLJXF%gVWIGxc`ebuv8P{&w@R-_fhJ%^mI5PE4J!ZjsM=jni+-xh_5Z zc3ZCQ@TbNZ+c%zPPpX#nJRLqo(_{L24eq^h+ZFupon&Do!smWR((Z5H`h58W``c@6 z4<<)fFX-R?jpcu@o7wMq-8Xd~*X;aeBcE&R`s?G(<7aOb+qx;IUtfQGD|^)xx47%^ z_4b`^^R5={{pQer>BPIE?b|OO%-dORTk*vH<@5i`-OiQW-~Ti3ZKvGAiFdoZKYTsi z{r8`Ze$ld2&f9iUmDQ4mCOCIgPBhScoOgZR_xo8-D)-)L-@be0#NU_KPGoo7mGR`~ z*Do5G>>q0-4@ta^@z0tczVn&T=Lx?vo_y7x{rBe$zH_f{G%cBxo!RR%zdh>Mm3`kX zo`|d#wELZ#wS-4=isH1OC}quOhR-(nZtSTw+2lR__ucSd<(;v$H`|QPWv84_U1G#z znEyLNWy$H;=Vt`lZ220Hcin?K$otl@Tb|0lr%!)4`}J(MTUWO$6vipH$DH%_eEaWJ z%5^UN&qrrhUeB5xc6-yiYaUtF*A}*Bl}GFM?)hzSruWK5)|usNH9d5f&h32rPs%#; z$<_1n`~Pa5IX}^$?f3H&H@a5d7E95XYx3z;`|H_nSJ%p$e|{PDy#Maq^>$L3*J}%_ zFFf1Nb7^AcmA6wrJ~E3vHT(7i|DDbI^PY5XeO@`oP3%9@n~(K!<^6JpE^qo~V_He@=Rf-HB_J3y=V3o5g-1meZlnOju{an^LB{Ts5mDi)} literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..cc9cbb689cc09bd3af7f33ac931dcae0fdda7ff3 GIT binary patch literal 2089 zcmchX>sJy88izqk95eJ(YGvZkWir$l&uBP`crvYYlf2}$#7#>iHMBGkP~6q(B&pMo z>1au1!WdqrtRTFB1dNw3^Fo?{hL;or%q1C7+?xMk_xJ7jeR-dA-t)dU!qCSyTkW(0 z005hVj|WBo0OouEz--rsuLWRKoWleFK)T?-!>5R2pT-1fjuHq+7q`jDK9Cpkrywk8 z`YOTY_R*$psO<;p;fr&VhwDxI^yLt1=t|7E!zGs@7FCe(5gNur7lAhgETzPhssqvS z5a59iOV9xlc0^i?PnkiaUHvxf|DS4&Vo^4yuQvI@Q{l#o9l60qc8=1U+B@qZW&~8; zROE^<=_}W=bVt?Ma)MMj0GpL$4UnmPxLO#M$lBHqt2~e69}Z<^ob(vV0Z$t zpmrW^_Wtoi>JH5U96oxwZ!nD<4!SE>%R)!nF@ zBeWTE2-}UZGeXa>BlxowMOh6RWXxvR z;%S#6AJMS(6#QjmJrsbVZ$^}3DC+&yHs?aiRcqpRX7ITbKZ)ZTHG848vl*eNApe{E)fnk zKt_eQO6veFyHY`1?%noo?`Ao+zeY5OzPx>!HuMvcZCqyJPO&cdg2!@Hlh5qPdg!aa zTCns{9-h%TbWoiU0ZGHks)WH9dta%w%bucxaE| z`#Hjl{y~Kd+5r)qrTC!Qw+osN9@W{*h4@as{*nQ^-KC3av2e&a@>7WVUYNGu%eyWP z+*RjA{NqgFF?9#o^!BWu2#uDqKW2_Mvp+6y6JrJ%Wl`B5`yv%zIoyRBa^16ux_MGC zz*7RX!#DiT*+g7?jpA~u1Mc<}_a|9#=MxqR)$&W0dK7WgyJ2Oy!Zq0NJ{mh`|FS_|;{98~IyH|Z}HCi`mKPD)0$63vOIrEs)g>3tM!CC7Jz>lz<(dgKix!> zZ8;NrizBoH%0^)?Ux@60i2ci;uRAWWnJg|ieUc0<+y6J6^_tjSwp5Gk=o`sPqgcjl zpty^Pwpjbg#>^moD}6hyd-dUi=j)}~_I#bxnfyzmvE)g15dVRmYo&^9Qyj=i(Ha!; z`2>Ic4D$4{V=`{v#O?)f*J1CQM!3{D&(e_mVoPRfMdu?rayV|iyXubAO@B4z^7yW| z>;F1`%!+F{TRk%rjbJ!$X!B5jxv8N^QM2V@9d5)kC#5X$KTArUNENOgpdIEIt}JSq zdp1%oe}0&V>`1(d?`2K4hA+=(M>SLR1qjJ|AWMWm;f_x4{nEm$Z;5?{^9_myL&TTv zOfPoQn8_TNcxq))6 ziT&~6xO0srRQ(%)7~wy6!RPJH)qcs7@3_Y1U}P(VOs{RF`S-jmK!`8cIrYHUHjT2* z?=PC6cwSC5ZsrFy649rxj$;RAC82zVm?6Q64D5G)4W(se8{0ghowLt*WYFGv=4sWk zw9GM$_83GsSi`kn_Rw9?}JF z7q>>aC69fy(YrK0OQ&N!vz0luM!~B56D%n4H~V=U`$3XO%CI6PH&~39!U;8xl6>5o zdap^7Fw8ho#CcKXEezfrB3k3^i5ghsrkg3M{fn`3IdQBV(@}Zio1?i@HRnJxDe4Na z^uO-EcS1)R=%U}>SH0TbSXfvH9|YsJGY$bcJtAELc@LAclK-<-X{%$#=Gotq(6cBt z>jwQN+EZ88r`vSF^L?Z__QI8s8y=yP4;)QdrmXgRiqE;{c_}O|v9f!t(PBK`vq$xC z{fop+d;3_0^z$j$dgYp&TBMJ=_fQR&EXp|f%Ea4C2y_hUT6YR>epvv`{@_AZcd2S~ zl(6+OSAU0ubNwe(2cZL-0{;2$ F{{r*|;0yo& literal 0 HcmV?d00001 From 5eb442d9d6571d731475a9217e19fdbb61934507 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Fri, 20 Feb 2026 20:16:40 +0100 Subject: [PATCH 15/30] chore: phpstan fixes --- app/Jobs/CheckVersionUpdateJob.php | 2 +- app/Models/DeviceModel.php | 38 +++++++++++++++++------------- 2 files changed, 22 insertions(+), 18 deletions(-) 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 fbc104f..7142829 100644 --- a/app/Models/DeviceModel.php +++ b/app/Models/DeviceModel.php @@ -87,24 +87,28 @@ final class DeviceModel extends Model */ protected function cssVariables(): Attribute { - return Attribute::get(function (mixed $value, array $attributes): array { - $vars = is_array($value) ? $value : (is_string($value) ? (json_decode($value, true) ?? []) : []); + /** @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') { + 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; - } - - $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; - } - - return $vars; - }); + }); } } From b8b6caba128d48cb324ef9c4b8db196262c882d0 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Sat, 21 Feb 2026 11:34:30 +0100 Subject: [PATCH 16/30] fix: enable backwards compatibility v1 rendering strategy --- app/Models/DeviceModel.php | 14 ++++++++++++++ app/Models/Plugin.php | 4 ++-- tests/Unit/Models/DeviceModelTest.php | 25 +++++++++++++++++++++++++ tests/Unit/Models/PluginTest.php | 8 ++++---- 4 files changed, 45 insertions(+), 6 deletions(-) diff --git a/app/Models/DeviceModel.php b/app/Models/DeviceModel.php index 7142829..bdc4b98 100644 --- a/app/Models/DeviceModel.php +++ b/app/Models/DeviceModel.php @@ -11,6 +11,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; /** * @property-read array $css_variables + * @property-read string|null $css_name * @property-read DevicePalette|null $palette */ final class DeviceModel extends Model @@ -74,6 +75,19 @@ final class DeviceModel extends Model return null; } + /** + * Returns css_name for v2 (per-device sizing); for v1 returns 'og' to preserve legacy single-variant behaviour. + * + * @return Attribute + */ + protected function cssName(): Attribute + { + /** @var Attribute */ + return Attribute::get( + fn (mixed $value): ?string => config('app.puppeteer_window_size_strategy') === 'v2' ? ($value !== null ? (string) $value : null) : 'og' + ); + } + public function palette(): BelongsTo { return $this->belongsTo(DevicePalette::class, 'palette_id'); diff --git a/app/Models/Plugin.php b/app/Models/Plugin.php index 31a08ad..3f84bc5 100644 --- a/app/Models/Plugin.php +++ b/app/Models/Plugin.php @@ -738,8 +738,8 @@ class Plugin extends Model } } - // Append " (Copy)" to the name - $attributes['name'] = $this->name.' (Copy)'; + // Append "_copy" to the name + $attributes['name'] = $this->name.'_copy'; // Set user_id - use provided userId or fall back to original plugin's user_id $attributes['user_id'] = $userId ?? $this->user_id; diff --git a/tests/Unit/Models/DeviceModelTest.php b/tests/Unit/Models/DeviceModelTest.php index 8c2b6e9..f2ef29d 100644 --- a/tests/Unit/Models/DeviceModelTest.php +++ b/tests/Unit/Models/DeviceModelTest.php @@ -3,6 +3,7 @@ declare(strict_types=1); use App\Models\DeviceModel; +use Illuminate\Support\Facades\Config; test('device model has required attributes', function (): void { $deviceModel = DeviceModel::factory()->create([ @@ -117,3 +118,27 @@ test('device model factory creates valid data', function (): void { expect($deviceModel->offset_x)->toBeInt(); expect($deviceModel->offset_y)->toBeInt(); }); + +test('css_name returns og when puppeteer_window_size_strategy is v1', function (): void { + Config::set('app.puppeteer_window_size_strategy', 'v1'); + + $deviceModel = DeviceModel::factory()->create(['css_name' => 'my_device']); + + expect($deviceModel->css_name)->toBe('og'); +}); + +test('css_name returns db value when puppeteer_window_size_strategy is v2', function (): void { + Config::set('app.puppeteer_window_size_strategy', 'v2'); + + $deviceModel = DeviceModel::factory()->create(['css_name' => 'my_device']); + + expect($deviceModel->css_name)->toBe('my_device'); +}); + +test('css_name returns null when puppeteer_window_size_strategy is v2 and db value is null', function (): void { + Config::set('app.puppeteer_window_size_strategy', 'v2'); + + $deviceModel = DeviceModel::factory()->create(['css_name' => null]); + + expect($deviceModel->css_name)->toBeNull(); +}); diff --git a/tests/Unit/Models/PluginTest.php b/tests/Unit/Models/PluginTest.php index 82813d9..1e2cda2 100644 --- a/tests/Unit/Models/PluginTest.php +++ b/tests/Unit/Models/PluginTest.php @@ -824,7 +824,7 @@ test('plugin duplicate copies all attributes except id and uuid', function (): v expect($duplicate->id)->not->toBe($original->id) ->and($duplicate->uuid)->not->toBe($original->uuid) - ->and($duplicate->name)->toBe('Original Plugin (Copy)') + ->and($duplicate->name)->toBe('Original Plugin_copy') ->and($duplicate->user_id)->toBe($original->user_id) ->and($duplicate->data_stale_minutes)->toBe($original->data_stale_minutes) ->and($duplicate->data_strategy)->toBe($original->data_strategy) @@ -859,7 +859,7 @@ test('plugin duplicate sets trmnlp_id to null to avoid unique constraint violati expect($duplicate->trmnlp_id)->toBeNull() ->and($original->trmnlp_id)->toBe('test-trmnlp-id-123') - ->and($duplicate->name)->toBe('Plugin with trmnlp_id (Copy)'); + ->and($duplicate->name)->toBe('Plugin with trmnlp_id_copy'); }); test('plugin duplicate copies render_markup_view file content to render_markup', function (): void { @@ -890,7 +890,7 @@ test('plugin duplicate copies render_markup_view file content to render_markup', expect($duplicate->render_markup)->toBe($testContent) ->and($duplicate->markup_language)->toBe('blade') ->and($duplicate->render_markup_view)->toBeNull() - ->and($duplicate->name)->toBe('View Plugin (Copy)'); + ->and($duplicate->name)->toBe('View Plugin_copy'); } finally { // Clean up test file if (file_exists($testViewPath)) { @@ -949,7 +949,7 @@ test('plugin duplicate handles missing view file gracefully', function (): void $duplicate = $original->duplicate(); expect($duplicate->render_markup_view)->toBeNull() - ->and($duplicate->name)->toBe('Missing View Plugin (Copy)'); + ->and($duplicate->name)->toBe('Missing View Plugin_copy'); }); test('plugin duplicate uses provided user_id', function (): void { From 00d242dac10c7ea4154393f0a9f8817834577ba5 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Tue, 24 Feb 2026 18:10:04 +0100 Subject: [PATCH 17/30] chore: update dependencies --- composer.lock | 166 +++++++++++++++++++++++++------------------------- 1 file changed, 84 insertions(+), 82 deletions(-) diff --git a/composer.lock b/composer.lock index 2d15fd8..03ceff2 100644 --- a/composer.lock +++ b/composer.lock @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.369.38", + "version": "3.370.1", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "6b39dcc5284fae1a1f7e5d4fd64878092a56594b" + "reference": "273a9bbed9e73016be390b8428f7925f15ea053e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/6b39dcc5284fae1a1f7e5d4fd64878092a56594b", - "reference": "6b39dcc5284fae1a1f7e5d4fd64878092a56594b", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/273a9bbed9e73016be390b8428f7925f15ea053e", + "reference": "273a9bbed9e73016be390b8428f7925f15ea053e", "shasum": "" }, "require": { @@ -153,9 +153,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.369.38" + "source": "https://github.com/aws/aws-sdk-php/tree/3.370.1" }, - "time": "2026-02-19T19:06:55+00:00" + "time": "2026-02-23T19:05:30+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1831,16 +1831,16 @@ }, { "name": "laravel/fortify", - "version": "v1.34.1", + "version": "v1.35.0", "source": { "type": "git", "url": "https://github.com/laravel/fortify.git", - "reference": "412575e9c0cb21d49a30b7045ad4902019f538c2" + "reference": "24c5bb81ea4787e0865c4a62f054ed7d1cb7a093" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/fortify/zipball/412575e9c0cb21d49a30b7045ad4902019f538c2", - "reference": "412575e9c0cb21d49a30b7045ad4902019f538c2", + "url": "https://api.github.com/repos/laravel/fortify/zipball/24c5bb81ea4787e0865c4a62f054ed7d1cb7a093", + "reference": "24c5bb81ea4787e0865c4a62f054ed7d1cb7a093", "shasum": "" }, "require": { @@ -1890,20 +1890,20 @@ "issues": "https://github.com/laravel/fortify/issues", "source": "https://github.com/laravel/fortify" }, - "time": "2026-02-03T06:55:55+00:00" + "time": "2026-02-24T14:00:44+00:00" }, { "name": "laravel/framework", - "version": "v12.52.0", + "version": "v12.53.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "d5511fa74f4608dbb99864198b1954042aa8d5a7" + "reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/d5511fa74f4608dbb99864198b1954042aa8d5a7", - "reference": "d5511fa74f4608dbb99864198b1954042aa8d5a7", + "url": "https://api.github.com/repos/laravel/framework/zipball/f57f035c0d34503d9ff30be76159bb35a003cd1f", + "reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f", "shasum": "" }, "require": { @@ -2112,7 +2112,7 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-02-17T17:07:04+00:00" + "time": "2026-02-24T14:35:15+00:00" }, { "name": "laravel/prompts", @@ -2238,16 +2238,16 @@ }, { "name": "laravel/serializable-closure", - "version": "v2.0.9", + "version": "v2.0.10", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "8f631589ab07b7b52fead814965f5a800459cb3e" + "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/8f631589ab07b7b52fead814965f5a800459cb3e", - "reference": "8f631589ab07b7b52fead814965f5a800459cb3e", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/870fc81d2f879903dfc5b60bf8a0f94a1609e669", + "reference": "870fc81d2f879903dfc5b60bf8a0f94a1609e669", "shasum": "" }, "require": { @@ -2295,36 +2295,36 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2026-02-03T06:55:34+00:00" + "time": "2026-02-20T19:59:49+00:00" }, { "name": "laravel/socialite", - "version": "v5.24.2", + "version": "v5.24.3", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "5cea2eebf11ca4bc6c2f20495c82a70a9b3d1613" + "reference": "0feb62267e7b8abc68593ca37639ad302728c129" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/5cea2eebf11ca4bc6c2f20495c82a70a9b3d1613", - "reference": "5cea2eebf11ca4bc6c2f20495c82a70a9b3d1613", + "url": "https://api.github.com/repos/laravel/socialite/zipball/0feb62267e7b8abc68593ca37639ad302728c129", + "reference": "0feb62267e7b8abc68593ca37639ad302728c129", "shasum": "" }, "require": { "ext-json": "*", "firebase/php-jwt": "^6.4|^7.0", "guzzlehttp/guzzle": "^6.0|^7.0", - "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", - "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0", + "illuminate/contracts": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/http": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^6.0|^7.0|^8.0|^9.0|^10.0|^11.0|^12.0|^13.0", "league/oauth1-client": "^1.11", "php": "^7.2|^8.0", "phpseclib/phpseclib": "^3.0" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^4.18|^5.20|^6.47|^7.55|^8.36|^9.15|^10.8", + "orchestra/testbench": "^4.18|^5.20|^6.47|^7.55|^8.36|^9.15|^10.8|^11.0", "phpstan/phpstan": "^1.12.23", "phpunit/phpunit": "^8.0|^9.3|^10.4|^11.5|^12.0" }, @@ -2367,7 +2367,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2026-01-10T16:07:28+00:00" + "time": "2026-02-21T13:32:50+00:00" }, { "name": "laravel/tinker", @@ -3622,16 +3622,16 @@ }, { "name": "nette/schema", - "version": "v1.3.4", + "version": "v1.3.5", "source": { "type": "git", "url": "https://github.com/nette/schema.git", - "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7" + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/schema/zipball/086497a2f34b82fede9b5a41cc8e131d087cd8f7", - "reference": "086497a2f34b82fede9b5a41cc8e131d087cd8f7", + "url": "https://api.github.com/repos/nette/schema/zipball/f0ab1a3cda782dbc5da270d28545236aa80c4002", + "reference": "f0ab1a3cda782dbc5da270d28545236aa80c4002", "shasum": "" }, "require": { @@ -3639,8 +3639,10 @@ "php": "8.1 - 8.5" }, "require-dev": { + "nette/phpstan-rules": "^1.0", "nette/tester": "^2.6", - "phpstan/phpstan": "^2.0@stable", + "phpstan/extension-installer": "^1.4@stable", + "phpstan/phpstan": "^2.1.39@stable", "tracy/tracy": "^2.8" }, "type": "library", @@ -3681,9 +3683,9 @@ ], "support": { "issues": "https://github.com/nette/schema/issues", - "source": "https://github.com/nette/schema/tree/v1.3.4" + "source": "https://github.com/nette/schema/tree/v1.3.5" }, - "time": "2026-02-08T02:54:00+00:00" + "time": "2026-02-23T03:47:12+00:00" }, { "name": "nette/utils", @@ -5245,29 +5247,29 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.92.7", + "version": "1.93.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "f09a799850b1ed765103a4f0b4355006360c49a5" + "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f09a799850b1ed765103a4f0b4355006360c49a5", - "reference": "f09a799850b1ed765103a4f0b4355006360c49a5", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", + "reference": "0d097bce95b2bf6802fb1d83e1e753b0f5a948e7", "shasum": "" }, "require": { - "illuminate/contracts": "^9.28|^10.0|^11.0|^12.0", - "php": "^8.0" + "illuminate/contracts": "^10.0|^11.0|^12.0|^13.0", + "php": "^8.1" }, "require-dev": { "mockery/mockery": "^1.5", - "orchestra/testbench": "^7.7|^8.0|^9.0|^10.0", - "pestphp/pest": "^1.23|^2.1|^3.1", - "phpunit/php-code-coverage": "^9.0|^10.0|^11.0", - "phpunit/phpunit": "^9.5.24|^10.5|^11.5", - "spatie/pest-plugin-test-time": "^1.1|^2.2" + "orchestra/testbench": "^8.0|^9.2|^10.0|^11.0", + "pestphp/pest": "^2.1|^3.1|^4.0", + "phpunit/php-code-coverage": "^10.0|^11.0|^12.0", + "phpunit/phpunit": "^10.5|^11.5|^12.5", + "spatie/pest-plugin-test-time": "^2.2|^3.0" }, "type": "library", "autoload": { @@ -5294,7 +5296,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.7" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.93.0" }, "funding": [ { @@ -5302,7 +5304,7 @@ "type": "github" } ], - "time": "2025-07-17T15:46:43+00:00" + "time": "2026-02-21T12:49:54+00:00" }, { "name": "spatie/laravel-settings", @@ -9068,16 +9070,16 @@ }, { "name": "laravel/boost", - "version": "v2.1.8", + "version": "v2.2.0", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "a475ecb520c94357201c70039e984bce6c67c917" + "reference": "b4c5bed7b45e9cd9f705ef3ab1157d437376323c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/a475ecb520c94357201c70039e984bce6c67c917", - "reference": "a475ecb520c94357201c70039e984bce6c67c917", + "url": "https://api.github.com/repos/laravel/boost/zipball/b4c5bed7b45e9cd9f705ef3ab1157d437376323c", + "reference": "b4c5bed7b45e9cd9f705ef3ab1157d437376323c", "shasum": "" }, "require": { @@ -9088,7 +9090,7 @@ "illuminate/support": "^11.45.3|^12.41.1", "laravel/mcp": "^0.5.1", "laravel/prompts": "^0.3.10", - "laravel/roster": "^0.4.0", + "laravel/roster": "^0.5.0", "php": "^8.2" }, "require-dev": { @@ -9130,7 +9132,7 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2026-02-20T08:12:25+00:00" + "time": "2026-02-20T14:45:22+00:00" }, { "name": "laravel/mcp", @@ -9354,16 +9356,16 @@ }, { "name": "laravel/roster", - "version": "v0.4.0", + "version": "v0.5.0", "source": { "type": "git", "url": "https://github.com/laravel/roster.git", - "reference": "77e6c1187952d0eef50a54922db47893f5e7c986" + "reference": "56904a78f4d7360c1c490ced7deeebf9aecb8c0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/roster/zipball/77e6c1187952d0eef50a54922db47893f5e7c986", - "reference": "77e6c1187952d0eef50a54922db47893f5e7c986", + "url": "https://api.github.com/repos/laravel/roster/zipball/56904a78f4d7360c1c490ced7deeebf9aecb8c0e", + "reference": "56904a78f4d7360c1c490ced7deeebf9aecb8c0e", "shasum": "" }, "require": { @@ -9411,7 +9413,7 @@ "issues": "https://github.com/laravel/roster/issues", "source": "https://github.com/laravel/roster" }, - "time": "2026-02-11T07:24:41+00:00" + "time": "2026-02-17T17:33:35+00:00" }, { "name": "laravel/sail", @@ -10042,27 +10044,27 @@ }, { "name": "pestphp/pest-plugin-laravel", - "version": "v4.0.0", + "version": "v4.1.0", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-laravel.git", - "reference": "e12a07046b826a40b1c8632fd7b80d6b8d7b628e" + "reference": "3057a36669ff11416cc0dc2b521b3aec58c488d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/e12a07046b826a40b1c8632fd7b80d6b8d7b628e", - "reference": "e12a07046b826a40b1c8632fd7b80d6b8d7b628e", + "url": "https://api.github.com/repos/pestphp/pest-plugin-laravel/zipball/3057a36669ff11416cc0dc2b521b3aec58c488d0", + "reference": "3057a36669ff11416cc0dc2b521b3aec58c488d0", "shasum": "" }, "require": { - "laravel/framework": "^11.45.2|^12.25.0", - "pestphp/pest": "^4.0.0", + "laravel/framework": "^11.45.2|^12.52.0|^13.0", + "pestphp/pest": "^4.4.1", "php": "^8.3.0" }, "require-dev": { - "laravel/dusk": "^8.3.3", - "orchestra/testbench": "^9.13.0|^10.5.0", - "pestphp/pest-dev-tools": "^4.0.0" + "laravel/dusk": "^8.3.6", + "orchestra/testbench": "^9.13.0|^10.9.0|^11.0", + "pestphp/pest-dev-tools": "^4.1.0" }, "type": "library", "extra": { @@ -10100,7 +10102,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v4.0.0" + "source": "https://github.com/pestphp/pest-plugin-laravel/tree/v4.1.0" }, "funding": [ { @@ -10112,7 +10114,7 @@ "type": "github" } ], - "time": "2025-08-20T12:46:37+00:00" + "time": "2026-02-21T00:29:45+00:00" }, { "name": "pestphp/pest-plugin-mutate", @@ -10430,11 +10432,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.39", + "version": "2.1.40", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c6f73a2af4cbcd99c931d0fb8f08548cc0fa8224", - "reference": "c6f73a2af4cbcd99c931d0fb8f08548cc0fa8224", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", + "reference": "9b2c7aeb83a75d8680ea5e7c9b7fca88052b766b", "shasum": "" }, "require": { @@ -10479,7 +10481,7 @@ "type": "github" } ], - "time": "2026-02-11T14:48:56+00:00" + "time": "2026-02-23T15:04:35+00:00" }, { "name": "phpunit/php-code-coverage", @@ -10935,16 +10937,16 @@ }, { "name": "rector/rector", - "version": "2.3.7", + "version": "2.3.8", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "9c46ad17f57963932c9788fd1b0f1d07ff450370" + "reference": "bbd37aedd8df749916cffa2a947cfc4714d1ba2c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/9c46ad17f57963932c9788fd1b0f1d07ff450370", - "reference": "9c46ad17f57963932c9788fd1b0f1d07ff450370", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/bbd37aedd8df749916cffa2a947cfc4714d1ba2c", + "reference": "bbd37aedd8df749916cffa2a947cfc4714d1ba2c", "shasum": "" }, "require": { @@ -10983,7 +10985,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.3.7" + "source": "https://github.com/rectorphp/rector/tree/2.3.8" }, "funding": [ { @@ -10991,7 +10993,7 @@ "type": "github" } ], - "time": "2026-02-19T14:44:16+00:00" + "time": "2026-02-22T09:45:50+00:00" }, { "name": "sebastian/cli-parser", From d17fa1eedb3a69639ffd663562ca5620f34d1a37 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Thu, 26 Feb 2026 08:19:30 +0100 Subject: [PATCH 18/30] chore: update npm packages --- package-lock.json | 213 +++++++++++++++++++++++----------------------- 1 file changed, 107 insertions(+), 106 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4984f65..cbcac8c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,7 @@ "requires": true, "packages": { "": { + "name": "laravel-trmnl-server", "dependencies": { "@codemirror/commands": "^6.9.0", "@codemirror/lang-css": "^6.3.1", @@ -816,9 +817,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -829,9 +830,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -842,9 +843,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], @@ -855,9 +856,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -868,9 +869,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], @@ -881,9 +882,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], @@ -894,9 +895,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], @@ -907,9 +908,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], @@ -920,9 +921,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], @@ -933,9 +934,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -946,9 +947,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "cpu": [ "loong64" ], @@ -959,9 +960,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], @@ -972,9 +973,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "cpu": [ "ppc64" ], @@ -985,9 +986,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], @@ -998,9 +999,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], @@ -1011,9 +1012,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], @@ -1024,9 +1025,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], @@ -1050,9 +1051,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], @@ -1063,9 +1064,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "cpu": [ "x64" ], @@ -1076,9 +1077,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], @@ -1089,9 +1090,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -1102,9 +1103,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -1115,9 +1116,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], @@ -1128,9 +1129,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -1652,9 +1653,9 @@ } }, "node_modules/basic-ftp": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", - "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz", + "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -3149,9 +3150,9 @@ } }, "node_modules/rollup": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -3164,38 +3165,38 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.1", - "@rollup/rollup-android-arm64": "4.57.1", - "@rollup/rollup-darwin-arm64": "4.57.1", - "@rollup/rollup-darwin-x64": "4.57.1", - "@rollup/rollup-freebsd-arm64": "4.57.1", - "@rollup/rollup-freebsd-x64": "4.57.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", - "@rollup/rollup-linux-arm-musleabihf": "4.57.1", - "@rollup/rollup-linux-arm64-gnu": "4.57.1", - "@rollup/rollup-linux-arm64-musl": "4.57.1", - "@rollup/rollup-linux-loong64-gnu": "4.57.1", - "@rollup/rollup-linux-loong64-musl": "4.57.1", - "@rollup/rollup-linux-ppc64-gnu": "4.57.1", - "@rollup/rollup-linux-ppc64-musl": "4.57.1", - "@rollup/rollup-linux-riscv64-gnu": "4.57.1", - "@rollup/rollup-linux-riscv64-musl": "4.57.1", - "@rollup/rollup-linux-s390x-gnu": "4.57.1", - "@rollup/rollup-linux-x64-gnu": "4.57.1", - "@rollup/rollup-linux-x64-musl": "4.57.1", - "@rollup/rollup-openbsd-x64": "4.57.1", - "@rollup/rollup-openharmony-arm64": "4.57.1", - "@rollup/rollup-win32-arm64-msvc": "4.57.1", - "@rollup/rollup-win32-ia32-msvc": "4.57.1", - "@rollup/rollup-win32-x64-gnu": "4.57.1", - "@rollup/rollup-win32-x64-msvc": "4.57.1", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], From d96fb297bc3925c2fae42781c7706aa50542024f Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Mon, 2 Mar 2026 19:18:06 +0100 Subject: [PATCH 19/30] chore: update dependencies --- composer.lock | 435 +++++++++++++++++++++++++------------------------- 1 file changed, 217 insertions(+), 218 deletions(-) diff --git a/composer.lock b/composer.lock index 03ceff2..82d7b7a 100644 --- a/composer.lock +++ b/composer.lock @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.370.1", + "version": "3.372.1", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "273a9bbed9e73016be390b8428f7925f15ea053e" + "reference": "a48ff951eaad7f038eca3e0e89f168048b99082b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/273a9bbed9e73016be390b8428f7925f15ea053e", - "reference": "273a9bbed9e73016be390b8428f7925f15ea053e", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a48ff951eaad7f038eca3e0e89f168048b99082b", + "reference": "a48ff951eaad7f038eca3e0e89f168048b99082b", "shasum": "" }, "require": { @@ -135,11 +135,11 @@ "authors": [ { "name": "Amazon Web Services", - "homepage": "http://aws.amazon.com" + "homepage": "https://aws.amazon.com" } ], "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", - "homepage": "http://aws.amazon.com/sdkforphp", + "homepage": "https://aws.amazon.com/sdk-for-php", "keywords": [ "amazon", "aws", @@ -153,9 +153,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.370.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.372.1" }, - "time": "2026-02-23T19:05:30+00:00" + "time": "2026-03-06T21:27:21+00:00" }, { "name": "bacon/bacon-qr-code", @@ -214,16 +214,16 @@ }, { "name": "bnussbau/laravel-trmnl-blade", - "version": "2.3.1", + "version": "2.3.3", "source": { "type": "git", "url": "https://github.com/bnussbau/laravel-trmnl-blade.git", - "reference": "95b781733a6943acd9d908c3366a3d71e47df4a4" + "reference": "777af3e26a6bee154efd87caf06131cc18c84452" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bnussbau/laravel-trmnl-blade/zipball/95b781733a6943acd9d908c3366a3d71e47df4a4", - "reference": "95b781733a6943acd9d908c3366a3d71e47df4a4", + "url": "https://api.github.com/repos/bnussbau/laravel-trmnl-blade/zipball/777af3e26a6bee154efd87caf06131cc18c84452", + "reference": "777af3e26a6bee154efd87caf06131cc18c84452", "shasum": "" }, "require": { @@ -278,7 +278,7 @@ ], "support": { "issues": "https://github.com/bnussbau/laravel-trmnl-blade/issues", - "source": "https://github.com/bnussbau/laravel-trmnl-blade/tree/2.3.1" + "source": "https://github.com/bnussbau/laravel-trmnl-blade/tree/2.3.3" }, "funding": [ { @@ -294,7 +294,7 @@ "type": "github" } ], - "time": "2026-02-10T16:12:33+00:00" + "time": "2026-03-03T06:47:48+00:00" }, { "name": "bnussbau/trmnl-pipeline-php", @@ -1030,16 +1030,16 @@ }, { "name": "firebase/php-jwt", - "version": "v7.0.2", + "version": "v7.0.3", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65" + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/5645b43af647b6947daac1d0f659dd1fbe8d3b65", - "reference": "5645b43af647b6947daac1d0f659dd1fbe8d3b65", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", + "reference": "28aa0694bcfdfa5e2959c394d5a1ee7a5083629e", "shasum": "" }, "require": { @@ -1087,9 +1087,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v7.0.2" + "source": "https://github.com/firebase/php-jwt/tree/v7.0.3" }, - "time": "2025-12-16T22:17:28+00:00" + "time": "2026-02-25T22:16:40+00:00" }, { "name": "fruitcake/php-cors", @@ -1695,16 +1695,16 @@ }, { "name": "keepsuit/laravel-liquid", - "version": "v0.5.4", + "version": "v0.5.5", "source": { "type": "git", "url": "https://github.com/keepsuit/laravel-liquid.git", - "reference": "ba426f44798042e3635a29ea91bbf2a4b2874a04" + "reference": "7f9996cc2eac16489d33d76e265939c2d556bded" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/keepsuit/laravel-liquid/zipball/ba426f44798042e3635a29ea91bbf2a4b2874a04", - "reference": "ba426f44798042e3635a29ea91bbf2a4b2874a04", + "url": "https://api.github.com/repos/keepsuit/laravel-liquid/zipball/7f9996cc2eac16489d33d76e265939c2d556bded", + "reference": "7f9996cc2eac16489d33d76e265939c2d556bded", "shasum": "" }, "require": { @@ -1712,7 +1712,7 @@ "keepsuit/liquid": "^0.7 || ^0.8 || ^0.9", "php": "^8.1", "spatie/laravel-package-tools": "^1.16", - "symfony/var-exporter": "^6.3 || ^7.0" + "symfony/var-exporter": "^6.3 || ^7.0 || ^8.0" }, "require-dev": { "itsgoingd/clockwork": "^5.3", @@ -1764,9 +1764,9 @@ ], "support": { "issues": "https://github.com/keepsuit/laravel-liquid/issues", - "source": "https://github.com/keepsuit/laravel-liquid/tree/v0.5.4" + "source": "https://github.com/keepsuit/laravel-liquid/tree/v0.5.5" }, - "time": "2025-06-15T12:06:40+00:00" + "time": "2026-03-04T16:46:40+00:00" }, { "name": "keepsuit/liquid", @@ -2437,16 +2437,16 @@ }, { "name": "league/commonmark", - "version": "2.8.0", + "version": "2.8.1", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb" + "reference": "84b1ca48347efdbe775426f108622a42735a6579" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/4efa10c1e56488e658d10adf7b7b7dcd19940bfb", - "reference": "4efa10c1e56488e658d10adf7b7b7dcd19940bfb", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/84b1ca48347efdbe775426f108622a42735a6579", + "reference": "84b1ca48347efdbe775426f108622a42735a6579", "shasum": "" }, "require": { @@ -2471,9 +2471,9 @@ "phpstan/phpstan": "^1.8.2", "phpunit/phpunit": "^9.5.21 || ^10.5.9 || ^11.0.0", "scrutinizer/ocular": "^1.8.1", - "symfony/finder": "^5.3 | ^6.0 | ^7.0", - "symfony/process": "^5.4 | ^6.0 | ^7.0", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0", + "symfony/finder": "^5.3 | ^6.0 | ^7.0 || ^8.0", + "symfony/process": "^5.4 | ^6.0 | ^7.0 || ^8.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0 | ^7.0 || ^8.0", "unleashedtech/php-coding-standard": "^3.1.1", "vimeo/psalm": "^4.24.0 || ^5.0.0 || ^6.0.0" }, @@ -2540,7 +2540,7 @@ "type": "tidelift" } ], - "time": "2025-11-26T21:48:24+00:00" + "time": "2026-03-05T21:37:03+00:00" }, { "name": "league/config", @@ -2626,16 +2626,16 @@ }, { "name": "league/flysystem", - "version": "3.31.0", + "version": "3.32.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "1717e0b3642b0df65ecb0cc89cdd99fa840672ff" + "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/1717e0b3642b0df65ecb0cc89cdd99fa840672ff", - "reference": "1717e0b3642b0df65ecb0cc89cdd99fa840672ff", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/254b1595b16b22dbddaaef9ed6ca9fdac4956725", + "reference": "254b1595b16b22dbddaaef9ed6ca9fdac4956725", "shasum": "" }, "require": { @@ -2703,9 +2703,9 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/3.31.0" + "source": "https://github.com/thephpleague/flysystem/tree/3.32.0" }, - "time": "2026-01-23T15:38:47+00:00" + "time": "2026-02-25T17:01:41+00:00" }, { "name": "league/flysystem-local", @@ -3128,26 +3128,26 @@ }, { "name": "livewire/flux", - "version": "v2.12.1", + "version": "v2.13.0", "source": { "type": "git", "url": "https://github.com/livewire/flux.git", - "reference": "24c139b97b6df1e67c0235637f0e08c206bf4486" + "reference": "741be2d4526e90b97c7a59e079a2f27ecdce2461" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/flux/zipball/24c139b97b6df1e67c0235637f0e08c206bf4486", - "reference": "24c139b97b6df1e67c0235637f0e08c206bf4486", + "url": "https://api.github.com/repos/livewire/flux/zipball/741be2d4526e90b97c7a59e079a2f27ecdce2461", + "reference": "741be2d4526e90b97c7a59e079a2f27ecdce2461", "shasum": "" }, "require": { - "illuminate/console": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "illuminate/view": "^10.0|^11.0|^12.0", + "illuminate/console": "^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "illuminate/view": "^10.0|^11.0|^12.0|^13.0", "laravel/prompts": "^0.1|^0.2|^0.3", "livewire/livewire": "^3.7.4|^4.0", "php": "^8.1", - "symfony/console": "^6.0|^7.0" + "symfony/console": "^6.0|^7.0|^8.0" }, "conflict": { "livewire/blaze": "<1.0.0-beta.2" @@ -3188,42 +3188,42 @@ ], "support": { "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.13.0" }, - "time": "2026-02-17T21:12:27+00:00" + "time": "2026-03-03T03:32:35+00:00" }, { "name": "livewire/livewire", - "version": "v4.1.4", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "4697085e02a1f5f11410a1b5962400e3539f8843" + "reference": "93e972fa42c1b34fff1550093ab94f778d81ea5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/4697085e02a1f5f11410a1b5962400e3539f8843", - "reference": "4697085e02a1f5f11410a1b5962400e3539f8843", + "url": "https://api.github.com/repos/livewire/livewire/zipball/93e972fa42c1b34fff1550093ab94f778d81ea5a", + "reference": "93e972fa42c1b34fff1550093ab94f778d81ea5a", "shasum": "" }, "require": { - "illuminate/database": "^10.0|^11.0|^12.0", - "illuminate/routing": "^10.0|^11.0|^12.0", - "illuminate/support": "^10.0|^11.0|^12.0", - "illuminate/validation": "^10.0|^11.0|^12.0", + "illuminate/database": "^10.0|^11.0|^12.0|^13.0", + "illuminate/routing": "^10.0|^11.0|^12.0|^13.0", + "illuminate/support": "^10.0|^11.0|^12.0|^13.0", + "illuminate/validation": "^10.0|^11.0|^12.0|^13.0", "laravel/prompts": "^0.1.24|^0.2|^0.3", "league/mime-type-detection": "^1.9", "php": "^8.1", - "symfony/console": "^6.0|^7.0", - "symfony/http-kernel": "^6.2|^7.0" + "symfony/console": "^6.0|^7.0|^8.0", + "symfony/http-kernel": "^6.2|^7.0|^8.0" }, "require-dev": { "calebporzio/sushi": "^2.1", - "laravel/framework": "^10.15.0|^11.0|^12.0", + "laravel/framework": "^10.15.0|^11.0|^12.0|^13.0", "mockery/mockery": "^1.3.1", - "orchestra/testbench": "^8.21.0|^9.0|^10.0", - "orchestra/testbench-dusk": "^8.24|^9.1|^10.0", - "phpunit/phpunit": "^10.4|^11.5", + "orchestra/testbench": "^8.21.0|^9.0|^10.0|^11.0", + "orchestra/testbench-dusk": "^8.24|^9.1|^10.0|^11.0", + "phpunit/phpunit": "^10.4|^11.5|^12.5", "psy/psysh": "^0.11.22|^0.12" }, "type": "library", @@ -3258,7 +3258,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v4.1.4" + "source": "https://github.com/livewire/livewire/tree/v4.2.1" }, "funding": [ { @@ -3266,7 +3266,7 @@ "type": "github" } ], - "time": "2026-02-09T22:59:54+00:00" + "time": "2026-02-28T00:01:19+00:00" }, { "name": "maennchen/zipstream-php", @@ -4902,16 +4902,16 @@ }, { "name": "psy/psysh", - "version": "v0.12.20", + "version": "v0.12.21", "source": { "type": "git", "url": "https://github.com/bobthecow/psysh.git", - "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373" + "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bobthecow/psysh/zipball/19678eb6b952a03b8a1d96ecee9edba518bb0373", - "reference": "19678eb6b952a03b8a1d96ecee9edba518bb0373", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/4821fab5b7cd8c49a673a9fd5754dc9162bb9e97", + "reference": "4821fab5b7cd8c49a673a9fd5754dc9162bb9e97", "shasum": "" }, "require": { @@ -4975,9 +4975,9 @@ ], "support": { "issues": "https://github.com/bobthecow/psysh/issues", - "source": "https://github.com/bobthecow/psysh/tree/v0.12.20" + "source": "https://github.com/bobthecow/psysh/tree/v0.12.21" }, - "time": "2026-02-11T15:05:28+00:00" + "time": "2026-03-06T21:21:28+00:00" }, { "name": "ralouphie/getallheaders", @@ -5597,16 +5597,16 @@ }, { "name": "symfony/console", - "version": "v7.4.4", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894" + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/41e38717ac1dd7a46b6bda7d6a82af2d98a78894", - "reference": "41e38717ac1dd7a46b6bda7d6a82af2d98a78894", + "url": "https://api.github.com/repos/symfony/console/zipball/e1e6770440fb9c9b0cf725f81d1361ad1835329d", + "reference": "e1e6770440fb9c9b0cf725f81d1361ad1835329d", "shasum": "" }, "require": { @@ -5671,7 +5671,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.4.4" + "source": "https://github.com/symfony/console/tree/v7.4.7" }, "funding": [ { @@ -5691,20 +5691,20 @@ "type": "tidelift" } ], - "time": "2026-01-13T11:36:38+00:00" + "time": "2026-03-06T14:06:20+00:00" }, { "name": "symfony/css-selector", - "version": "v8.0.0", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b" + "reference": "2a178bf80f05dbbe469a337730eba79d61315262" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/6225bd458c53ecdee056214cb4a2ffaf58bd592b", - "reference": "6225bd458c53ecdee056214cb4a2ffaf58bd592b", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/2a178bf80f05dbbe469a337730eba79d61315262", + "reference": "2a178bf80f05dbbe469a337730eba79d61315262", "shasum": "" }, "require": { @@ -5740,7 +5740,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v8.0.0" + "source": "https://github.com/symfony/css-selector/tree/v8.0.6" }, "funding": [ { @@ -5760,7 +5760,7 @@ "type": "tidelift" } ], - "time": "2025-10-30T14:17:19+00:00" + "time": "2026-02-17T13:07:04+00:00" }, { "name": "symfony/deprecation-contracts", @@ -6074,16 +6074,16 @@ }, { "name": "symfony/filesystem", - "version": "v8.0.1", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "d937d400b980523dc9ee946bb69972b5e619058d" + "reference": "7bf9162d7a0dff98d079b72948508fa48018a770" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/d937d400b980523dc9ee946bb69972b5e619058d", - "reference": "d937d400b980523dc9ee946bb69972b5e619058d", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/7bf9162d7a0dff98d079b72948508fa48018a770", + "reference": "7bf9162d7a0dff98d079b72948508fa48018a770", "shasum": "" }, "require": { @@ -6120,7 +6120,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v8.0.1" + "source": "https://github.com/symfony/filesystem/tree/v8.0.6" }, "funding": [ { @@ -6140,20 +6140,20 @@ "type": "tidelift" } ], - "time": "2025-12-01T09:13:36+00:00" + "time": "2026-02-25T16:59:43+00:00" }, { "name": "symfony/finder", - "version": "v7.4.5", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb" + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", - "reference": "ad4daa7c38668dcb031e63bc99ea9bd42196a2cb", + "url": "https://api.github.com/repos/symfony/finder/zipball/8655bf1076b7a3a346cb11413ffdabff50c7ffcf", + "reference": "8655bf1076b7a3a346cb11413ffdabff50c7ffcf", "shasum": "" }, "require": { @@ -6188,7 +6188,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.4.5" + "source": "https://github.com/symfony/finder/tree/v7.4.6" }, "funding": [ { @@ -6208,20 +6208,20 @@ "type": "tidelift" } ], - "time": "2026-01-26T15:07:59+00:00" + "time": "2026-01-29T09:40:50+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.4.5", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "446d0db2b1f21575f1284b74533e425096abdfb6" + "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/446d0db2b1f21575f1284b74533e425096abdfb6", - "reference": "446d0db2b1f21575f1284b74533e425096abdfb6", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/f94b3e7b7dafd40e666f0c9ff2084133bae41e81", + "reference": "f94b3e7b7dafd40e666f0c9ff2084133bae41e81", "shasum": "" }, "require": { @@ -6270,7 +6270,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.4.5" + "source": "https://github.com/symfony/http-foundation/tree/v7.4.7" }, "funding": [ { @@ -6290,20 +6290,20 @@ "type": "tidelift" } ], - "time": "2026-01-27T16:16:02+00:00" + "time": "2026-03-06T13:15:18+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.4.5", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "229eda477017f92bd2ce7615d06222ec0c19e82a" + "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/229eda477017f92bd2ce7615d06222ec0c19e82a", - "reference": "229eda477017f92bd2ce7615d06222ec0c19e82a", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/3b3fcf386c809be990c922e10e4c620d6367cab1", + "reference": "3b3fcf386c809be990c922e10e4c620d6367cab1", "shasum": "" }, "require": { @@ -6345,7 +6345,7 @@ "symfony/config": "^6.4|^7.0|^8.0", "symfony/console": "^6.4|^7.0|^8.0", "symfony/css-selector": "^6.4|^7.0|^8.0", - "symfony/dependency-injection": "^6.4|^7.0|^8.0", + "symfony/dependency-injection": "^6.4.1|^7.0.1|^8.0", "symfony/dom-crawler": "^6.4|^7.0|^8.0", "symfony/expression-language": "^6.4|^7.0|^8.0", "symfony/finder": "^6.4|^7.0|^8.0", @@ -6389,7 +6389,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.4.5" + "source": "https://github.com/symfony/http-kernel/tree/v7.4.7" }, "funding": [ { @@ -6409,20 +6409,20 @@ "type": "tidelift" } ], - "time": "2026-01-28T10:33:42+00:00" + "time": "2026-03-06T16:33:18+00:00" }, { "name": "symfony/mailer", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "7b750074c40c694ceb34cb926d6dffee231c5cd6" + "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/7b750074c40c694ceb34cb926d6dffee231c5cd6", - "reference": "7b750074c40c694ceb34cb926d6dffee231c5cd6", + "url": "https://api.github.com/repos/symfony/mailer/zipball/b02726f39a20bc65e30364f5c750c4ddbf1f58e9", + "reference": "b02726f39a20bc65e30364f5c750c4ddbf1f58e9", "shasum": "" }, "require": { @@ -6473,7 +6473,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.4.4" + "source": "https://github.com/symfony/mailer/tree/v7.4.6" }, "funding": [ { @@ -6493,20 +6493,20 @@ "type": "tidelift" } ], - "time": "2026-01-08T08:25:11+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/mime", - "version": "v7.4.5", + "version": "v7.4.7", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "b18c7e6e9eee1e19958138df10412f3c4c316148" + "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/b18c7e6e9eee1e19958138df10412f3c4c316148", - "reference": "b18c7e6e9eee1e19958138df10412f3c4c316148", + "url": "https://api.github.com/repos/symfony/mime/zipball/da5ab4fde3f6c88ab06e96185b9922f48b677cd1", + "reference": "da5ab4fde3f6c88ab06e96185b9922f48b677cd1", "shasum": "" }, "require": { @@ -6517,7 +6517,7 @@ }, "conflict": { "egulias/email-validator": "~3.0.0", - "phpdocumentor/reflection-docblock": "<5.2|>=6", + "phpdocumentor/reflection-docblock": "<5.2|>=7", "phpdocumentor/type-resolver": "<1.5.1", "symfony/mailer": "<6.4", "symfony/serializer": "<6.4.3|>7.0,<7.0.3" @@ -6525,7 +6525,7 @@ "require-dev": { "egulias/email-validator": "^2.1.10|^3.1|^4", "league/html-to-markdown": "^5.0", - "phpdocumentor/reflection-docblock": "^5.2", + "phpdocumentor/reflection-docblock": "^5.2|^6.0", "symfony/dependency-injection": "^6.4|^7.0|^8.0", "symfony/process": "^6.4|^7.0|^8.0", "symfony/property-access": "^6.4|^7.0|^8.0", @@ -6562,7 +6562,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.4.5" + "source": "https://github.com/symfony/mime/tree/v7.4.7" }, "funding": [ { @@ -6582,7 +6582,7 @@ "type": "tidelift" } ], - "time": "2026-01-27T08:59:58+00:00" + "time": "2026-03-05T15:24:09+00:00" }, { "name": "symfony/polyfill-ctype", @@ -7480,16 +7480,16 @@ }, { "name": "symfony/routing", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "0798827fe2c79caeed41d70b680c2c3507d10147" + "reference": "238d749c56b804b31a9bf3e26519d93b65a60938" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/0798827fe2c79caeed41d70b680c2c3507d10147", - "reference": "0798827fe2c79caeed41d70b680c2c3507d10147", + "url": "https://api.github.com/repos/symfony/routing/zipball/238d749c56b804b31a9bf3e26519d93b65a60938", + "reference": "238d749c56b804b31a9bf3e26519d93b65a60938", "shasum": "" }, "require": { @@ -7541,7 +7541,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.4.4" + "source": "https://github.com/symfony/routing/tree/v7.4.6" }, "funding": [ { @@ -7561,7 +7561,7 @@ "type": "tidelift" } ], - "time": "2026-01-12T12:19:02+00:00" + "time": "2026-02-25T16:50:00+00:00" }, { "name": "symfony/service-contracts", @@ -7652,16 +7652,16 @@ }, { "name": "symfony/string", - "version": "v8.0.4", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "758b372d6882506821ed666032e43020c4f57194" + "reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/758b372d6882506821ed666032e43020c4f57194", - "reference": "758b372d6882506821ed666032e43020c4f57194", + "url": "https://api.github.com/repos/symfony/string/zipball/6c9e1108041b5dce21a9a4984b531c4923aa9ec4", + "reference": "6c9e1108041b5dce21a9a4984b531c4923aa9ec4", "shasum": "" }, "require": { @@ -7718,7 +7718,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v8.0.4" + "source": "https://github.com/symfony/string/tree/v8.0.6" }, "funding": [ { @@ -7738,20 +7738,20 @@ "type": "tidelift" } ], - "time": "2026-01-12T12:37:40+00:00" + "time": "2026-02-09T10:14:57+00:00" }, { "name": "symfony/translation", - "version": "v8.0.4", + "version": "v8.0.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "db70c8ce7db74fd2da7b1d268db46b2a8ce32c10" + "reference": "13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/db70c8ce7db74fd2da7b1d268db46b2a8ce32c10", - "reference": "db70c8ce7db74fd2da7b1d268db46b2a8ce32c10", + "url": "https://api.github.com/repos/symfony/translation/zipball/13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b", + "reference": "13ff19bcf2bea492d3c2fbeaa194dd6f4599ce1b", "shasum": "" }, "require": { @@ -7811,7 +7811,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v8.0.4" + "source": "https://github.com/symfony/translation/tree/v8.0.6" }, "funding": [ { @@ -7831,7 +7831,7 @@ "type": "tidelift" } ], - "time": "2026-01-13T13:06:50+00:00" + "time": "2026-02-17T13:07:04+00:00" }, { "name": "symfony/translation-contracts", @@ -7995,16 +7995,16 @@ }, { "name": "symfony/var-dumper", - "version": "v7.4.4", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "0e4769b46a0c3c62390d124635ce59f66874b282" + "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0e4769b46a0c3c62390d124635ce59f66874b282", - "reference": "0e4769b46a0c3c62390d124635ce59f66874b282", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/045321c440ac18347b136c63d2e9bf28a2dc0291", + "reference": "045321c440ac18347b136c63d2e9bf28a2dc0291", "shasum": "" }, "require": { @@ -8058,7 +8058,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.4.4" + "source": "https://github.com/symfony/var-dumper/tree/v7.4.6" }, "funding": [ { @@ -8078,30 +8078,29 @@ "type": "tidelift" } ], - "time": "2026-01-01T22:13:48+00:00" + "time": "2026-02-15T10:53:20+00:00" }, { "name": "symfony/var-exporter", - "version": "v7.4.0", + "version": "v8.0.0", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "03a60f169c79a28513a78c967316fbc8bf17816f" + "reference": "7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/03a60f169c79a28513a78c967316fbc8bf17816f", - "reference": "03a60f169c79a28513a78c967316fbc8bf17816f", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04", + "reference": "7345f46c251f2eb27c7b3ebdb5bb076b3ffcae04", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=8.4" }, "require-dev": { - "symfony/property-access": "^6.4|^7.0|^8.0", - "symfony/serializer": "^6.4|^7.0|^8.0", - "symfony/var-dumper": "^6.4|^7.0|^8.0" + "symfony/property-access": "^7.4|^8.0", + "symfony/serializer": "^7.4|^8.0", + "symfony/var-dumper": "^7.4|^8.0" }, "type": "library", "autoload": { @@ -8139,7 +8138,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v7.4.0" + "source": "https://github.com/symfony/var-exporter/tree/v8.0.0" }, "funding": [ { @@ -8159,20 +8158,20 @@ "type": "tidelift" } ], - "time": "2025-09-11T10:15:23+00:00" + "time": "2025-11-05T18:53:00+00:00" }, { "name": "symfony/yaml", - "version": "v7.4.1", + "version": "v7.4.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "24dd4de28d2e3988b311751ac49e684d783e2345" + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/24dd4de28d2e3988b311751ac49e684d783e2345", - "reference": "24dd4de28d2e3988b311751ac49e684d783e2345", + "url": "https://api.github.com/repos/symfony/yaml/zipball/58751048de17bae71c5aa0d13cb19d79bca26391", + "reference": "58751048de17bae71c5aa0d13cb19d79bca26391", "shasum": "" }, "require": { @@ -8215,7 +8214,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.4.1" + "source": "https://github.com/symfony/yaml/tree/v7.4.6" }, "funding": [ { @@ -8235,7 +8234,7 @@ "type": "tidelift" } ], - "time": "2025-12-04T18:11:45+00:00" + "time": "2026-02-09T09:33:46+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -8452,23 +8451,23 @@ }, { "name": "wnx/sidecar-browsershot", - "version": "v2.7.0", + "version": "v2.8.0", "source": { "type": "git", "url": "https://github.com/stefanzweifel/sidecar-browsershot.git", - "reference": "e42a996c6fab4357919cd5e3f3fab33f019cdd80" + "reference": "1d2a20a6723b74c139f98f7a020fe5c0f57d05a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stefanzweifel/sidecar-browsershot/zipball/e42a996c6fab4357919cd5e3f3fab33f019cdd80", - "reference": "e42a996c6fab4357919cd5e3f3fab33f019cdd80", + "url": "https://api.github.com/repos/stefanzweifel/sidecar-browsershot/zipball/1d2a20a6723b74c139f98f7a020fe5c0f57d05a5", + "reference": "1d2a20a6723b74c139f98f7a020fe5c0f57d05a5", "shasum": "" }, "require": { - "hammerstone/sidecar": "^0.7", + "hammerstone/sidecar": "^0.7.1", "illuminate/contracts": "^12.0", "php": "^8.4", - "spatie/browsershot": "^4.0 || ^5.0", + "spatie/browsershot": "^5.0", "spatie/laravel-package-tools": "^1.9.2" }, "require-dev": { @@ -8484,7 +8483,7 @@ "phpstan/phpstan-phpunit": "^1.0|^2.0", "phpunit/phpunit": "^11.0 | ^12.0", "spatie/image": "^3.3", - "spatie/pixelmatch-php": "^1.0" + "spatie/pixelmatch-php": "^1.2" }, "type": "library", "extra": { @@ -8526,7 +8525,7 @@ ], "support": { "issues": "https://github.com/stefanzweifel/sidecar-browsershot/issues", - "source": "https://github.com/stefanzweifel/sidecar-browsershot/tree/v2.7.0" + "source": "https://github.com/stefanzweifel/sidecar-browsershot/tree/v2.8.0" }, "funding": [ { @@ -8534,7 +8533,7 @@ "type": "github" } ], - "time": "2025-11-22T08:49:08+00:00" + "time": "2026-03-07T18:24:28+00:00" } ], "packages-dev": [ @@ -8980,40 +8979,40 @@ }, { "name": "larastan/larastan", - "version": "v3.9.2", + "version": "v3.9.3", "source": { "type": "git", "url": "https://github.com/larastan/larastan.git", - "reference": "2e9ed291bdc1969e7f270fb33c9cdf3c912daeb2" + "reference": "64a52bcc5347c89fdf131cb59f96ebfbc8d1ad65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/larastan/larastan/zipball/2e9ed291bdc1969e7f270fb33c9cdf3c912daeb2", - "reference": "2e9ed291bdc1969e7f270fb33c9cdf3c912daeb2", + "url": "https://api.github.com/repos/larastan/larastan/zipball/64a52bcc5347c89fdf131cb59f96ebfbc8d1ad65", + "reference": "64a52bcc5347c89fdf131cb59f96ebfbc8d1ad65", "shasum": "" }, "require": { "ext-json": "*", "iamcal/sql-parser": "^0.7.0", - "illuminate/console": "^11.44.2 || ^12.4.1", - "illuminate/container": "^11.44.2 || ^12.4.1", - "illuminate/contracts": "^11.44.2 || ^12.4.1", - "illuminate/database": "^11.44.2 || ^12.4.1", - "illuminate/http": "^11.44.2 || ^12.4.1", - "illuminate/pipeline": "^11.44.2 || ^12.4.1", - "illuminate/support": "^11.44.2 || ^12.4.1", + "illuminate/console": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/container": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/contracts": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/database": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/http": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/pipeline": "^11.44.2 || ^12.4.1 || ^13", + "illuminate/support": "^11.44.2 || ^12.4.1 || ^13", "php": "^8.2", "phpstan/phpstan": "^2.1.32" }, "require-dev": { "doctrine/coding-standard": "^13", - "laravel/framework": "^11.44.2 || ^12.7.2", + "laravel/framework": "^11.44.2 || ^12.7.2 || ^13", "mockery/mockery": "^1.6.12", "nikic/php-parser": "^5.4", - "orchestra/canvas": "^v9.2.2 || ^10.0.1", - "orchestra/testbench-core": "^9.12.0 || ^10.1", + "orchestra/canvas": "^v9.2.2 || ^10.0.1 || ^11", + "orchestra/testbench-core": "^9.12.0 || ^10.1 || ^11", "phpstan/phpstan-deprecation-rules": "^2.0.1", - "phpunit/phpunit": "^10.5.35 || ^11.5.15" + "phpunit/phpunit": "^10.5.35 || ^11.5.15 || ^12.5.8" }, "suggest": { "orchestra/testbench": "Using Larastan for analysing a package needs Testbench", @@ -9058,7 +9057,7 @@ ], "support": { "issues": "https://github.com/larastan/larastan/issues", - "source": "https://github.com/larastan/larastan/tree/v3.9.2" + "source": "https://github.com/larastan/larastan/tree/v3.9.3" }, "funding": [ { @@ -9066,29 +9065,29 @@ "type": "github" } ], - "time": "2026-01-30T15:16:32+00:00" + "time": "2026-02-20T12:07:12+00:00" }, { "name": "laravel/boost", - "version": "v2.2.0", + "version": "v2.2.3", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "b4c5bed7b45e9cd9f705ef3ab1157d437376323c" + "reference": "44ab65a5455c2d6fceb71d6145f8d5d89c02d889" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/b4c5bed7b45e9cd9f705ef3ab1157d437376323c", - "reference": "b4c5bed7b45e9cd9f705ef3ab1157d437376323c", + "url": "https://api.github.com/repos/laravel/boost/zipball/44ab65a5455c2d6fceb71d6145f8d5d89c02d889", + "reference": "44ab65a5455c2d6fceb71d6145f8d5d89c02d889", "shasum": "" }, "require": { "guzzlehttp/guzzle": "^7.9", - "illuminate/console": "^11.45.3|^12.41.1", - "illuminate/contracts": "^11.45.3|^12.41.1", - "illuminate/routing": "^11.45.3|^12.41.1", - "illuminate/support": "^11.45.3|^12.41.1", - "laravel/mcp": "^0.5.1", + "illuminate/console": "^11.45.3|^12.41.1|^13.0", + "illuminate/contracts": "^11.45.3|^12.41.1|^13.0", + "illuminate/routing": "^11.45.3|^12.41.1|^13.0", + "illuminate/support": "^11.45.3|^12.41.1|^13.0", + "laravel/mcp": "^0.5.1|^0.6.0", "laravel/prompts": "^0.3.10", "laravel/roster": "^0.5.0", "php": "^8.2" @@ -9096,7 +9095,7 @@ "require-dev": { "laravel/pint": "^1.27.0", "mockery/mockery": "^1.6.12", - "orchestra/testbench": "^9.15.0|^10.6", + "orchestra/testbench": "^9.15.0|^10.6|^11.0", "pestphp/pest": "^2.36.0|^3.8.4|^4.1.5", "phpstan/phpstan": "^2.1.27", "rector/rector": "^2.1" @@ -9132,20 +9131,20 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2026-02-20T14:45:22+00:00" + "time": "2026-03-06T20:20:28+00:00" }, { "name": "laravel/mcp", - "version": "v0.5.9", + "version": "v0.6.0", "source": { "type": "git", "url": "https://github.com/laravel/mcp.git", - "reference": "39e8da60eb7bce4737c5d868d35a3fe78938c129" + "reference": "28860a10ca0cc5433e25d897ba7af844e6c7b6a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/mcp/zipball/39e8da60eb7bce4737c5d868d35a3fe78938c129", - "reference": "39e8da60eb7bce4737c5d868d35a3fe78938c129", + "url": "https://api.github.com/repos/laravel/mcp/zipball/28860a10ca0cc5433e25d897ba7af844e6c7b6a2", + "reference": "28860a10ca0cc5433e25d897ba7af844e6c7b6a2", "shasum": "" }, "require": { @@ -9205,7 +9204,7 @@ "issues": "https://github.com/laravel/mcp/issues", "source": "https://github.com/laravel/mcp" }, - "time": "2026-02-17T19:05:53+00:00" + "time": "2026-02-24T08:43:06+00:00" }, { "name": "laravel/pail", @@ -9356,16 +9355,16 @@ }, { "name": "laravel/roster", - "version": "v0.5.0", + "version": "v0.5.1", "source": { "type": "git", "url": "https://github.com/laravel/roster.git", - "reference": "56904a78f4d7360c1c490ced7deeebf9aecb8c0e" + "reference": "5089de7615f72f78e831590ff9d0435fed0102bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/roster/zipball/56904a78f4d7360c1c490ced7deeebf9aecb8c0e", - "reference": "56904a78f4d7360c1c490ced7deeebf9aecb8c0e", + "url": "https://api.github.com/repos/laravel/roster/zipball/5089de7615f72f78e831590ff9d0435fed0102bb", + "reference": "5089de7615f72f78e831590ff9d0435fed0102bb", "shasum": "" }, "require": { @@ -9413,7 +9412,7 @@ "issues": "https://github.com/laravel/roster/issues", "source": "https://github.com/laravel/roster" }, - "time": "2026-02-17T17:33:35+00:00" + "time": "2026-03-05T07:58:43+00:00" }, { "name": "laravel/sail", @@ -12055,16 +12054,16 @@ }, { "name": "webmozart/assert", - "version": "2.1.5", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/webmozarts/assert.git", - "reference": "79155f94852fa27e2f73b459f6503f5e87e2c188" + "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/79155f94852fa27e2f73b459f6503f5e87e2c188", - "reference": "79155f94852fa27e2f73b459f6503f5e87e2c188", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/ff31ad6efc62e66e518fbab1cde3453d389bcdc8", + "reference": "ff31ad6efc62e66e518fbab1cde3453d389bcdc8", "shasum": "" }, "require": { @@ -12111,9 +12110,9 @@ ], "support": { "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/2.1.5" + "source": "https://github.com/webmozarts/assert/tree/2.1.6" }, - "time": "2026-02-18T14:09:36+00:00" + "time": "2026-02-27T10:28:38+00:00" } ], "aliases": [], From d246ac2c599955f40585b6e81e48a1eb56088f42 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Tue, 3 Mar 2026 17:11:21 +0100 Subject: [PATCH 20/30] chore(docker): add instructions on how to generate an APP_KEY --- docker/prod/docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml index 38cac0e..fb7dfc6 100644 --- a/docker/prod/docker-compose.yml +++ b/docker/prod/docker-compose.yml @@ -4,6 +4,7 @@ services: ports: - "4567:8080" environment: + # Generate the APP_KEY with `echo "base64:$(openssl rand -base64 32)"` #- APP_KEY= - PHP_OPCACHE_ENABLE=1 - TRMNL_PROXY_REFRESH_MINUTES=15 From c194ab5db1ae084598a974b8758618bd01c0b7df Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Sun, 8 Mar 2026 12:57:11 +0100 Subject: [PATCH 21/30] feat(dev): seed default playlist with device --- database/seeders/DatabaseSeeder.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index c7125c5..cde0f20 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -3,6 +3,7 @@ namespace Database\Seeders; use App\Models\Device; +use App\Models\Playlist; use App\Models\Plugin; use App\Models\User; use Illuminate\Database\Seeder; @@ -23,9 +24,19 @@ class DatabaseSeeder extends Seeder 'password' => bcrypt('admin@example.com'), ]); - Device::factory(1)->create([ + $device = Device::factory()->create([ 'mac_address' => '00:00:00:00:00:00', 'api_key' => 'test-api-key', + 'provisioned' => false, + ]); + + Playlist::factory()->create([ + 'device_id' => $device->id, + 'name' => 'Default', + 'is_active' => true, + 'active_from' => null, + 'active_until' => null, + 'weekdays' => null ]); // Device::factory(5)->create(); From 26b5f3ceb1ad5f502fce8512360dc9d272df9b4e Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Fri, 27 Feb 2026 17:38:28 +0100 Subject: [PATCH 22/30] feat(#194): refactor cache to be device specific --- app/Jobs/GenerateScreenJob.php | 9 +- app/Models/Plugin.php | 2 + app/Services/ImageGenerationService.php | 104 +++++++++--- ...urrent_image_metadata_to_plugins_table.php | 28 +++ routes/api.php | 15 +- tests/Feature/GenerateScreenJobTest.php | 25 +++ tests/Feature/ImageGenerationServiceTest.php | 160 +++++++++++++----- .../Services/ImageGenerationServiceTest.php | 45 +---- 8 files changed, 278 insertions(+), 110 deletions(-) create mode 100644 database/migrations/2026_02_27_153837_add_current_image_metadata_to_plugins_table.php diff --git a/app/Jobs/GenerateScreenJob.php b/app/Jobs/GenerateScreenJob.php index b9661cc..4af43dd 100644 --- a/app/Jobs/GenerateScreenJob.php +++ b/app/Jobs/GenerateScreenJob.php @@ -34,8 +34,13 @@ class GenerateScreenJob implements ShouldQueue Device::find($this->deviceId)->update(['current_screen_image' => $newImageUuid]); if ($this->pluginId) { - // cache current image - Plugin::find($this->pluginId)->update(['current_image' => $newImageUuid]); + $plugin = Plugin::find($this->pluginId); + $update = ['current_image' => $newImageUuid]; + if ($plugin->plugin_type === 'recipe') { + $device = Device::with(['deviceModel', 'deviceModel.palette'])->find($this->deviceId); + $update['current_image_metadata'] = ImageGenerationService::buildImageMetadataFromDevice($device); + } + $plugin->update($update); } ImageGenerationService::cleanupFolder(); diff --git a/app/Models/Plugin.php b/app/Models/Plugin.php index 3f84bc5..d99d988 100644 --- a/app/Models/Plugin.php +++ b/app/Models/Plugin.php @@ -49,6 +49,7 @@ class Plugin extends Model 'preferred_renderer' => 'string', 'plugin_type' => 'string', 'alias' => 'boolean', + 'current_image_metadata' => 'array', ]; protected static function boot() @@ -71,6 +72,7 @@ class Plugin extends Model 'render_markup_shared', ])) { $model->current_image = null; + $model->current_image_metadata = null; } }); diff --git a/app/Services/ImageGenerationService.php b/app/Services/ImageGenerationService.php index fa6f325..75f374e 100644 --- a/app/Services/ImageGenerationService.php +++ b/app/Services/ImageGenerationService.php @@ -331,36 +331,88 @@ class ImageGenerationService } } - public static function resetIfNotCacheable(?Plugin $plugin): void + /** + * Ensure plugin image cache is valid for the current context. No-op for image_webhook. + * When deviceOrModel is provided (recipe only), clears cache if stored metadata does not match. + */ + public static function resetIfNotCacheable(?Plugin $plugin, Device|DeviceModel|null $deviceOrModel = null): void { - if ($plugin?->id) { - // Image webhook plugins have finalized images that shouldn't be reset - if ($plugin->plugin_type === 'image_webhook') { - return; - } - // Check if any devices have custom dimensions or use non-standard DeviceModels - $hasCustomDimensions = Device::query() - ->where(function ($query): void { - $query->where('width', '!=', 800) - ->orWhere('height', '!=', 480) - ->orWhere('rotate', '!=', 0); - }) - ->orWhereHas('deviceModel', function ($query): void { - // Only allow caching if all device models have standard dimensions (800x480, rotation=0) - $query->where(function ($subQuery): void { - $subQuery->where('width', '!=', 800) - ->orWhere('height', '!=', 480) - ->orWhere('rotation', '!=', 0); - }); - }) - ->exists(); + if (! $plugin?->id || $plugin->plugin_type === 'image_webhook') { + return; + } + if ($deviceOrModel === null || $plugin->plugin_type !== 'recipe') { + return; + } + if ($plugin->current_image === null) { + return; + } + if (self::imageMetadataMatches($plugin->current_image_metadata, $deviceOrModel)) { + return; + } + $plugin->update([ + 'current_image' => null, + 'current_image_metadata' => null, + ]); + Log::debug("Plugin {$plugin->id}: cleared image cache due to metadata mismatch"); + } - if ($hasCustomDimensions) { - // TODO cache image per device - $plugin->update(['current_image' => null]); - Log::debug('Skip cache as devices with custom dimensions or non-standard DeviceModels exist'); + /** + * Build canonical image metadata from a Device for cache comparison. + * + * @return array{width: int, height: int, rotation: int, palette_id: int|null, mime_type: string} + */ + public static function buildImageMetadataFromDevice(Device $device): array + { + $device->loadMissing(['deviceModel', 'deviceModel.palette']); + $settings = self::getImageSettings($device); + $paletteId = $device->palette_id ?? $device->deviceModel?->palette_id; + + return [ + 'width' => $settings['width'], + 'height' => $settings['height'], + 'rotation' => $settings['rotation'] ?? 0, + 'palette_id' => $paletteId, + 'mime_type' => $settings['mime_type'], + ]; + } + + /** + * Build canonical image metadata from a DeviceModel for cache comparison. + * + * @return array{width: int, height: int, rotation: int, palette_id: int|null, mime_type: string} + */ + public static function buildImageMetadataFromDeviceModel(DeviceModel $model): array + { + return [ + 'width' => $model->width, + 'height' => $model->height, + 'rotation' => $model->rotation ?? 0, + 'palette_id' => $model->palette_id, + 'mime_type' => $model->mime_type, + ]; + } + + /** + * Check if stored metadata matches the current device or device model. + * Returns false if stored is null or empty so cache is regenerated and metadata is stored. + */ + public static function imageMetadataMatches(?array $stored, Device|DeviceModel $deviceOrModel): bool + { + if ($stored === null || $stored === []) { + return false; + } + + $current = $deviceOrModel instanceof Device + ? self::buildImageMetadataFromDevice($deviceOrModel) + : self::buildImageMetadataFromDeviceModel($deviceOrModel); + + foreach (['width', 'height', 'rotation', 'palette_id', 'mime_type'] as $key) { + if (($stored[$key] ?? null) !== ($current[$key] ?? null)) { + return false; } } + + return true; } /** diff --git a/database/migrations/2026_02_27_153837_add_current_image_metadata_to_plugins_table.php b/database/migrations/2026_02_27_153837_add_current_image_metadata_to_plugins_table.php new file mode 100644 index 0000000..d212fe7 --- /dev/null +++ b/database/migrations/2026_02_27_153837_add_current_image_metadata_to_plugins_table.php @@ -0,0 +1,28 @@ +json('current_image_metadata')->nullable()->after('current_image'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('plugins', function (Blueprint $table) { + $table->dropColumn('current_image_metadata'); + }); + } +}; diff --git a/routes/api.php b/routes/api.php index c759d61..8fc040c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -88,8 +88,8 @@ Route::get('/display', function (Request $request) { $refreshTimeOverride = $playlistItem->playlist()->first()->refresh_time; $plugin = $playlistItem->plugin; - // Reset cache if Devices with different dimensions exist - ImageGenerationService::resetIfNotCacheable($plugin); + ImageGenerationService::resetIfNotCacheable($plugin, $device); + $plugin->refresh(); // Check and update stale data if needed if ($plugin->isDataStale() || $plugin->current_image === null) { @@ -699,6 +699,9 @@ Route::get('/display/{uuid}/alias', function (Request $request, string $uuid) { ], 404); } + ImageGenerationService::resetIfNotCacheable($plugin, $deviceModel); + $plugin->refresh(); + // Check if we can use cached image (only for og_png and if data is not stale) $useCache = $deviceModelName === 'og_png' && ! $plugin->isDataStale() && $plugin->current_image !== null; @@ -744,9 +747,13 @@ Route::get('/display/{uuid}/alias', function (Request $request, string $uuid) { palette: $deviceModel->palette ); - // Update plugin cache if using og_png + // Update plugin cache if using og_png (recipes only get metadata for cache comparison) if ($deviceModelName === 'og_png') { - $plugin->update(['current_image' => $imageUuid]); + $update = ['current_image' => $imageUuid]; + if ($plugin->plugin_type === 'recipe') { + $update['current_image_metadata'] = ImageGenerationService::buildImageMetadataFromDeviceModel($deviceModel); + } + $plugin->update($update); } // Return the generated image diff --git a/tests/Feature/GenerateScreenJobTest.php b/tests/Feature/GenerateScreenJobTest.php index 115fb51..9482e8c 100644 --- a/tests/Feature/GenerateScreenJobTest.php +++ b/tests/Feature/GenerateScreenJobTest.php @@ -2,6 +2,8 @@ use App\Jobs\GenerateScreenJob; use App\Models\Device; +use App\Models\DeviceModel; +use App\Models\Plugin; use Bnussbau\TrmnlPipeline\TrmnlPipeline; use Illuminate\Support\Facades\Storage; @@ -58,3 +60,26 @@ test('it preserves gitignore file during cleanup', function (): void { Storage::disk('public')->assertExists('/images/generated/.gitignore'); }); + +test('it saves current_image_metadata for recipe plugins', function (): void { + $deviceModel = DeviceModel::factory()->create([ + 'width' => 800, + 'height' => 480, + 'rotation' => 0, + 'mime_type' => 'image/png', + 'palette_id' => null, + ]); + $device = Device::factory()->create(['device_model_id' => $deviceModel->id]); + $plugin = Plugin::factory()->create(['plugin_type' => 'recipe']); + + $job = new GenerateScreenJob($device->id, $plugin->id, '

'); + $job->handle(); + + $plugin->refresh(); + expect($plugin->current_image)->not->toBeNull(); + expect($plugin->current_image_metadata)->toBeArray(); + expect($plugin->current_image_metadata)->toHaveKeys(['width', 'height', 'rotation', 'palette_id', 'mime_type']); + expect($plugin->current_image_metadata['width'])->toBe(800); + expect($plugin->current_image_metadata['height'])->toBe(480); + expect($plugin->current_image_metadata['mime_type'])->toBe('image/png'); +}); diff --git a/tests/Feature/ImageGenerationServiceTest.php b/tests/Feature/ImageGenerationServiceTest.php index 07bb6a6..9d26eb6 100644 --- a/tests/Feature/ImageGenerationServiceTest.php +++ b/tests/Feature/ImageGenerationServiceTest.php @@ -8,6 +8,7 @@ use App\Models\DeviceModel; use App\Services\ImageGenerationService; use Bnussbau\TrmnlPipeline\TrmnlPipeline; use Illuminate\Foundation\Testing\RefreshDatabase; +use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Storage; uses(RefreshDatabase::class); @@ -22,6 +23,10 @@ afterEach(function (): void { TrmnlPipeline::restore(); }); +it('plugins table has current_image_metadata column', function (): void { + expect(Schema::hasColumn('plugins', 'current_image_metadata'))->toBeTrue(); +}); + it('generates image for device without device model', function (): void { // Create a device without a DeviceModel (legacy behavior) $device = Device::factory()->create([ @@ -270,39 +275,15 @@ it('cleanupFolder preserves .gitignore', function (): void { Storage::disk('public')->assertExists('/images/generated/.gitignore'); }); -it('resetIfNotCacheable resets when device models exist', function (): void { - // Create a plugin - $plugin = App\Models\Plugin::factory()->create(['current_image' => 'test-uuid']); +it('resetIfNotCacheable does not reset recipe cache based on other devices', function (): void { + // Cache validity is now determined at use-time via current_image_metadata + $plugin = App\Models\Plugin::factory()->create(['current_image' => 'test-uuid', 'plugin_type' => 'recipe']); - // Create a device with DeviceModel (should trigger cache reset) - Device::factory()->create([ - 'device_model_id' => DeviceModel::factory()->create()->id, - ]); - - // Run reset check + Device::factory()->create(['device_model_id' => DeviceModel::factory()->create()->id]); ImageGenerationService::resetIfNotCacheable($plugin); - // Assert plugin image was reset $plugin->refresh(); - expect($plugin->current_image)->toBeNull(); -}); - -it('resetIfNotCacheable resets when custom dimensions exist', function (): void { - // Create a plugin - $plugin = App\Models\Plugin::factory()->create(['current_image' => 'test-uuid']); - - // Create a device with custom dimensions (should trigger cache reset) - Device::factory()->create([ - 'width' => 1024, // Different from default 800 - 'height' => 768, // Different from default 480 - ]); - - // Run reset check - ImageGenerationService::resetIfNotCacheable($plugin); - - // Assert plugin image was reset - $plugin->refresh(); - expect($plugin->current_image)->toBeNull(); + expect($plugin->current_image)->toBe('test-uuid'); }); it('resetIfNotCacheable preserves image for standard devices', function (): void { @@ -325,27 +306,122 @@ it('resetIfNotCacheable preserves image for standard devices', function (): void }); it('cache is reset when plugin markup changes', function (): void { - // Create a plugin with cached image + // Create a plugin with cached image and metadata $plugin = App\Models\Plugin::factory()->create([ 'current_image' => 'cached-uuid', + 'current_image_metadata' => ['width' => 800, 'height' => 480, 'rotation' => 0, 'palette_id' => null, 'mime_type' => 'image/png'], 'render_markup' => '
Original markup
', ]); - // Create devices with standard dimensions (cacheable) - Device::factory()->count(2)->create([ - 'width' => 800, - 'height' => 480, - 'rotate' => 0, - ]); + $plugin->update(['render_markup' => '
Updated markup
']); - // Update the plugin markup - $plugin->update([ - 'render_markup' => '
Updated markup
', - ]); - - // Assert cache was reset when markup changed $plugin->refresh(); expect($plugin->current_image)->toBeNull(); + expect($plugin->current_image_metadata)->toBeNull(); +}); + +it('buildImageMetadataFromDevice returns canonical metadata shape', function (): void { + $deviceModel = DeviceModel::factory()->create([ + 'width' => 800, + 'height' => 480, + 'rotation' => 0, + 'mime_type' => 'image/png', + 'palette_id' => null, + ]); + $device = Device::factory()->create(['device_model_id' => $deviceModel->id]); + + $meta = ImageGenerationService::buildImageMetadataFromDevice($device); + + expect($meta)->toHaveKeys(['width', 'height', 'rotation', 'palette_id', 'mime_type']); + expect($meta['width'])->toBe(800); + expect($meta['height'])->toBe(480); + expect($meta['rotation'])->toBe(0); + expect($meta['mime_type'])->toBe('image/png'); +}); + +it('buildImageMetadataFromDeviceModel returns canonical metadata shape', function (): void { + $model = DeviceModel::factory()->create([ + 'width' => 1024, + 'height' => 768, + 'rotation' => 90, + 'mime_type' => 'image/bmp', + 'palette_id' => null, + ]); + + $meta = ImageGenerationService::buildImageMetadataFromDeviceModel($model); + + expect($meta)->toHaveKeys(['width', 'height', 'rotation', 'palette_id', 'mime_type']); + expect($meta['width'])->toBe(1024); + expect($meta['height'])->toBe(768); + expect($meta['rotation'])->toBe(90); + expect($meta['mime_type'])->toBe('image/bmp'); +}); + +it('imageMetadataMatches returns false when stored is null or empty', function (): void { + $device = Device::factory()->create(['width' => 800, 'height' => 480, 'rotate' => 0]); + + expect(ImageGenerationService::imageMetadataMatches(null, $device))->toBeFalse(); + expect(ImageGenerationService::imageMetadataMatches([], $device))->toBeFalse(); +}); + +it('imageMetadataMatches returns true when metadata matches device', function (): void { + $deviceModel = DeviceModel::factory()->create([ + 'width' => 800, + 'height' => 480, + 'rotation' => 0, + 'mime_type' => 'image/png', + 'palette_id' => null, + ]); + $device = Device::factory()->create(['device_model_id' => $deviceModel->id]); + $stored = ImageGenerationService::buildImageMetadataFromDevice($device); + + expect(ImageGenerationService::imageMetadataMatches($stored, $device))->toBeTrue(); +}); + +it('imageMetadataMatches returns false when metadata differs', function (): void { + $device = Device::factory()->create(['width' => 800, 'height' => 480, 'rotate' => 0]); + $stored = ['width' => 800, 'height' => 480, 'rotation' => 0, 'palette_id' => null, 'mime_type' => 'image/png']; + + $device->update(['width' => 1024]); + $device->refresh(); + + expect(ImageGenerationService::imageMetadataMatches($stored, $device))->toBeFalse(); +}); + +it('resetIfNotCacheable clears recipe cache when metadata does not match', function (): void { + $plugin = App\Models\Plugin::factory()->create([ + 'plugin_type' => 'recipe', + 'current_image' => 'cached-uuid', + 'current_image_metadata' => ['width' => 800, 'height' => 480, 'rotation' => 0, 'palette_id' => null, 'mime_type' => 'image/png'], + ]); + $device = Device::factory()->create(['width' => 1024, 'height' => 768, 'rotate' => 0]); + + ImageGenerationService::resetIfNotCacheable($plugin, $device); + + $plugin->refresh(); + expect($plugin->current_image)->toBeNull(); + expect($plugin->current_image_metadata)->toBeNull(); +}); + +it('resetIfNotCacheable preserves cache when metadata matches', function (): void { + $deviceModel = DeviceModel::factory()->create([ + 'width' => 800, + 'height' => 480, + 'rotation' => 0, + 'mime_type' => 'image/png', + ]); + $device = Device::factory()->create(['device_model_id' => $deviceModel->id]); + $meta = ImageGenerationService::buildImageMetadataFromDevice($device); + $plugin = App\Models\Plugin::factory()->create([ + 'plugin_type' => 'recipe', + 'current_image' => 'cached-uuid', + 'current_image_metadata' => $meta, + ]); + + ImageGenerationService::resetIfNotCacheable($plugin, $device); + + $plugin->refresh(); + expect($plugin->current_image)->toBe('cached-uuid'); }); it('determines correct image format from device model', function (): void { diff --git a/tests/Unit/Services/ImageGenerationServiceTest.php b/tests/Unit/Services/ImageGenerationServiceTest.php index 5e3dc47..da9bef9 100644 --- a/tests/Unit/Services/ImageGenerationServiceTest.php +++ b/tests/Unit/Services/ImageGenerationServiceTest.php @@ -176,37 +176,15 @@ it('cleanup_folder identifies active images correctly', function (): void { expect($activeImageUuids)->not->toContain(null); }); -it('reset_if_not_cacheable detects device models', function (): void { - // Create a plugin - $plugin = App\Models\Plugin::factory()->create(['current_image' => 'test-uuid']); +it('reset_if_not_cacheable does not reset recipe cache when other devices exist', function (): void { + // Cache validity is now determined at use-time via metadata + $plugin = App\Models\Plugin::factory()->create(['current_image' => 'test-uuid', 'plugin_type' => 'recipe']); + Device::factory()->create(['device_model_id' => DeviceModel::factory()->create()->id]); - // Create a device with DeviceModel - Device::factory()->create([ - 'device_model_id' => DeviceModel::factory()->create()->id, - ]); - - // Test that the method detects DeviceModels and resets cache ImageGenerationService::resetIfNotCacheable($plugin); $plugin->refresh(); - expect($plugin->current_image)->toBeNull(); -}); - -it('reset_if_not_cacheable detects custom dimensions', function (): void { - // Create a plugin - $plugin = App\Models\Plugin::factory()->create(['current_image' => 'test-uuid']); - - // Create a device with custom dimensions - Device::factory()->create([ - 'width' => 1024, // Different from default 800 - 'height' => 768, // Different from default 480 - ]); - - // Test that the method detects custom dimensions and resets cache - ImageGenerationService::resetIfNotCacheable($plugin); - - $plugin->refresh(); - expect($plugin->current_image)->toBeNull(); + expect($plugin->current_image)->toBe('test-uuid'); }); it('reset_if_not_cacheable preserves cache for standard devices', function (): void { @@ -258,26 +236,21 @@ it('reset_if_not_cacheable preserves cache for og_png and og_plus device models' expect($plugin->current_image)->toBe('test-uuid'); }); -it('reset_if_not_cacheable resets cache for non-standard device models', function (): void { - // Create a plugin - $plugin = App\Models\Plugin::factory()->create(['current_image' => 'test-uuid']); - - // Create a non-standard device model (e.g., kindle) +it('reset_if_not_cacheable does not reset cache for non-standard device models', function (): void { + // Cache is now validated at use-time via metadata comparison + $plugin = App\Models\Plugin::factory()->create(['current_image' => 'test-uuid', 'plugin_type' => 'recipe']); $kindleModel = DeviceModel::factory()->create([ 'name' => 'test_amazon_kindle_2024', 'width' => 1400, 'height' => 840, 'rotation' => 90, ]); - - // Create a device with the non-standard device model Device::factory()->create(['device_model_id' => $kindleModel->id]); - // Test that the method resets cache for non-standard device models ImageGenerationService::resetIfNotCacheable($plugin); $plugin->refresh(); - expect($plugin->current_image)->toBeNull(); + expect($plugin->current_image)->toBe('test-uuid'); }); it('reset_if_not_cacheable handles null plugin', function (): void { From ba541f62f17be52d9ecc6706e4028c27af200d35 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Sun, 8 Mar 2026 17:40:36 +0100 Subject: [PATCH 23/30] feat(dev): seed default playlist with device --- database/seeders/DatabaseSeeder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index cde0f20..5811f4c 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -27,7 +27,7 @@ class DatabaseSeeder extends Seeder $device = Device::factory()->create([ 'mac_address' => '00:00:00:00:00:00', 'api_key' => 'test-api-key', - 'provisioned' => false, + 'proxy_cloud' => false, ]); Playlist::factory()->create([ From 9df538de168d1b386dcd8379eac98c5e4363c27a Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Wed, 4 Mar 2026 08:24:13 +0100 Subject: [PATCH 24/30] feat: add logo --- resources/views/components/app-logo.blade.php | 3 ++- resources/views/components/auth-header.blade.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/views/components/app-logo.blade.php b/resources/views/components/app-logo.blade.php index 842020e..2bde6c1 100644 --- a/resources/views/components/app-logo.blade.php +++ b/resources/views/components/app-logo.blade.php @@ -2,5 +2,6 @@
- TRMNL BYOS Laravel + {{-- TRMNL BYOS Laravel --}} +
diff --git a/resources/views/components/auth-header.blade.php b/resources/views/components/auth-header.blade.php index e596a3f..410a62e 100644 --- a/resources/views/components/auth-header.blade.php +++ b/resources/views/components/auth-header.blade.php @@ -4,6 +4,7 @@ ])
- {{ $title }} +{{-- {{ $title }}--}} + {{ $description }}
From 3abc67ff67650d9c324d4ee737d67dff570526b9 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Sun, 8 Mar 2026 14:18:17 +0100 Subject: [PATCH 25/30] feat: rebranding to LaraPaper --- .github/workflows/docker-build.yml | 5 +- Dockerfile | 4 +- README.md | 22 ++++----- app/Models/Plugin.php | 2 +- config/app.php | 6 ++- docker/prod/docker-compose.yml | 2 +- docs/DEVELOPMENT.md | 2 +- resources/views/components/app-logo.blade.php | 7 ++- .../views/components/auth-header.blade.php | 7 ++- .../views/default-screens/setup.blade.php | 4 +- .../views/default-screens/sleep.blade.php | 2 +- .../views/livewire/plugins/index.blade.php | 4 +- .../views/livewire/plugins/markup.blade.php | 4 +- resources/views/partials/head.blade.php | 2 +- resources/views/welcome.blade.php | 4 +- tests/Feature/PixelLogoConfigTest.php | 46 +++++++++++++++++++ 16 files changed, 89 insertions(+), 34 deletions(-) create mode 100644 tests/Feature/PixelLogoConfigTest.php diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index a4ff129..c8327d3 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -6,7 +6,6 @@ on: env: REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} jobs: build-and-push: @@ -40,7 +39,9 @@ jobs: id: meta uses: docker/metadata-action@v5 with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + images: | + ${{ env.REGISTRY }}/usetrmnl/byos_laravel + ${{ env.REGISTRY }}/usetrmnl/larapaper tags: | type=semver,pattern={{version}} diff --git a/Dockerfile b/Dockerfile index c679db8..4dc531b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,8 +3,8 @@ ######################## FROM bnussbau/serversideup-php:8.4-fpm-nginx-alpine-imagick-chromium@sha256:ed705a4060d50143ddc538c1288afff217eaf76ad5791f7556a97943854cf745 AS base -LABEL org.opencontainers.image.source=https://github.com/usetrmnl/byos_laravel -LABEL org.opencontainers.image.description="TRMNL BYOS Laravel" +LABEL org.opencontainers.image.source=https://github.com/usetrmnl/larapaper +LABEL org.opencontainers.image.description="LaraPaper" LABEL org.opencontainers.image.licenses=MIT ARG APP_VERSION diff --git a/README.md b/README.md index 442cc15..c1ebafe 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -## TRMNL BYOS (PHP/Laravel) +## LaraPaper (PHP/Laravel) -[![tests](https://github.com/usetrmnl/byos_laravel/actions/workflows/test.yml/badge.svg)](https://github.com/usetrmnl/byos_laravel/actions/workflows/test.yml) +[![tests](https://github.com/usetrmnl/larapaper/actions/workflows/test.yml/badge.svg)](https://github.com/usetrmnl/larapaper/actions/workflows/test.yml) -TRMNL BYOS Laravel is a self-hostable implementation of a TRMNL server, built with Laravel. +LaraPaper is a self-hostable implementation of a TRMNL server (BYOS), built with Laravel. It allows you to manage TRMNL devices, generate screens using **native plugins** (Screens API, Markup), **recipes** (130+ from the [OSS community catalog](https://bnussbau.github.io/trmnl-recipe-catalog/), 700+ from the [TRMNL catalog](https://trmnl.com/recipes), or your own), or the **API**, and can also act as a **proxy** for the native cloud service (Core). With over 50k downloads and 200+ stars, it’s the most popular community-driven BYOS. ![Screenshot](README_byos-screenshot.png) @@ -26,7 +26,7 @@ It allows you to manage TRMNL devices, generate screens using **native plugins** * Custom ESP32 with TRMNL firmware * E-Reader Devices * KOReader ([trmnl-koreader](https://github.com/usetrmnl/trmnl-koreader)) - * Kindle ([trmnl-kindle](https://github.com/usetrmnl/byos_laravel/pull/27)) + * Kindle ([trmnl-kindle](https://github.com/usetrmnl/larapaper/pull/27)) * Nook ([trmnl-nook](https://github.com/usetrmnl/trmnl-nook)) * Kobo ([trmnl-kobo](https://github.com/usetrmnl/trmnl-kobo)) * Android Devices with [trmnl-android](https://github.com/usetrmnl/trmnl-android) @@ -61,7 +61,7 @@ Docker Compose file located at: [docker/prod/docker-compose.yml](docker/prod/doc ##### Backup Database ```sh -docker ps #find container id of byos_laravel container +docker ps #find container id of larapaper container docker cp {{CONTAINER_ID}}:/var/www/html/database/storage/database.sqlite database_backup.sqlite ``` @@ -73,11 +73,11 @@ docker compose up -d ``` #### VPS -If you’re using a VPS (e.g., Hetzner) and prefer an alternative to native Docker, you can install Dokploy and deploy BYOS Laravel using the integrated [Template](https://templates.dokploy.com/?q=trmnl+byos+laravel). +If you’re using a VPS (e.g., Hetzner) and prefer an alternative to native Docker, you can install Dokploy and deploy LaraPaper using the integrated [Template](https://templates.dokploy.com/?q=trmnl+byos+laravel). It’s a quick way to get started without having to manually manage Docker setup. #### PikaPods -You can vote for TRMNL BYOS Laravel to be included as PikaPods Template here: [feedback.pikapods.com](https://feedback.pikapods.com/posts/842/add-app-trmnl-byos-laravel) +You can vote for LaraPaper to be included as PikaPods Template here: [feedback.pikapods.com](https://feedback.pikapods.com/posts/842/add-app-trmnl-byos-laravel) #### Umbrel Umbrel is supported through a community store, [see](http://github.com/bnussbau/umbrel-store). @@ -173,13 +173,13 @@ See this YouTube guide: [https://www.youtube.com/watch?v=3xehPW-PCOM](https://ww ### ☁️ Activate fresh TRMNL Device with Cloud Proxy 1) Setup the TRMNL as in the official docs with the cloud service (connect one of the plugins to later verify it works) -2) Setup Laravel BYOS, create a user and login -3) In Laravel BYOS in the header bar, activate the toggle "Permit Auto-Join" +2) Setup LaraPaper, create a user and login +3) In LaraPaper in the header bar, activate the toggle "Permit Auto-Join" 4) Press and hold the button on the back of your TRMNL for 5 seconds to reactivate the captive portal (or reflash). -5) Go through the setup process again, in the screen where you provide the Wi-Fi credentials there is also option to set the Server URL. Use the local address of your Laravel BYOS +5) Go through the setup process again, in the screen where you provide the Wi-Fi credentials there is also option to set the Server URL. Use the local address of LaraPaper. 6) The device should automatically appear in the device list; you can deactivate the "Permit Auto-Join" toggle again. 7) In the devices list, activate the toggle "☁️ Proxy" for your device. (Make sure that the queue worker is active. In the docker image it should be running automatically.) -8) As long as no Laravel BYOS plugin is scheduled, the device will show your cloud plugins. +8) As long as no LaraPaper plugin is scheduled, the device will show your cloud plugins. ###### Troubleshooting diff --git a/app/Models/Plugin.php b/app/Models/Plugin.php index d99d988..0a39553 100644 --- a/app/Models/Plugin.php +++ b/app/Models/Plugin.php @@ -224,7 +224,7 @@ class Plugin extends Model if ($this->data_strategy !== 'polling' || ! $this->polling_url) { return; } - $headers = ['User-Agent' => 'usetrmnl/byos_laravel', 'Accept' => 'application/json']; + $headers = ['User-Agent' => 'usetrmnl/larapaper', 'Accept' => 'application/json']; // resolve headers if ($this->polling_header) { diff --git a/config/app.php b/config/app.php index fe8499c..176342e 100644 --- a/config/app.php +++ b/config/app.php @@ -13,7 +13,7 @@ return [ | */ - 'name' => env('APP_NAME', 'Laravel'), + 'name' => env('APP_NAME', 'LaraPaper'), /* |-------------------------------------------------------------------------- @@ -127,6 +127,8 @@ return [ 'enabled' => env('REGISTRATION_ENABLED', true), ], + 'pixel_logo_enabled' => env('PIXELLOGO_ENABLED', true), + 'force_https' => env('FORCE_HTTPS', false), 'puppeteer_docker' => env('PUPPETEER_DOCKER', false), 'puppeteer_mode' => env('PUPPETEER_MODE', 'local'), @@ -154,5 +156,5 @@ return [ 'catalog_url' => env('CATALOG_URL', 'https://raw.githubusercontent.com/bnussbau/trmnl-recipe-catalog/refs/heads/main/catalog.yaml'), - 'github_repo' => env('GITHUB_REPO', 'usetrmnl/byos_laravel'), + 'github_repo' => env('GITHUB_REPO', 'usetrmnl/larapaper'), ]; diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml index fb7dfc6..eaa48fb 100644 --- a/docker/prod/docker-compose.yml +++ b/docker/prod/docker-compose.yml @@ -1,6 +1,6 @@ services: app: - image: ghcr.io/usetrmnl/byos_laravel:latest + image: ghcr.io/usetrmnl/larapaper:latest ports: - "4567:8080" environment: diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index 40bcbd3..e2246bc 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -9,7 +9,7 @@ #### Clone the repository ```bash -git clone git@github.com:usetrmnl/byos_laravel.git +git clone git@github.com:usetrmnl/larapaper.git ``` #### Copy environment file diff --git a/resources/views/components/app-logo.blade.php b/resources/views/components/app-logo.blade.php index 2bde6c1..f50634a 100644 --- a/resources/views/components/app-logo.blade.php +++ b/resources/views/components/app-logo.blade.php @@ -2,6 +2,9 @@
- {{-- TRMNL BYOS Laravel --}} - + @if(config('app.pixel_logo_enabled')) + + @else + LaraPaper + @endif
diff --git a/resources/views/components/auth-header.blade.php b/resources/views/components/auth-header.blade.php index 410a62e..78aa2e5 100644 --- a/resources/views/components/auth-header.blade.php +++ b/resources/views/components/auth-header.blade.php @@ -4,7 +4,10 @@ ])
-{{-- {{ $title }}--}} - + @if(config('app.pixel_logo_enabled')) + + @else + LaraPaper + @endif {{ $description }}
diff --git a/resources/views/default-screens/setup.blade.php b/resources/views/default-screens/setup.blade.php index ab7ec60..9113eb6 100644 --- a/resources/views/default-screens/setup.blade.php +++ b/resources/views/default-screens/setup.blade.php @@ -15,10 +15,10 @@ - Welcome to BYOS Laravel! + Welcome to LaraPaper! Your device is connected. - +
diff --git a/resources/views/default-screens/sleep.blade.php b/resources/views/default-screens/sleep.blade.php index fa0c8cd..ef0a80c 100644 --- a/resources/views/default-screens/sleep.blade.php +++ b/resources/views/default-screens/sleep.blade.php @@ -25,6 +25,6 @@ Sleep Mode
- +
diff --git a/resources/views/livewire/plugins/index.blade.php b/resources/views/livewire/plugins/index.blade.php index 848fc67..0985841 100644 --- a/resources/views/livewire/plugins/index.blade.php +++ b/resources/views/livewire/plugins/index.blade.php @@ -264,7 +264,7 @@ new class extends Component {{--
  • date: "%N" is unsupported. Use date: "u" instead
  • --}} {{-- --}} - Please report
    issues on GitHub. Include your example zip file. + Please report issues on GitHub. Include your example zip file.
    @@ -315,7 +315,7 @@ new class extends Component
  • API responses in formats other than JSON are not yet fully supported.
  • There are limitations in payload size (Data Payload, Template).
  • - Please report issues, aside from the known limitations, on GitHub. Include the recipe URL. + Please report issues, aside from the known limitations, on GitHub. Include the recipe URL. diff --git a/resources/views/livewire/plugins/markup.blade.php b/resources/views/livewire/plugins/markup.blade.php index 150e626..392b0b9 100644 --- a/resources/views/livewire/plugins/markup.blade.php +++ b/resources/views/livewire/plugins/markup.blade.php @@ -72,8 +72,8 @@ new class extends Component - TRMNL BYOS Laravel - “This screen was rendered by BYOS Laravel” + LaraPaper + “This screen was rendered by BYOS LaraPaper” Benjamin Nussbaum diff --git a/resources/views/partials/head.blade.php b/resources/views/partials/head.blade.php index fa0f31a..26a42a6 100644 --- a/resources/views/partials/head.blade.php +++ b/resources/views/partials/head.blade.php @@ -1,7 +1,7 @@ -{{ $title ?? 'TRMNL BYOS Laravel' }} +{{ $title ?? 'LaraPaper' }} diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php index abf6a69..ba608f9 100644 --- a/resources/views/welcome.blade.php +++ b/resources/views/welcome.blade.php @@ -1,6 +1,6 @@
    - +
    @if (Route::has('login')) @@ -33,7 +33,7 @@
    @auth @if(config('app.version')) - Version: Version: {{ config('app.version') }} @endif diff --git a/tests/Feature/PixelLogoConfigTest.php b/tests/Feature/PixelLogoConfigTest.php new file mode 100644 index 0000000..ba009c9 --- /dev/null +++ b/tests/Feature/PixelLogoConfigTest.php @@ -0,0 +1,46 @@ +get('/login'); + + $response->assertStatus(200); + $response->assertSee('viewBox="0 0 1000 150"', false); +}); + +test('auth pages show heading instead of pixel logo when pixel_logo_enabled is false', function (): void { + Config::set('app.pixel_logo_enabled', false); + + $response = $this->get('/login'); + + $response->assertStatus(200); + $response->assertDontSee('viewBox="0 0 1000 150"', false); + $response->assertSee('LaraPaper'); +}); + +test('app logo shows text when pixel_logo_enabled is false', function (): void { + Config::set('app.pixel_logo_enabled', false); + + $user = User::factory()->create(); + $response = $this->actingAs($user)->get(route('dashboard')); + + $response->assertStatus(200); + $response->assertSee('LaraPaper'); + $response->assertDontSee('viewBox="0 0 1000 150"', false); +}); + +test('app logo shows pixel logo SVG when pixel_logo_enabled is true', function (): void { + Config::set('app.pixel_logo_enabled', true); + + $user = User::factory()->create(); + $response = $this->actingAs($user)->get(route('dashboard')); + + $response->assertStatus(200); + $response->assertSee('viewBox="0 0 1000 150"', false); +}); From 433bda9639e3b15fd6329a1fd64b577f723411f0 Mon Sep 17 00:00:00 2001 From: christoph Date: Sun, 8 Mar 2026 18:12:40 +0100 Subject: [PATCH 26/30] add trmnl property to Balde renderContext to follow up liquid renderContex changes --- app/Models/Plugin.php | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/app/Models/Plugin.php b/app/Models/Plugin.php index 0a39553..7090ec3 100644 --- a/app/Models/Plugin.php +++ b/app/Models/Plugin.php @@ -575,10 +575,45 @@ class Plugin extends Model $renderedContent = $template->render($liquidContext); } } else { + // Get timezone from user or fall back to app timezone + $timezone = $this->user->timezone ?? config('app.timezone'); + + // Calculate UTC offset in seconds + $utcOffset = (string) Carbon::now($timezone)->getOffset(); + $renderedContent = Blade::render($markup, [ 'size' => $size, 'data' => $this->data_payload, 'config' => $this->configuration ?? [], + 'trmnl' => [ + 'system' => [ + 'timestamp_utc' => now()->utc()->timestamp, + ], + 'user' => [ + 'utc_offset' => $utcOffset, + 'name' => $this->user->name ?? 'Unknown User', + 'locale' => 'en', + 'time_zone_iana' => $timezone, + ], + 'device' => [ + 'friendly_id' => $device?->friendly_id, + 'percent_charged' => $device?->battery_percent, + 'wifi_strength' => $device?->wifi_strength, + 'height' => $device?->height, + 'width' => $device?->width, + ], + 'plugin_settings' => [ + 'instance_name' => $this->name, + 'strategy' => $this->data_strategy, + 'dark_mode' => $this->dark_mode ? 'yes' : 'no', + 'no_screen_padding' => $this->no_bleed ? 'yes' : 'no', + 'polling_headers' => $this->polling_header, + 'polling_url' => $this->polling_url, + 'custom_fields_values' => [ + ...(is_array($this->configuration) ? $this->configuration : []), + ], + ], + ], ]); } From 7864c8b7ab39a3311afdb1ff80fe2f7e99a6e5bb Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Wed, 11 Mar 2026 06:41:17 +0100 Subject: [PATCH 27/30] chore: update dependencies --- composer.lock | 116 +++++++++++++++++++++++++------------------------- 1 file changed, 59 insertions(+), 57 deletions(-) diff --git a/composer.lock b/composer.lock index 82d7b7a..14b2fac 100644 --- a/composer.lock +++ b/composer.lock @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.372.1", + "version": "3.372.3", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "a48ff951eaad7f038eca3e0e89f168048b99082b" + "reference": "d207d2ca972c9b10674e535dacd4a5d956a80bad" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a48ff951eaad7f038eca3e0e89f168048b99082b", - "reference": "a48ff951eaad7f038eca3e0e89f168048b99082b", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/d207d2ca972c9b10674e535dacd4a5d956a80bad", + "reference": "d207d2ca972c9b10674e535dacd4a5d956a80bad", "shasum": "" }, "require": { @@ -153,9 +153,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.372.1" + "source": "https://github.com/aws/aws-sdk-php/tree/3.372.3" }, - "time": "2026-03-06T21:27:21+00:00" + "time": "2026-03-10T18:07:21+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1435,16 +1435,16 @@ }, { "name": "guzzlehttp/psr7", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "21dc724a0583619cd1652f673303492272778051" + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/21dc724a0583619cd1652f673303492272778051", - "reference": "21dc724a0583619cd1652f673303492272778051", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/7d0ed42f28e42d61352a7a79de682e5e67fec884", + "reference": "7d0ed42f28e42d61352a7a79de682e5e67fec884", "shasum": "" }, "require": { @@ -1460,6 +1460,7 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "http-interop/http-factory-tests": "0.9.0", + "jshttp/mime-db": "1.54.0.1", "phpunit/phpunit": "^8.5.44 || ^9.6.25" }, "suggest": { @@ -1531,7 +1532,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.8.0" + "source": "https://github.com/guzzle/psr7/tree/2.9.0" }, "funding": [ { @@ -1547,7 +1548,7 @@ "type": "tidelift" } ], - "time": "2025-08-23T21:21:41+00:00" + "time": "2026-03-10T16:41:02+00:00" }, { "name": "guzzlehttp/uri-template", @@ -1831,16 +1832,16 @@ }, { "name": "laravel/fortify", - "version": "v1.35.0", + "version": "v1.36.1", "source": { "type": "git", "url": "https://github.com/laravel/fortify.git", - "reference": "24c5bb81ea4787e0865c4a62f054ed7d1cb7a093" + "reference": "cad8bfeb63f6818f173d40090725c565c92651d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/fortify/zipball/24c5bb81ea4787e0865c4a62f054ed7d1cb7a093", - "reference": "24c5bb81ea4787e0865c4a62f054ed7d1cb7a093", + "url": "https://api.github.com/repos/laravel/fortify/zipball/cad8bfeb63f6818f173d40090725c565c92651d4", + "reference": "cad8bfeb63f6818f173d40090725c565c92651d4", "shasum": "" }, "require": { @@ -1890,20 +1891,20 @@ "issues": "https://github.com/laravel/fortify/issues", "source": "https://github.com/laravel/fortify" }, - "time": "2026-02-24T14:00:44+00:00" + "time": "2026-03-10T19:59:49+00:00" }, { "name": "laravel/framework", - "version": "v12.53.0", + "version": "v12.54.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f" + "reference": "325497463e7599cd14224c422c6e5dd2fe832868" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/f57f035c0d34503d9ff30be76159bb35a003cd1f", - "reference": "f57f035c0d34503d9ff30be76159bb35a003cd1f", + "url": "https://api.github.com/repos/laravel/framework/zipball/325497463e7599cd14224c422c6e5dd2fe832868", + "reference": "325497463e7599cd14224c422c6e5dd2fe832868", "shasum": "" }, "require": { @@ -1924,7 +1925,7 @@ "guzzlehttp/uri-template": "^1.0", "laravel/prompts": "^0.3.0", "laravel/serializable-closure": "^1.3|^2.0", - "league/commonmark": "^2.7", + "league/commonmark": "^2.8.1", "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", "league/uri": "^7.5.1", @@ -2112,20 +2113,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2026-02-24T14:35:15+00:00" + "time": "2026-03-10T20:25:56+00:00" }, { "name": "laravel/prompts", - "version": "v0.3.13", + "version": "v0.3.14", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d" + "reference": "9f0e371244eedfe2ebeaa72c79c54bb5df6e0176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/ed8c466571b37e977532fb2fd3c272c784d7050d", - "reference": "ed8c466571b37e977532fb2fd3c272c784d7050d", + "url": "https://api.github.com/repos/laravel/prompts/zipball/9f0e371244eedfe2ebeaa72c79c54bb5df6e0176", + "reference": "9f0e371244eedfe2ebeaa72c79c54bb5df6e0176", "shasum": "" }, "require": { @@ -2169,9 +2170,9 @@ "description": "Add beautiful and user-friendly forms to your command-line applications.", "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.3.13" + "source": "https://github.com/laravel/prompts/tree/v0.3.14" }, - "time": "2026-02-06T12:17:10+00:00" + "time": "2026-03-01T09:02:38+00:00" }, { "name": "laravel/sanctum", @@ -2299,16 +2300,16 @@ }, { "name": "laravel/socialite", - "version": "v5.24.3", + "version": "v5.25.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "0feb62267e7b8abc68593ca37639ad302728c129" + "reference": "231f572e1a37c9ca1fb8085e9fb8608285beafb3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/0feb62267e7b8abc68593ca37639ad302728c129", - "reference": "0feb62267e7b8abc68593ca37639ad302728c129", + "url": "https://api.github.com/repos/laravel/socialite/zipball/231f572e1a37c9ca1fb8085e9fb8608285beafb3", + "reference": "231f572e1a37c9ca1fb8085e9fb8608285beafb3", "shasum": "" }, "require": { @@ -2367,7 +2368,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2026-02-21T13:32:50+00:00" + "time": "2026-02-27T13:56:35+00:00" }, { "name": "laravel/tinker", @@ -9135,16 +9136,16 @@ }, { "name": "laravel/mcp", - "version": "v0.6.0", + "version": "v0.6.2", "source": { "type": "git", "url": "https://github.com/laravel/mcp.git", - "reference": "28860a10ca0cc5433e25d897ba7af844e6c7b6a2" + "reference": "f696e44735b95ff275392eab8ce5a3b4b42a2223" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/mcp/zipball/28860a10ca0cc5433e25d897ba7af844e6c7b6a2", - "reference": "28860a10ca0cc5433e25d897ba7af844e6c7b6a2", + "url": "https://api.github.com/repos/laravel/mcp/zipball/f696e44735b95ff275392eab8ce5a3b4b42a2223", + "reference": "f696e44735b95ff275392eab8ce5a3b4b42a2223", "shasum": "" }, "require": { @@ -9204,7 +9205,7 @@ "issues": "https://github.com/laravel/mcp/issues", "source": "https://github.com/laravel/mcp" }, - "time": "2026-02-24T08:43:06+00:00" + "time": "2026-03-10T20:00:23+00:00" }, { "name": "laravel/pail", @@ -9288,16 +9289,16 @@ }, { "name": "laravel/pint", - "version": "v1.27.1", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5" + "reference": "1feae84bf9c1649d99ba8f7b8193bf0f09f04cc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/54cca2de13790570c7b6f0f94f37896bee4abcb5", - "reference": "54cca2de13790570c7b6f0f94f37896bee4abcb5", + "url": "https://api.github.com/repos/laravel/pint/zipball/1feae84bf9c1649d99ba8f7b8193bf0f09f04cc9", + "reference": "1feae84bf9c1649d99ba8f7b8193bf0f09f04cc9", "shasum": "" }, "require": { @@ -9308,13 +9309,14 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.93.1", - "illuminate/view": "^12.51.0", - "larastan/larastan": "^3.9.2", + "friendsofphp/php-cs-fixer": "^3.94.2", + "illuminate/view": "^12.54.1", + "larastan/larastan": "^3.9.3", "laravel-zero/framework": "^12.0.5", "mockery/mockery": "^1.6.12", - "nunomaduro/termwind": "^2.3.3", - "pestphp/pest": "^3.8.5" + "nunomaduro/termwind": "^2.4.0", + "pestphp/pest": "^3.8.5", + "shipfastlabs/agent-detector": "^1.0.2" }, "bin": [ "builds/pint" @@ -9351,7 +9353,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2026-02-10T20:00:20+00:00" + "time": "2026-03-10T20:37:18+00:00" }, { "name": "laravel/roster", @@ -9718,21 +9720,21 @@ }, { "name": "pestphp/pest", - "version": "v4.4.1", + "version": "v4.4.2", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a" + "reference": "5d42e8fe3ae1d9fdf7c9f73ee88138fd30265701" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/f96a1b27864b585b0b29b0ee7331176726f7e54a", - "reference": "f96a1b27864b585b0b29b0ee7331176726f7e54a", + "url": "https://api.github.com/repos/pestphp/pest/zipball/5d42e8fe3ae1d9fdf7c9f73ee88138fd30265701", + "reference": "5d42e8fe3ae1d9fdf7c9f73ee88138fd30265701", "shasum": "" }, "require": { "brianium/paratest": "^7.19.0", - "nunomaduro/collision": "^8.9.0", + "nunomaduro/collision": "^8.9.1", "nunomaduro/termwind": "^2.4.0", "pestphp/pest-plugin": "^4.0.0", "pestphp/pest-plugin-arch": "^4.0.0", @@ -9752,7 +9754,7 @@ "pestphp/pest-dev-tools": "^4.1.0", "pestphp/pest-plugin-browser": "^4.3.0", "pestphp/pest-plugin-type-coverage": "^4.0.3", - "psy/psysh": "^0.12.20" + "psy/psysh": "^0.12.21" }, "bin": [ "bin/pest" @@ -9818,7 +9820,7 @@ ], "support": { "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.4.2" }, "funding": [ { @@ -9830,7 +9832,7 @@ "type": "github" } ], - "time": "2026-02-17T15:27:18+00:00" + "time": "2026-03-10T21:09:12+00:00" }, { "name": "pestphp/pest-plugin", From 5ca028b88526ca44371f7f9e414c0dc0de7dd176 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Wed, 11 Mar 2026 06:46:14 +0100 Subject: [PATCH 28/30] chore(#155): update om/icalparser; require PHP 8.4 --- composer.json | 4 ++-- composer.lock | 26 +++++++++++++------------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/composer.json b/composer.json index feb30c8..9ff1f90 100644 --- a/composer.json +++ b/composer.json @@ -11,7 +11,7 @@ ], "license": "MIT", "require": { - "php": "^8.2", + "php": "^8.4", "ext-imagick": "*", "ext-simplexml": "*", "ext-zip": "*", @@ -25,7 +25,7 @@ "laravel/tinker": "^2.10.1", "livewire/flux": "^2.0", "livewire/livewire": "^4.0", - "om/icalparser": "^3.2", + "om/icalparser": "^4.0", "spatie/browsershot": "^5.0", "spatie/laravel-settings": "^3.6", "stevebauman/purify": "^6.3", diff --git a/composer.lock b/composer.lock index 14b2fac..e9d30cf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a1b56974da6a4f33fe847dba0549a6e0", + "content-hash": "c13d003eb08beac106e67bfbeff85dd9", "packages": [ { "name": "aws/aws-crt-php", @@ -3926,32 +3926,32 @@ }, { "name": "om/icalparser", - "version": "v3.2.1", + "version": "v4.0.0", "source": { "type": "git", "url": "https://github.com/OzzyCzech/icalparser.git", - "reference": "bc7a82b12455ae9b62ce8e7f2d0273e86c931ecc" + "reference": "3e60e2edf0bdfed6c81b69dccf0b7f2852cd87a6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/OzzyCzech/icalparser/zipball/bc7a82b12455ae9b62ce8e7f2d0273e86c931ecc", - "reference": "bc7a82b12455ae9b62ce8e7f2d0273e86c931ecc", + "url": "https://api.github.com/repos/OzzyCzech/icalparser/zipball/3e60e2edf0bdfed6c81b69dccf0b7f2852cd87a6", + "reference": "3e60e2edf0bdfed6c81b69dccf0b7f2852cd87a6", "shasum": "" }, "require": { - "php": ">=8.1.0" + "php": "^8.4" }, "require-dev": { - "nette/tester": "^2.5.7" + "nette/tester": "^2.6.0" }, "suggest": { "ext-dom": "for timezone tool" }, "type": "library", "autoload": { - "classmap": [ - "src/" - ] + "psr-4": { + "om\\": "src/" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -3971,9 +3971,9 @@ ], "support": { "issues": "https://github.com/OzzyCzech/icalparser/issues", - "source": "https://github.com/OzzyCzech/icalparser/tree/v3.2.1" + "source": "https://github.com/OzzyCzech/icalparser/tree/v4.0.0" }, - "time": "2025-12-15T06:25:09+00:00" + "time": "2026-01-29T16:45:33+00:00" }, { "name": "paragonie/constant_time_encoding", @@ -12123,7 +12123,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.2", + "php": "^8.4", "ext-imagick": "*", "ext-simplexml": "*", "ext-zip": "*" From 7301cac8ca9a60d2deba4c20a68adaadcfaf676b Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Wed, 11 Mar 2026 08:35:21 +0100 Subject: [PATCH 29/30] fix(#203): add iCal workaround where if ORGANIZER has no parameters --- .../Plugin/Parsers/IcalResponseParser.php | 7 +- tests/Feature/Plugins/Ical/IcalParserTest.php | 163 ++++++++++++++++++ 2 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 tests/Feature/Plugins/Ical/IcalParserTest.php diff --git a/app/Services/Plugin/Parsers/IcalResponseParser.php b/app/Services/Plugin/Parsers/IcalResponseParser.php index c8f2b58..a1caedb 100644 --- a/app/Services/Plugin/Parsers/IcalResponseParser.php +++ b/app/Services/Plugin/Parsers/IcalResponseParser.php @@ -25,7 +25,12 @@ class IcalResponseParser implements ResponseParser } try { - $this->parser->parseString($body); + // Workaround for om/icalparser v4.0.0 bug where it fails if ORGANIZER or ATTENDEE has no parameters. + // When ORGANIZER or ATTENDEE has no parameters (no semicolon after the key), + // IcalParser::parseRow returns an empty string for $middle instead of an array, + // which causes a type error in a foreach loop in IcalParser::parseString. + $normalizedBody = preg_replace('/^(ORGANIZER|ATTENDEE):/m', '$1;CN=Unknown:', $body); + $this->parser->parseString($normalizedBody); $events = $this->parser->getEvents()->sorted()->getArrayCopy(); $windowStart = now()->subDays(7); diff --git a/tests/Feature/Plugins/Ical/IcalParserTest.php b/tests/Feature/Plugins/Ical/IcalParserTest.php new file mode 100644 index 0000000..a394274 --- /dev/null +++ b/tests/Feature/Plugins/Ical/IcalParserTest.php @@ -0,0 +1,163 @@ + Http::response($icalContent, 200, ['Content-Type' => 'text/calendar']), + ]); + + $plugin = Plugin::factory()->create([ + 'data_strategy' => 'polling', + 'polling_url' => 'https://example.com/calendar.ics', + 'polling_verb' => 'get', + ]); + + $plugin->updateDataPayload(); + $plugin->refresh(); + + expect($plugin->data_payload)->not->toHaveKey('error'); + expect($plugin->data_payload)->toHaveKey('ical'); + expect($plugin->data_payload['ical'])->toHaveCount(1); + expect($plugin->data_payload['ical'][0]['SUMMARY'])->toBe('Meeting'); + + Carbon::setTestNow(); +}); + +test('iCal plugin parses recurring events with multiple BYDAY correctly', function (): void { + // Set test now to Monday 2024-03-25 + Carbon::setTestNow(Carbon::parse('2024-03-25 12:00:00', 'UTC')); + + $icalContent = <<<'ICS' +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//Example Corp.//EN +BEGIN:VEVENT +DESCRIPTION:XXX-REDACTED +RRULE:FREQ=WEEKLY;UNTIL=20250604T220000Z;INTERVAL=1;BYDAY=TU,TH;WKST=MO +UID:040000008200E00074C5B7101A82E00800000000E07AF34F937EDA01000000000000000 + 01000000061F3E918C753424E8154B36E55452933 +SUMMARY:Recurring Meeting +DTSTART;VALUE=DATE:20240326 +DTEND;VALUE=DATE:20240327 +DTSTAMP:20240605T082436Z +CLASS:PUBLIC +STATUS:CONFIRMED +END:VEVENT +END:VCALENDAR +ICS; + + Http::fake([ + 'example.com/recurring.ics' => Http::response($icalContent, 200, ['Content-Type' => 'text/calendar']), + ]); + + $plugin = Plugin::factory()->create([ + 'data_strategy' => 'polling', + 'polling_url' => 'https://example.com/recurring.ics', + 'polling_verb' => 'get', + ]); + + $plugin->updateDataPayload(); + $plugin->refresh(); + + $ical = $plugin->data_payload['ical']; + + // Week of March 25, 2024: + // Tue March 26: 2024-03-26 (DTSTART) + // Thu March 28: 2024-03-28 (Recurrence) + + // The parser window is now-7 days to now+30 days. + // Window: 2024-03-18 to 2024-04-24. + + $summaries = collect($ical)->pluck('SUMMARY'); + expect($summaries)->toContain('Recurring Meeting'); + + $dates = collect($ical)->map(fn ($event) => Carbon::parse($event['DTSTART'])->format('Y-m-d'))->values(); + + // Check if Tuesday March 26 is present + expect($dates)->toContain('2024-03-26'); + + // Check if Thursday March 28 is present (THIS IS WHERE IT IS EXPECTED TO FAIL BASED ON THE ISSUE) + expect($dates)->toContain('2024-03-28'); + + Carbon::setTestNow(); +}); + +test('iCal plugin parses recurring events with multiple BYDAY and specific DTSTART correctly', function (): void { + // Set test now to Monday 2024-03-25 + Carbon::setTestNow(Carbon::parse('2024-03-25 12:00:00', 'UTC')); + + $icalContent = <<<'ICS' +BEGIN:VCALENDAR +VERSION:2.0 +X-WR-TIMEZONE:UTC +PRODID:-//Example Corp.//EN +BEGIN:VEVENT +RRULE:FREQ=WEEKLY;UNTIL=20250604T220000Z;INTERVAL=1;BYDAY=TU,TH;WKST=MO +UID:recurring-event-2 +SUMMARY:Recurring Meeting 2 +DTSTART:20240326T100000 +DTEND:20240326T110000 +DTSTAMP:20240605T082436Z +END:VEVENT +END:VCALENDAR +ICS; + + Http::fake([ + 'example.com/recurring2.ics' => Http::response($icalContent, 200, ['Content-Type' => 'text/calendar']), + ]); + + $plugin = Plugin::factory()->create([ + 'data_strategy' => 'polling', + 'polling_url' => 'https://example.com/recurring2.ics', + 'polling_verb' => 'get', + ]); + + $plugin->updateDataPayload(); + $plugin->refresh(); + + $ical = $plugin->data_payload['ical']; + $dates = collect($ical)->map(fn ($event) => Carbon::parse($event['DTSTART'])->format('Y-m-d'))->values(); + + expect($dates)->toContain('2024-03-26'); + expect($dates)->toContain('2024-03-28'); + + Carbon::setTestNow(); +}); From 90fbfadfa4bda82e6d8311046d6750a5da954777 Mon Sep 17 00:00:00 2001 From: Benjamin Nussbaum Date: Sat, 14 Mar 2026 19:06:52 +0100 Subject: [PATCH 30/30] chore: update dependencies --- composer.lock | 68 +++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/composer.lock b/composer.lock index e9d30cf..5b51acf 100644 --- a/composer.lock +++ b/composer.lock @@ -62,16 +62,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.372.3", + "version": "3.373.2", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "d207d2ca972c9b10674e535dacd4a5d956a80bad" + "reference": "483fba51c28b3a0c0647bf5100e0edca82090b18" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/d207d2ca972c9b10674e535dacd4a5d956a80bad", - "reference": "d207d2ca972c9b10674e535dacd4a5d956a80bad", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/483fba51c28b3a0c0647bf5100e0edca82090b18", + "reference": "483fba51c28b3a0c0647bf5100e0edca82090b18", "shasum": "" }, "require": { @@ -92,12 +92,12 @@ "aws/aws-php-sns-message-validator": "~1.0", "behat/behat": "~3.0", "composer/composer": "^2.7.8", - "dms/phpunit-arraysubset-asserts": "^0.4.0", + "dms/phpunit-arraysubset-asserts": "^v0.5.0", "doctrine/cache": "~1.4", "ext-dom": "*", "ext-openssl": "*", "ext-sockets": "*", - "phpunit/phpunit": "^9.6", + "phpunit/phpunit": "^10.0", "psr/cache": "^2.0 || ^3.0", "psr/simple-cache": "^2.0 || ^3.0", "sebastian/comparator": "^1.2.3 || ^4.0 || ^5.0", @@ -153,9 +153,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.372.3" + "source": "https://github.com/aws/aws-sdk-php/tree/3.373.2" }, - "time": "2026-03-10T18:07:21+00:00" + "time": "2026-03-13T18:08:30+00:00" }, { "name": "bacon/bacon-qr-code", @@ -3518,16 +3518,16 @@ }, { "name": "nesbot/carbon", - "version": "3.11.1", + "version": "3.11.3", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "f438fcc98f92babee98381d399c65336f3a3827f" + "reference": "6a7e652845bb018c668220c2a545aded8594fbbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/f438fcc98f92babee98381d399c65336f3a3827f", - "reference": "f438fcc98f92babee98381d399c65336f3a3827f", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/6a7e652845bb018c668220c2a545aded8594fbbf", + "reference": "6a7e652845bb018c668220c2a545aded8594fbbf", "shasum": "" }, "require": { @@ -3619,7 +3619,7 @@ "type": "tidelift" } ], - "time": "2026-01-29T09:26:29+00:00" + "time": "2026-03-11T17:23:39+00:00" }, { "name": "nette/schema", @@ -8452,21 +8452,21 @@ }, { "name": "wnx/sidecar-browsershot", - "version": "v2.8.0", + "version": "v2.9.0", "source": { "type": "git", "url": "https://github.com/stefanzweifel/sidecar-browsershot.git", - "reference": "1d2a20a6723b74c139f98f7a020fe5c0f57d05a5" + "reference": "352083995009bec142ff0c7ae4b2883831be0685" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stefanzweifel/sidecar-browsershot/zipball/1d2a20a6723b74c139f98f7a020fe5c0f57d05a5", - "reference": "1d2a20a6723b74c139f98f7a020fe5c0f57d05a5", + "url": "https://api.github.com/repos/stefanzweifel/sidecar-browsershot/zipball/352083995009bec142ff0c7ae4b2883831be0685", + "reference": "352083995009bec142ff0c7ae4b2883831be0685", "shasum": "" }, "require": { - "hammerstone/sidecar": "^0.7.1", - "illuminate/contracts": "^12.0", + "hammerstone/sidecar": "^0.7.1 | ^0.8.0", + "illuminate/contracts": "^12.0 | ^13.0", "php": "^8.4", "spatie/browsershot": "^5.0", "spatie/laravel-package-tools": "^1.9.2" @@ -8476,7 +8476,7 @@ "laravel/pint": "^1.13", "league/flysystem-aws-s3-v3": "^1.0|^2.0|^3.0", "nunomaduro/collision": "^7.0|^8.0", - "orchestra/testbench": "^10.0", + "orchestra/testbench": "^10.0 | ^11.0", "pestphp/pest": "^3.0|^4.0", "pestphp/pest-plugin-laravel": "^3.0|^4.0", "phpstan/extension-installer": "^1.1", @@ -8526,7 +8526,7 @@ ], "support": { "issues": "https://github.com/stefanzweifel/sidecar-browsershot/issues", - "source": "https://github.com/stefanzweifel/sidecar-browsershot/tree/v2.8.0" + "source": "https://github.com/stefanzweifel/sidecar-browsershot/tree/v2.9.0" }, "funding": [ { @@ -8534,7 +8534,7 @@ "type": "github" } ], - "time": "2026-03-07T18:24:28+00:00" + "time": "2026-03-13T20:12:58+00:00" } ], "packages-dev": [ @@ -9070,16 +9070,16 @@ }, { "name": "laravel/boost", - "version": "v2.2.3", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/laravel/boost.git", - "reference": "44ab65a5455c2d6fceb71d6145f8d5d89c02d889" + "reference": "ba0a9e6497398b6ce8243f5517b67d6761509150" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/boost/zipball/44ab65a5455c2d6fceb71d6145f8d5d89c02d889", - "reference": "44ab65a5455c2d6fceb71d6145f8d5d89c02d889", + "url": "https://api.github.com/repos/laravel/boost/zipball/ba0a9e6497398b6ce8243f5517b67d6761509150", + "reference": "ba0a9e6497398b6ce8243f5517b67d6761509150", "shasum": "" }, "require": { @@ -9132,7 +9132,7 @@ "issues": "https://github.com/laravel/boost/issues", "source": "https://github.com/laravel/boost" }, - "time": "2026-03-06T20:20:28+00:00" + "time": "2026-03-12T09:06:47+00:00" }, { "name": "laravel/mcp", @@ -9289,16 +9289,16 @@ }, { "name": "laravel/pint", - "version": "v1.28.0", + "version": "v1.29.0", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "1feae84bf9c1649d99ba8f7b8193bf0f09f04cc9" + "reference": "bdec963f53172c5e36330f3a400604c69bf02d39" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/1feae84bf9c1649d99ba8f7b8193bf0f09f04cc9", - "reference": "1feae84bf9c1649d99ba8f7b8193bf0f09f04cc9", + "url": "https://api.github.com/repos/laravel/pint/zipball/bdec963f53172c5e36330f3a400604c69bf02d39", + "reference": "bdec963f53172c5e36330f3a400604c69bf02d39", "shasum": "" }, "require": { @@ -9315,8 +9315,8 @@ "laravel-zero/framework": "^12.0.5", "mockery/mockery": "^1.6.12", "nunomaduro/termwind": "^2.4.0", - "pestphp/pest": "^3.8.5", - "shipfastlabs/agent-detector": "^1.0.2" + "pestphp/pest": "^3.8.6", + "shipfastlabs/agent-detector": "^1.1.0" }, "bin": [ "builds/pint" @@ -9353,7 +9353,7 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2026-03-10T20:37:18+00:00" + "time": "2026-03-12T15:51:39+00:00" }, { "name": "laravel/roster",