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 = ` - +
+
@@ -82,6 +83,7 @@ async function loadUsers() { `).join('')}
User Auth
+

${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 = ` - +
+
@@ -146,6 +149,7 @@ async function loadPlans() { `).join('')}
Plan Devices
+ `; } 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

- +
+
@@ -121,12 +122,14 @@ export async function render(container) { `).join('') || ''}
Content Plays
No data
+

By Device

- +
+
@@ -142,6 +145,7 @@ export async function render(container) { `).join('') || ''}
Device Plays
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 = ` - +
+
@@ -368,6 +369,7 @@ async function loadUsers() { `).join('')}
User
+

${users.length} user(s) registered

`;