diff --git a/frontend/css/main.css b/frontend/css/main.css
index f5092fe..cd0ffb1 100644
--- a/frontend/css/main.css
+++ b/frontend/css/main.css
@@ -878,6 +878,12 @@ body {
line-height: 1.4;
}
+/* Table wrapper: enables horizontal scroll when table min-width exceeds viewport */
+.table-wrap {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
/* Mobile hamburger toggle */
.mobile-menu-btn {
display: none;
@@ -924,8 +930,13 @@ body {
.remote-container { flex-direction: column; }
.remote-controls { width: 100%; flex-direction: row; flex-wrap: wrap; }
.modal { width: 95vw; max-height: 90vh; overflow-y: auto; }
- .tabs { overflow-x: auto; }
- .tab { white-space: nowrap; }
+ .tabs {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ mask-image: linear-gradient(to right, black calc(100% - 24px), transparent 100%);
+ -webkit-mask-image: linear-gradient(to right, black calc(100% - 24px), transparent 100%);
+ }
+ .tab { white-space: nowrap; flex-shrink: 0; }
/* Dashboard stats stack to single column */
.dash-stats-row { flex-direction: column; }
diff --git a/frontend/js/views/admin.js b/frontend/js/views/admin.js
index 5e6d602..ef18527 100644
--- a/frontend/js/views/admin.js
+++ b/frontend/js/views/admin.js
@@ -48,7 +48,8 @@ async function loadUsers() {
const [users, plans] = await Promise.all([API('/auth/users'), fetch('/api/subscription/plans').then(r => r.json())]);
el.innerHTML = `
-
+
+
| User |
Auth |
@@ -82,6 +83,7 @@ async function loadUsers() {
`).join('')}
+
${users.length} total users
`;
@@ -126,7 +128,8 @@ async function loadPlans() {
try {
const plans = await fetch('/api/subscription/plans').then(r => r.json());
el.innerHTML = `
-
+
+
| Plan |
Devices |
@@ -146,6 +149,7 @@ async function loadPlans() {
`).join('')}
+
`;
} catch (err) { el.innerHTML = `${esc(err.message)}
`; }
}
diff --git a/frontend/js/views/reports.js b/frontend/js/views/reports.js
index 4a377bb..f295b53 100644
--- a/frontend/js/views/reports.js
+++ b/frontend/js/views/reports.js
@@ -103,7 +103,8 @@ export async function render(container) {
Top Content
-
+
+
| Content |
Plays |
@@ -121,12 +122,14 @@ export async function render(container) {
`).join('') || '
| No data |
'}
+
By Device
-
+
+
| Device |
Plays |
@@ -142,6 +145,7 @@ export async function render(container) {
`).join('') || '
| No data |
'}
+
`;
diff --git a/frontend/js/views/settings.js b/frontend/js/views/settings.js
index 6db0f4a..5a63fca 100644
--- a/frontend/js/views/settings.js
+++ b/frontend/js/views/settings.js
@@ -333,7 +333,8 @@ async function loadUsers() {
const currentUser = JSON.parse(localStorage.getItem('user') || '{}');
el.innerHTML = `
-
+
+
| User |
@@ -368,6 +369,7 @@ async function loadUsers() {
`).join('')}
+
${users.length} user(s) registered
`;