diff --git a/API.md b/API.md index 44d0da0c..070bc849 100644 --- a/API.md +++ b/API.md @@ -19,7 +19,6 @@ WatchState HTTP API reference. Examples use the default `/v1/api` prefix. - [GET|POST /v1/api/backends/users/{type}](#getpost-v1apibackendsuserstype) - [GET|POST /v1/api/backends/discover/{type}](#getpost-v1apibackendsdiscovertype) - [POST /v1/api/backends/accesstoken/{type}](#post-v1apibackendsaccesstokentype) - - [POST /v1/api/backends/validate/token/{type}](#post-v1apibackendsvalidatetokentype) - [POST /v1/api/backends/plex/generate](#post-v1apibackendsplexgenerate) - [POST /v1/api/backends/plex/check](#post-v1apibackendsplexcheck) - [Configured Backend Endpoints](#configured-backend-endpoints) @@ -455,35 +454,6 @@ Generates a Jellyfin or Emby access token using username/password credentials. --- -#### POST /v1/api/backends/validate/token/{type} -Validates a Plex token. - -**Path**: -- `type`: Must resolve to the Plex client. - -**Body**: -```json -{ - "token": "plex-token" -} -``` - -**Response**: -```json -{ - "info": { - "code": 200, - "message": "Token is valid." - } -} -``` - -**Errors**: -- `400 Bad Request` if the endpoint is used with a non-Plex backend or if `token` is missing. -- `401 Unauthorized` if the token is rejected. - ---- - #### POST /v1/api/backends/plex/generate Starts the Plex PIN flow used for browser/device login. @@ -2729,12 +2699,63 @@ Restarts the task scheduler. --- #### GET /v1/api/system/report -Returns the output of the `system:report` command. +Returns a structured diagnostic report. **Response**: ```json { - "...": "report payload" + "generated_at": "2024-01-01T12:00:00+00:00", + "system": { + "version": "v1.0.0", + "php_version": "8.4.0", + "sapi": "cli", + "timezone": "UTC", + "data_path": "/config", + "temp_path": "/tmp", + "database_migrated": true, + "env_file_exists": true, + "scheduler_running": true, + "scheduler_message": "OK", + "in_container": true + }, + "users": ["main"], + "backends": [ + { + "name": "plex_server", + "user": "main", + "type": "plex", + "version": "1.40.1", + "https": true, + "has_uuid": true, + "has_user": true, + "export": { "enabled": true, "last_sync": 1704110400, "playlist_last_sync": null }, + "import": { "enabled": true, "metadata_refresh": true, "last_sync": 1704110400, "playlist_last_sync": null }, + "options": {} + } + ], + "suppression": { + "file_exists": false, + "rules": null, + "error": null + }, + "tasks": [ + { + "name": "import", + "enabled": true, + "args": "-v", + "timer": "5 * * * *", + "next_run": "2024-01-01T13:00:00+00:00", + "error": null + } + ], + "logs": [ + { + "type": "app", + "entries": [ + { "datetime": "2024-01-01T12:00:00+00:00", "level": "INFO", "logger": "main", "message": "Application started" } + ] + } + ] } ``` diff --git a/FAQ.md b/FAQ.md index 1764f310..fed44c14 100644 --- a/FAQ.md +++ b/FAQ.md @@ -454,7 +454,7 @@ the issue. Please enable webhooks for your jellyfin backend to avoid this issue. We have added an experimental workaround for this issue in the `state:import` command. To enable it, add the env `WS_CLIENTS_JELLYFIN_FIX_PLAYED` via the `Configuration > Environment` page. It's turned off by default as it may cause some issues as it's untested in production, so please use it with caution and report any issues you find. -## CODE: DM001 - Item queued for re-processing. +## DM001 (`error: dm001_stale_date`) - Item queued for re-processing. This warning appears when the backend reports an older item state than the last recorded sync point. This usually shows up in edge cases and can often be resolved by forcing a state export to the backend. diff --git a/composer.lock b/composer.lock index e94ae988..d1a3a90a 100644 --- a/composer.lock +++ b/composer.lock @@ -3484,16 +3484,16 @@ }, { "name": "phpunit/phpunit", - "version": "13.2.0", + "version": "13.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3796ea973f1e7698f0d432c1c66662af9764fd9a" + "reference": "60da0ff1e10a0f72ee18a24117ec3b613a346bba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3796ea973f1e7698f0d432c1c66662af9764fd9a", - "reference": "3796ea973f1e7698f0d432c1c66662af9764fd9a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/60da0ff1e10a0f72ee18a24117ec3b613a346bba", + "reference": "60da0ff1e10a0f72ee18a24117ec3b613a346bba", "shasum": "" }, "require": { @@ -3507,7 +3507,7 @@ "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.4.1", - "phpunit/php-code-coverage": "^14.2", + "phpunit/php-code-coverage": "^14.2.2", "phpunit/php-file-iterator": "^7.0.0", "phpunit/php-invoker": "^7.0.0", "phpunit/php-text-template": "^6.0.0", @@ -3564,7 +3564,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/13.2.0" + "source": "https://github.com/sebastianbergmann/phpunit/tree/13.2.1" }, "funding": [ { @@ -3572,7 +3572,7 @@ "type": "other" } ], - "time": "2026-06-05T03:13:07+00:00" + "time": "2026-06-15T13:14:22+00:00" }, { "name": "roave/security-advisories", @@ -3580,12 +3580,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "810e1d8cfbc718df8dacf74b62b7b9a1780b9698" + "reference": "bfdbd26a02c71b3b00586f056c8cf5efea22a27a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/810e1d8cfbc718df8dacf74b62b7b9a1780b9698", - "reference": "810e1d8cfbc718df8dacf74b62b7b9a1780b9698", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/bfdbd26a02c71b3b00586f056c8cf5efea22a27a", + "reference": "bfdbd26a02c71b3b00586f056c8cf5efea22a27a", "shasum": "" }, "conflict": { @@ -3686,13 +3686,14 @@ "bytefury/crater": "<6.0.2", "cachethq/cachet": "<2.5.1", "cadmium-org/cadmium-cms": "<=0.4.9", + "cakephp/authentication": "<3.3.6|>=4,<4.1.1", "cakephp/cakephp": "<3.10.3|>=4,<4.0.10|>=4.1,<4.1.4|>=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10|>=5.2.10,<5.2.12|==5.3", "cakephp/database": ">=4.2,<4.2.12|>=4.3,<4.3.11|>=4.4,<4.4.10", "cardgate/magento2": "<2.0.33", "cardgate/woocommerce": "<=3.1.15", - "cart2quote/module-quotation": ">=4.1.6,<=4.4.5|>=5,<5.4.4", + "cart2quote/module-quotation": ">=4.1.6,<4.4.6|>=5,<5.4.4", "cart2quote/module-quotation-encoded": ">=4.1.6,<=4.4.5|>=5,<5.4.4", - "cartalyst/sentry": "<=2.1.6", + "cartalyst/sentry": "<2.1.7", "catfan/medoo": "<1.7.5", "causal/oidc": "<4", "cecil/cecil": "<7.47.1", @@ -3730,12 +3731,13 @@ "coreshop/core-shop": "<4.1.9|==5", "corveda/phpsandbox": "<1.3.5", "cosenary/instagram": "<=2.3", + "cotonti/cotonti": "<=1", "couleurcitron/tarteaucitron-wp": "<0.3", "cpsit/typo3-mailqueue": "<0.4.5|>=0.5,<0.5.2", "craftcms/aws-s3": ">=2.0.2,<=2.2.4", "craftcms/azure-blob": ">=2.0.0.0-beta1,<=2.1", - "craftcms/cms": "<4.17.12|>=5,<5.9.18", - "craftcms/commerce": ">=4,<4.11|>=5,<5.6", + "craftcms/cms": "<4.18|>=5,<5.10", + "craftcms/commerce": ">=4,<=4.11.1|>=5,<=5.6.4", "craftcms/composer": ">=4.0.0.0-RC1-dev,<=4.10|>=5.0.0.0-RC1-dev,<=5.5.1", "craftcms/craft": ">=3.5,<=4.16.17|>=5.0.0.0-RC1-dev,<=5.8.21", "craftcms/google-cloud": ">=2.0.0.0-beta1,<=2.2", @@ -3790,7 +3792,7 @@ "drupal/commerce_alphabank_redirect": "<1.0.3", "drupal/commerce_eurobank_redirect": "<2.1.1", "drupal/config_split": "<1.10|>=2,<2.0.2", - "drupal/core": ">=6,<6.38|>=7,<7.103|>=8,<10.5.9|>=10.6,<10.6.7|>=11,<11.2.11|>=11.3,<11.3.7", + "drupal/core": ">=6,<6.38|>=7,<7.103|>=8,<10.5.10|>=10.6,<10.6.9|>=11,<11.2.12|>=11.3,<11.3.10", "drupal/core-recommended": ">=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8", "drupal/currency": "<3.5", "drupal/drupal": ">=5,<5.11|>=6,<6.38|>=7,<7.102|>=8,<10.2.11|>=10.3,<10.3.9|>=11,<11.0.8", @@ -3863,6 +3865,7 @@ "fenom/fenom": "<=2.12.1", "filament/actions": ">=3.2,<3.2.123|>=4,<=4.11.3|>=5,<=5.6.3", "filament/filament": ">=4,<4.3.1", + "filament/forms": ">=3,<=3.3.52", "filament/infolists": ">=3,<3.2.115", "filament/tables": ">=3,<=3.3.50|>=4,<4.8.5|>=5,<5.3.5", "filegator/filegator": "<7.8", @@ -3910,10 +3913,10 @@ "georgringer/news": "<10.0.4|>=11,<11.4.4|>=12,<12.3.2|>=13,<13.0.2|>=14,<14.0.3", "geshi/geshi": "<=1.0.9.1", "getformwork/formwork": "<=2.3.3", - "getgrav/grav": "<=2.0.0.0-RC1", + "getgrav/grav": "<=2.0.0.0-RC8", "getgrav/grav-plugin-api": "<1.0.0.0-beta15", "getgrav/grav-plugin-form": "<9.1", - "getkirby/cms": "<=4.9|>=5,<=5.4", + "getkirby/cms": "<=4.9.3|>=5,<=5.4.3", "getkirby/kirby": "<3.9.8.3-dev|>=3.10,<3.10.1.2-dev|>=4,<4.7.1", "getkirby/panel": "<2.5.14", "getkirby/starterkit": "<=3.7.0.2", @@ -3930,10 +3933,10 @@ "gregwar/rst": "<1.0.3", "grumpydictator/firefly-iii": "<=6.6.2", "gugoan/economizzer": "<=0.9.0.0-beta1", - "guzzlehttp/guzzle": "<6.5.8|>=7,<7.4.5", + "guzzlehttp/guzzle": "<7.12.1", "guzzlehttp/guzzle-services": "<1.5.4", "guzzlehttp/oauth-subscriber": "<0.8.1", - "guzzlehttp/psr7": "<2.10.2", + "guzzlehttp/psr7": "<2.12.1", "haffner/jh_captcha": "<=2.1.3|>=3,<=3.0.2", "handcraftedinthealps/goodby-csv": "<1.4.3", "harvesthq/chosen": "<1.8.7", @@ -3988,6 +3991,7 @@ "jasig/phpcas": "<1.3.3", "jbartels/wec-map": "<3.0.3", "jcbrand/converse.js": "<3.3.3", + "jleehr/canto-saas-api": "<=2", "joedolson/my-calendar": "<3.7.7", "joelbutcher/socialstream": "<5.6|>=6,<6.2", "johnbillion/query-monitor": "<3.20.4", @@ -4031,7 +4035,7 @@ "lara-zeus/artemis": ">=1,<=1.0.6", "lara-zeus/dynamic-dashboard": ">=3,<=3.0.1", "laravel/fortify": "<1.11.1", - "laravel/framework": "<12.60|>=13,<13.10", + "laravel/framework": "<12.61.1|>=13,<13.12", "laravel/laravel": ">=5.4,<5.4.22", "laravel/passport": ">=13,<13.7.1", "laravel/pulse": "<1.3.1", @@ -4122,6 +4126,7 @@ "movim/moxl": ">=0.8,<=0.10", "movingbytes/social-network": "<=1.2.1", "mpdf/mpdf": "<=7.1.7", + "mtdowling/jmespath.php": "<2.9.1", "munkireport/comment": "<4", "munkireport/managedinstalls": "<2.6", "munkireport/munki_facts": "<1.5", @@ -4208,7 +4213,7 @@ "phenx/php-svg-lib": "<0.5.2", "php-censor/php-censor": "<2.0.13|>=2.1,<2.1.5", "php-mod/curl": "<2.3.2", - "phpbb/phpbb": "<3.3.11", + "phpbb/phpbb": "<3.3.16|==4.0.0.0-alpha1", "phpems/phpems": ">=6,<=6.1.3", "phpfastcache/phpfastcache": "<6.1.5|>=7,<7.1.2|>=8,<8.0.7", "phpmailer/phpmailer": "<6.5", @@ -4220,7 +4225,7 @@ "phpoffice/phpexcel": "<=1.8.2", "phpoffice/phpspreadsheet": "<=1.30.4|>=2,<=2.1.15|>=2.2,<=2.4.4|>=3,<=3.10.4|>=4,<=5.6", "phppgadmin/phppgadmin": "<=7.13", - "phpseclib/phpseclib": "<=2.0.53|>=3,<=3.0.51", + "phpseclib/phpseclib": "<=2.0.54|>=3,<=3.0.53", "phpservermon/phpservermon": "<3.6", "phpsysinfo/phpsysinfo": "<3.4.3", "phpunit/phpunit": "<8.5.52|>=9,<9.6.33|>=10,<10.5.62|>=11,<11.5.50|>=12,<12.5.8|>=12.5.21,<12.5.22|>=13.1.5,<13.1.6", @@ -4236,7 +4241,7 @@ "pimcore/demo": "<10.3", "pimcore/ecommerce-framework-bundle": "<1.0.10", "pimcore/perspective-editor": "<1.5.1", - "pimcore/pimcore": "<=12.3.6", + "pimcore/pimcore": "<=12.3.8", "pimcore/web2print-tools-bundle": "<=5.2.1|>=6.0.0.0-RC1-dev,<=6.1", "piwik/piwik": "<1.11", "pixelfed/pixelfed": "<0.12.5", @@ -4260,8 +4265,8 @@ "prestashop/ps_linklist": "<3.1", "privatebin/privatebin": "<1.4|>=1.5,<1.7.4|>=1.7.7,<2.0.3", "processwire/processwire": "<=3.0.255", - "propel/propel": ">=2.0.0.0-alpha1,<=2.0.0.0-alpha7", - "propel/propel1": ">=1,<=1.7.1", + "propel/propel": ">=2.0.0.0-alpha1,<2.0.0.0-alpha8", + "propel/propel1": ">=1,<1.7.2", "psy/psysh": "<=0.11.22|>=0.12,<=0.12.18", "pterodactyl/panel": "<1.12.3", "ptheofan/yii2-statemachine": ">=2.0.0.0-RC1-dev,<=2", @@ -4324,7 +4329,7 @@ "silverstripe/assets": "<2.4.5|>=3,<3.1.3", "silverstripe/cms": "<4.11.3", "silverstripe/comments": ">=1.3,<3.1.1", - "silverstripe/forum": "<=0.6.1|>=0.7,<=0.7.3", + "silverstripe/forum": "<0.6.2|>=0.7,<0.7.4", "silverstripe/framework": "<5.3.23", "silverstripe/graphql": ">=2,<2.0.5|>=3,<3.8.2|>=4,<4.3.7|>=5,<5.1.3", "silverstripe/hybridsessions": ">=1,<2.4.1|>=2.5,<2.5.1", @@ -4368,6 +4373,7 @@ "spencer14420/sp-php-email-handler": "<1", "spipu/html2pdf": "<5.2.8", "spiral/roadrunner": "<2025.1", + "spomky-labs/otphp": "<11.4.3", "spoon/library": "<1.4.1", "spoonity/tcpdf": "<6.2.22", "squizlabs/php_codesniffer": ">=1,<2.8.1|>=3,<3.0.1", @@ -4441,7 +4447,9 @@ "symfony/twig-bridge": ">=2,<4.4.51|>=5,<5.4.31|>=6,<6.3.8|>=6.4.24,<6.4.40", "symfony/twilio-notifier": ">=6.4,<6.4.40|>=7,<7.4.12|>=8,<8.0.12", "symfony/ux-autocomplete": "<2.36|>=3,<3.1", + "symfony/ux-icons": ">=2.17,<2.36.1|>=3,<3.2", "symfony/ux-live-component": "<2.36|>=3,<3.1", + "symfony/ux-toolkit": ">=2.32,<2.36.1|>=3,<3.2", "symfony/ux-twig-component": "<2.25.1", "symfony/validator": "<5.4.43|>=6,<6.4.11|>=7,<7.1.4", "symfony/var-exporter": ">=4.2,<4.2.12|>=4.3,<4.3.8", @@ -4543,6 +4551,9 @@ "web-auth/webauthn-lib": ">=4.5,<4.9|>=5.2,<5.2.4", "web-auth/webauthn-symfony-bundle": ">=5.2,<5.2.4", "web-feet/coastercms": "==5.5", + "web-token/jwt-experimental": "<=4.1.6", + "web-token/jwt-framework": "<=4.2.99", + "web-token/jwt-library": "<3.4.10|>=4,<4.0.7|>=4.1,<4.1.7", "web-tp3/wec_map": "<3.0.3", "webbuilders-group/silverstripe-kapost-bridge": "<0.4", "webcoast/deferred-image-processing": "<1.0.2", @@ -4668,7 +4679,7 @@ "type": "tidelift" } ], - "time": "2026-06-12T20:48:39+00:00" + "time": "2026-06-19T21:28:22+00:00" }, { "name": "sebastian/cli-parser", diff --git a/frontend/app/app.config.ts b/frontend/app/app.config.ts index 35ebee75..deee8cd8 100644 --- a/frontend/app/app.config.ts +++ b/frontend/app/app.config.ts @@ -17,5 +17,77 @@ export default defineAppConfig({ content: 'pointer-events-auto', }, }, + card: { + slots: { + root: 'min-w-0 max-w-full rounded-lg overflow-hidden', + }, + variants: { + variant: { + outline: { + root: 'border border-default/70 bg-elevated/20 divide-y divide-default', + }, + soft: { + root: 'bg-elevated/20 divide-y divide-default', + }, + subtle: { + root: 'border border-default/70 bg-elevated/20 divide-y divide-default', + }, + }, + }, + }, + dropdownMenu: { + slots: { + content: 'ws-floating-surface', + }, + }, + popover: { + slots: { + content: 'ws-floating-surface', + }, + }, + select: { + slots: { + content: 'ws-floating-surface', + }, + variants: { + variant: { + outline: 'bg-elevated/40 hover:bg-elevated/55 disabled:bg-elevated/20', + }, + }, + }, + selectMenu: { + slots: { + content: 'ws-floating-surface', + }, + variants: { + variant: { + outline: 'bg-elevated/40 hover:bg-elevated/55 disabled:bg-elevated/20', + }, + }, + }, + button: { + compoundVariants: [ + { + color: 'neutral', + variant: 'outline', + class: + 'bg-transparent hover:bg-elevated/30 active:bg-elevated/40 disabled:bg-transparent aria-disabled:bg-transparent', + }, + { + color: 'neutral', + variant: 'soft', + class: + 'bg-elevated/30 hover:bg-elevated/45 active:bg-elevated/55 disabled:bg-elevated/20 aria-disabled:bg-elevated/20', + }, + { + color: 'neutral', + variant: 'ghost', + class: 'hover:bg-elevated/30 active:bg-elevated/40 focus-visible:bg-elevated/30', + }, + ], + defaultVariants: { + size: 'sm', + }, + }, }, }); diff --git a/frontend/app/assets/css/tailwind.css b/frontend/app/assets/css/tailwind.css index c9ea1606..66253550 100644 --- a/frontend/app/assets/css/tailwind.css +++ b/frontend/app/assets/css/tailwind.css @@ -4,9 +4,18 @@ @import '@nuxt/ui'; :root { - --ui-radius: 0.375rem; + --ui-radius: 0.5rem; --ui-container: 96rem; --ui-header-height: 4.25rem; + --ws-border-strong: var(--ui-border-accented); + --ws-surface-border-soft: var(--ui-border-accented); + --ws-surface-border-solid: var(--ui-border-accented); +} + +.dark { + --ws-border-strong: var(--ui-border); + --ws-surface-border-soft: color-mix(in oklab, var(--ui-border) 70%, transparent); + --ws-surface-border-solid: var(--ui-border); } @layer base { @@ -16,10 +25,20 @@ .page-enter-active, .page-leave-active { - transition: opacity 0.2s ease; + transition: + opacity 0.25s ease, + transform 0.25s ease; + } + + .page-enter-from { + opacity: 0; + transform: translateY(-4px); + } + + .page-leave-active { + transition: opacity 0.1s ease; } - .page-enter-from, .page-leave-to { opacity: 0; } @@ -56,6 +75,110 @@ linear-gradient(180deg, rgb(9 12 18 / 0.98), rgb(17 24 39 / 0.98)); } + .ws-page-header { + @apply flex flex-col gap-4 xl:flex-row xl:items-start xl:justify-between; + } + + .ws-page-heading { + @apply flex min-w-0 items-center gap-3; + } + + .ws-page-kicker { + @apply flex flex-wrap items-center gap-2 text-xs font-medium uppercase tracking-[0.2em] text-toned; + } + + .ws-page-icon { + @apply inline-flex size-11 shrink-0 items-center justify-center rounded-md border bg-elevated/70 text-primary; + border-color: var(--ws-surface-border-solid); + } + + .ws-section-icon { + @apply inline-flex size-10 shrink-0 items-center justify-center rounded-md border bg-elevated/70 text-primary; + border-color: var(--ws-surface-border-solid); + } + + .ws-detail-icon { + @apply inline-flex size-9 shrink-0 items-center justify-center rounded-md border bg-elevated/70 text-primary; + border-color: var(--ws-surface-border-solid); + } + + .ws-card { + @apply min-w-0 max-w-full rounded-lg border bg-elevated/20; + border-color: var(--ws-surface-border-soft); + } + + .ws-card-padded { + @apply min-w-0 max-w-full rounded-lg border bg-elevated/20 p-4; + border-color: var(--ws-surface-border-soft); + } + + .ws-card-padded-lg { + @apply min-w-0 max-w-full rounded-lg border bg-elevated/20 p-4 sm:p-5; + border-color: var(--ws-surface-border-soft); + } + + .ws-panel { + @apply min-w-0 max-w-full rounded-lg border; + border-color: var(--ws-surface-border-soft); + } + + .ws-panel-padded { + @apply min-w-0 max-w-full rounded-lg border p-4; + border-color: var(--ws-surface-border-soft); + } + + .ws-panel-padded-lg { + @apply min-w-0 max-w-full rounded-lg border p-4 sm:p-5; + border-color: var(--ws-surface-border-soft); + } + + .ws-table-surface { + @apply min-w-0 max-w-full rounded-sm border bg-elevated/20; + border-color: var(--ws-surface-border-solid); + } + + .ws-floating-surface { + @apply border bg-default/95 shadow-xl backdrop-blur-md; + border-color: var(--ws-surface-border-solid); + box-shadow: 0 1rem 2rem rgb(15 23 42 / 0.1); + } + + .ws-floating-surface [data-slot='item'][data-highlighted]::before, + .ws-floating-surface [data-slot='item'][data-state='open']::before, + .ws-floating-surface [data-slot='item']:hover::before { + background-color: color-mix(in oklab, var(--ui-primary) 11%, transparent) !important; + } + + .ws-floating-surface [data-slot='item'][data-disabled]::before { + background-color: transparent !important; + } + + .dark .ws-floating-surface { + background: color-mix(in oklab, var(--ui-bg) 92%, var(--ui-bg-elevated) 8%); + box-shadow: 0 1rem 2rem rgb(0 0 0 / 0.3); + } + + .dark .ws-floating-surface [data-slot='item'][data-highlighted]::before, + .dark .ws-floating-surface [data-slot='item'][data-state='open']::before, + .dark .ws-floating-surface [data-slot='item']:hover::before { + background-color: color-mix(in oklab, var(--ui-primary) 16%, transparent) !important; + } + + .ws-border-top-soft { + @apply border-t; + border-color: var(--ws-surface-border-soft); + } + + .ws-border-bottom-soft { + @apply border-b; + border-color: var(--ws-surface-border-soft); + } + + .ws-border-left-soft { + @apply border-l; + border-color: var(--ws-surface-border-soft); + } + .bg-fanart { background-size: cover; background-position: center; diff --git a/frontend/app/components/BackendAdd.vue b/frontend/app/components/BackendAdd.vue index 6022e54c..a86b63b8 100644 --- a/frontend/app/components/BackendAdd.vue +++ b/frontend/app/components/BackendAdd.vue @@ -92,7 +92,7 @@ @update:open="(open) => (false === open ? (error = null) : null)" /> - +