diff --git a/README.md b/README.md index 6bfb126..25a59ac 100644 --- a/README.md +++ b/README.md @@ -150,7 +150,6 @@ Most configuration is editable from the web control panel. | Max queue size | 20 | | Max active requests per user | 4 | | Region | none | -| Allow Shorts | disabled | | Allow live streams | disabled | | Fallback playlist | disabled until configured | @@ -191,14 +190,19 @@ Application state is stored as JSON next to the executable: ```text data/ config.json + settings.json + server.json + twitch-config.json playlists.json + blocklist.json + activity.json + queue-state.json secrets.json + logs/ + app.log cache/ - queue-state.json - youtube-cache.json - -logs/ + fallback-tracks.json ``` Your YouTube API key and Twitch OAuth state are stored locally. The application communicates with external services only when needed for its integrations, primarily the YouTube Data API and Twitch APIs. diff --git a/package.json b/package.json index 16a58c7..a3cebfb 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,9 @@ "test:frontend": "node --test \"tests/**/*.test.js\"", "test:smoke": "node scripts/smoke-frontend.mjs", "lint": "eslint .", - "typecheck": "tsc --noEmit", + "typecheck": "npm run typecheck:src && npm run typecheck:tests", + "typecheck:src": "tsc --noEmit", + "typecheck:tests": "tsc --noEmit -p tsconfig.test.json", "build": "tsc", "build:sea": "node scripts/build-sea.mjs", "build:release": "node scripts/build-release.mjs" diff --git a/public/css/app.css b/public/css/app.css index 5f925d3..4646075 100644 --- a/public/css/app.css +++ b/public/css/app.css @@ -390,7 +390,17 @@ button:disabled { justify-content: space-between; align-items: center; padding: 0.5rem 1rem; + gap: 0.5rem; background-color: var(--bg-elevated); + flex-wrap: wrap; +} + +.section-tab-actions { + display: inline-flex; + flex-wrap: nowrap; + align-items: center; + margin-left: auto; + gap: 0.5rem; } .row-menu { @@ -427,14 +437,6 @@ button:disabled { flex-shrink: 0; } -.section-tab-actions { - display: inline-flex; - flex-wrap: wrap; - justify-content: flex-end; - align-items: center; - gap: 0.5rem; -} - .row-list-wrapper { flex: 1; min-height: 8rem; @@ -560,8 +562,9 @@ button:disabled { .now-playing-wrapper .now-playing-info { display: flex; flex-direction: column; - gap: 0.5rem; + min-width: 0; margin-top: auto; + gap: 0.5rem; } .now-playing-wrapper .now-playing-controls { @@ -655,6 +658,13 @@ button:disabled { gap: 1rem; } +.remote-note { + grid-column: 1 / -1; + padding: 0.75rem 1rem; + border: 1px solid var(--border); + color: var(--text-secondary); +} + .settings-section-column { display: flex; flex-direction: row; diff --git a/public/css/components.css b/public/css/components.css index 40d13f9..182298d 100644 --- a/public/css/components.css +++ b/public/css/components.css @@ -14,6 +14,18 @@ body { display: none !important; } +.remote-only { + display: none; +} + +body.not-local .local-only { + display: none; +} + +body.not-local .remote-only { + display: block; +} + .text-primary { color: var(--text-primary); } @@ -92,6 +104,16 @@ body { text-overflow: ellipsis; } +.truncate-3line { + display: -webkit-box; + -webkit-line-clamp: 3; + line-clamp: 3; + -webkit-box-orient: vertical; + white-space: wrap; + overflow: hidden; + text-overflow: ellipsis; +} + .box-shadow { box-shadow: rgba(0, 0, 0, 0.4) 0 0.25rem 0.875rem 0; } diff --git a/public/index.html b/public/index.html index 12c92ce..8adcd1c 100644 --- a/public/index.html +++ b/public/index.html @@ -84,10 +84,10 @@
Nothing playing
@@ -191,26 +191,28 @@
-

Queue 0/0

- + Queue is empty +
+ +
@@ -221,10 +223,7 @@

Queue
-
-

Playlist

-
-
+