Skip to content

Commit 7804f3d

Browse files
rcourtmanclaude
andcommitted
feat: improve progress bar responsiveness for narrow screens
- Modified createProgressTextBarHTML to support responsive text display - Added simpleText parameter to show only percentage on mobile devices - Progress bars now show full details on screens ≥640px, only percentage on <640px - Updated all progress bar implementations (dashboard, nodes, storage, PBS) - Added responsive utility classes to Tailwind safelist - Prevents text stacking/overlap issues on narrow devices 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 3770f20 commit 7804f3d

File tree

6 files changed

+22
-10
lines changed

6 files changed

+22
-10
lines changed

src/public/js/ui/dashboard.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -712,7 +712,7 @@ PulseApp.ui.dashboard = (() => {
712712
const cpuPercent = Math.round(guest.cpu);
713713
const cpuTooltipText = `${cpuPercent}% ${guest.cpus ? `(${(guest.cpu * guest.cpus / 100).toFixed(1)}/${guest.cpus} cores)` : ''}`;
714714
const cpuColorClass = PulseApp.utils.getUsageColor(cpuPercent, 'cpu');
715-
const progressBar = PulseApp.utils.createProgressTextBarHTML(cpuPercent, cpuTooltipText, cpuColorClass);
715+
const progressBar = PulseApp.utils.createProgressTextBarHTML(cpuPercent, cpuTooltipText, cpuColorClass, `${cpuPercent}%`);
716716

717717
// Create both text and chart versions
718718
const guestId = guest.uniqueId;
@@ -732,7 +732,7 @@ PulseApp.ui.dashboard = (() => {
732732
memoryTooltipText += ` (Host: ${PulseApp.utils.formatBytes(guest.rawHostMemory)})`;
733733
}
734734
const memColorClass = PulseApp.utils.getUsageColor(memoryPercent, 'memory');
735-
const progressBar = PulseApp.utils.createProgressTextBarHTML(memoryPercent, memoryTooltipText, memColorClass);
735+
const progressBar = PulseApp.utils.createProgressTextBarHTML(memoryPercent, memoryTooltipText, memColorClass, `${memoryPercent}%`);
736736

737737
// Create both text and chart versions
738738
const guestId = guest.uniqueId;
@@ -750,7 +750,7 @@ PulseApp.ui.dashboard = (() => {
750750
const diskPercent = guest.disk;
751751
const diskTooltipText = guest.diskTotal ? `${PulseApp.utils.formatBytes(guest.diskCurrent)} / ${PulseApp.utils.formatBytes(guest.diskTotal)} (${diskPercent}%)` : `${diskPercent}%`;
752752
const diskColorClass = PulseApp.utils.getUsageColor(diskPercent, 'disk');
753-
const progressBar = PulseApp.utils.createProgressTextBarHTML(diskPercent, diskTooltipText, diskColorClass);
753+
const progressBar = PulseApp.utils.createProgressTextBarHTML(diskPercent, diskTooltipText, diskColorClass, `${diskPercent}%`);
754754

755755
// Create both text and chart versions
756756
const guestId = guest.uniqueId;

src/public/js/ui/nodes.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ PulseApp.ui.nodes = (() => {
66
const cpuPercent = node.cpu ? (node.cpu * 100) : 0;
77
const cpuColorClass = PulseApp.utils.getUsageColor(cpuPercent, 'cpu');
88
const cpuTooltipText = `${cpuPercent.toFixed(1)}%${node.maxcpu && node.maxcpu > 0 ? ` (${(node.cpu * node.maxcpu).toFixed(1)}/${node.maxcpu} cores)` : ''}`;
9-
return PulseApp.utils.createProgressTextBarHTML(cpuPercent, cpuTooltipText, cpuColorClass);
9+
return PulseApp.utils.createProgressTextBarHTML(cpuPercent, cpuTooltipText, cpuColorClass, `${cpuPercent.toFixed(0)}%`);
1010
}
1111

1212
function _createNodeMemoryBarHtml(node) {
@@ -15,7 +15,7 @@ PulseApp.ui.nodes = (() => {
1515
const memPercent = (memUsed && memTotal > 0) ? (memUsed / memTotal * 100) : 0;
1616
const memColorClass = PulseApp.utils.getUsageColor(memPercent, 'memory');
1717
const memTooltipText = `${PulseApp.utils.formatBytes(memUsed)} / ${PulseApp.utils.formatBytes(memTotal)} (${memPercent.toFixed(1)}%)`;
18-
return PulseApp.utils.createProgressTextBarHTML(memPercent, memTooltipText, memColorClass);
18+
return PulseApp.utils.createProgressTextBarHTML(memPercent, memTooltipText, memColorClass, `${memPercent.toFixed(0)}%`);
1919
}
2020

2121
function _createNodeDiskBarHtml(node) {
@@ -24,7 +24,7 @@ PulseApp.ui.nodes = (() => {
2424
const diskPercent = (diskUsed && diskTotal > 0) ? (diskUsed / diskTotal * 100) : 0;
2525
const diskColorClass = PulseApp.utils.getUsageColor(diskPercent, 'disk');
2626
const diskTooltipText = `${PulseApp.utils.formatBytes(diskUsed)} / ${PulseApp.utils.formatBytes(diskTotal)} (${diskPercent.toFixed(1)}%)`;
27-
return PulseApp.utils.createProgressTextBarHTML(diskPercent, diskTooltipText, diskColorClass);
27+
return PulseApp.utils.createProgressTextBarHTML(diskPercent, diskTooltipText, diskColorClass, `${diskPercent.toFixed(0)}%`);
2828
}
2929

3030
// Create a dedicated function for rendering a single node row

src/public/js/ui/pbs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ PulseApp.ui.pbs = (() => {
547547
usageCell.className = `${CSS_CLASSES.P1_PX2} ${CSS_CLASSES.WHITESPACE_NOWRAP}`;
548548
usageCell.style.minWidth = '150px';
549549
if (totalBytes > 0) {
550-
usageCell.innerHTML = PulseApp.utils.createProgressTextBarHTML(usagePercent, usageText, usageColor);
550+
usageCell.innerHTML = PulseApp.utils.createProgressTextBarHTML(usagePercent, usageText, usageColor, `${usagePercent}%`);
551551
} else {
552552
usageCell.textContent = 'N/A';
553553
}

src/public/js/ui/storage.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ PulseApp.ui.storage = (() => {
198198
const usagePercent = store.total > 0 ? (store.used / store.total) * 100 : 0;
199199
const usageTooltipText = `${PulseApp.utils.formatBytes(store.used)} / ${PulseApp.utils.formatBytes(store.total)} (${usagePercent.toFixed(1)}%)`;
200200
const usageColorClass = PulseApp.utils.getUsageColor(usagePercent);
201-
const usageBarHTML = PulseApp.utils.createProgressTextBarHTML(usagePercent, usageTooltipText, usageColorClass);
201+
const usageBarHTML = PulseApp.utils.createProgressTextBarHTML(usagePercent, usageTooltipText, usageColorClass, `${usagePercent.toFixed(0)}%`);
202202

203203
const sharedIconTooltip = store.shared === 1 ? 'Shared across cluster' : 'Local to node';
204204
const isDarkMode = document.documentElement.classList.contains('dark');

src/public/js/utils.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ PulseApp.utils = (() => {
3737
}
3838
}
3939

40-
function createProgressTextBarHTML(percentage, text, color) {
40+
function createProgressTextBarHTML(percentage, text, color, simpleText = null) {
4141
// Always use a neutral background regardless of the progress color
4242
const bgColorClass = 'bg-gray-200 dark:bg-gray-700';
4343

@@ -47,10 +47,16 @@ PulseApp.utils = (() => {
4747
green: 'bg-green-500/50 dark:bg-green-500/50'
4848
}[color] || 'bg-gray-500/50'; // Fallback progress color with opacity
4949

50+
// Use simpleText for narrow screens if provided, otherwise just show percentage
51+
const mobileText = simpleText || `${percentage}%`;
52+
5053
return `
5154
<div class="relative w-full h-3.5 rounded overflow-hidden ${bgColorClass}">
5255
<div class="absolute top-0 left-0 h-full ${progressColorClass}" style="width: ${percentage}%;"></div>
53-
<span class="absolute inset-0 flex items-center justify-center text-[10px] font-medium text-gray-800 dark:text-gray-100 leading-none">${text}</span>
56+
<span class="absolute inset-0 flex items-center justify-center text-[10px] font-medium text-gray-800 dark:text-gray-100 leading-none">
57+
<span class="hidden sm:inline truncate px-1">${text}</span>
58+
<span class="inline sm:hidden">${mobileText}</span>
59+
</span>
5460
</div>
5561
`;
5662
}

src/tailwind.config.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ module.exports = {
1717
'xl:grid-cols-1', 'xl:grid-cols-2', 'xl:grid-cols-3', 'xl:grid-cols-4',
1818
'vm-icon',
1919
'ct-icon',
20+
'hidden',
21+
'inline',
22+
'sm:hidden',
23+
'sm:inline',
24+
'truncate',
25+
'px-1',
2026
],
2127
theme: {
2228
extend: {},

0 commit comments

Comments
 (0)