From 707054b70f3701c2c3ef7ecb99748cea65212481 Mon Sep 17 00:00:00 2001 From: AnrokX <192667251+AnrokX@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:18:51 -0600 Subject: [PATCH 01/16] fix: remove max-width cap on dashboard so it fills ultrawide screens The dashboard-wrapper had max-width: 1800px with margin: 0 auto, causing large gaps on both sides of ultrawide displays. --- client/styles.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/styles.css b/client/styles.css index 7ba0e134..1f4c9df4 100644 --- a/client/styles.css +++ b/client/styles.css @@ -14478,8 +14478,8 @@ body.dependency-onboarding-active #dependency-setup-modal { /* Dashboard Layout */ .dashboard-wrapper { - max-width: 1800px; - margin: 0 auto; + max-width: none; + margin: 0; padding: 0 var(--space-lg) var(--space-lg); display: flex; flex-direction: column; From 9b812c0055d1e17c8da8fda804a148ac03e50c26 Mon Sep 17 00:00:00 2001 From: AnrokX <192667251+AnrokX@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:22:06 -0600 Subject: [PATCH 02/16] fix: make dashboard components adapt to viewport with no scrolling - Remove overflow-y: auto from left and right content columns - Make bento sections and workspace grid flexible/shrinkable - Right sidebar shrinks from 420px down to 200px on smaller screens - Workspace cards use min() to shrink below 260px when needed - Running services grid no longer scrolls independently - Responsive breakpoints keep two-column layout longer --- client/styles.css | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/client/styles.css b/client/styles.css index 1f4c9df4..0e21a6f2 100644 --- a/client/styles.css +++ b/client/styles.css @@ -14497,7 +14497,7 @@ body.dependency-onboarding-active #dependency-setup-modal { .dashboard-main-content { display: grid; - grid-template-columns: minmax(0, 1fr) 420px; + grid-template-columns: minmax(0, 1fr) minmax(200px, 420px); gap: var(--space-lg); flex: 1; min-height: 0; @@ -14509,8 +14509,8 @@ body.dependency-onboarding-active #dependency-setup-modal { flex-direction: column; gap: var(--space-md); height: 100%; - overflow-y: auto; - scrollbar-width: thin; + min-height: 0; + overflow: hidden; } .dashboard-content-right { @@ -14518,8 +14518,8 @@ body.dependency-onboarding-active #dependency-setup-modal { flex-direction: column; gap: var(--space-md); height: 100%; - overflow-y: auto; - scrollbar-width: thin; + min-height: 0; + overflow: hidden; } /* Create Workspace Banner */ @@ -14577,7 +14577,7 @@ body.dependency-onboarding-active #dependency-setup-modal { /* Workspace Grid */ .bento-workspace-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(min(260px, 100%), 1fr)); gap: var(--space-md); } @@ -14678,8 +14678,8 @@ body.dependency-onboarding-active #dependency-setup-modal { flex-direction: column; gap: var(--space-sm); flex: 1; - overflow-y: auto; - scrollbar-width: thin; + min-height: 0; + overflow: hidden; } .port-dashboard-card { @@ -14741,8 +14741,26 @@ body.dependency-onboarding-active #dependency-setup-modal { border: 1px solid var(--border-color); } +.dashboard-bento-section { + min-height: 0; + overflow: hidden; + flex: 1; +} + +.dashboard-bento-section .bento-workspace-grid { + min-height: 0; + overflow: hidden; +} + @media (max-width: 1200px) { + .dashboard-main-content { + grid-template-columns: minmax(0, 1fr) minmax(160px, 280px); + } +} + +@media (max-width: 768px) { .dashboard-main-content { grid-template-columns: 1fr; + grid-template-rows: 1fr auto; } } From 7bc21cae27cb1d72068f26cb8a2ead14acafaf76 Mon Sep 17 00:00:00 2001 From: AnrokX <192667251+AnrokX@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:31:12 -0600 Subject: [PATCH 03/16] fix: make dashboard components shrink to fit viewport instead of clipping Apply proper CSS flex/grid shrinking chain so all dashboard sections resize proportionally to fit the screen: - Use flex: 1 1 0% (not flex: 1) so flex-basis starts at 0 - Add min-height: 0 at every nesting level to allow shrinking - Use grid-auto-rows: minmax(0, 1fr) so grid rows shrink - Remove overflow: hidden from structural containers (only on leaf cards) - Make bento sections, workspace grid, and port cards all shrinkable --- client/styles.css | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/client/styles.css b/client/styles.css index 0e21a6f2..00b485db 100644 --- a/client/styles.css +++ b/client/styles.css @@ -14499,27 +14499,22 @@ body.dependency-onboarding-active #dependency-setup-modal { display: grid; grid-template-columns: minmax(0, 1fr) minmax(200px, 420px); gap: var(--space-lg); - flex: 1; + flex: 1 1 0%; min-height: 0; - overflow: hidden; } .dashboard-content-left { display: flex; flex-direction: column; gap: var(--space-md); - height: 100%; min-height: 0; - overflow: hidden; } .dashboard-content-right { display: flex; flex-direction: column; gap: var(--space-md); - height: 100%; min-height: 0; - overflow: hidden; } /* Create Workspace Banner */ @@ -14532,8 +14527,9 @@ body.dependency-onboarding-active #dependency-setup-modal { border: 1px solid var(--border-color); border-radius: 10px; padding: 14px 16px; - flex-shrink: 0; + flex-shrink: 1; align-self: flex-start; + min-height: 0; } .dashboard-create-title { @@ -14566,6 +14562,8 @@ body.dependency-onboarding-active #dependency-setup-modal { padding: var(--space-md); box-shadow: var(--shadow-soft); transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s; + min-height: 0; + overflow: hidden; } .dashboard-bento-card:hover { @@ -14578,7 +14576,9 @@ body.dependency-onboarding-active #dependency-setup-modal { .bento-workspace-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(260px, 100%), 1fr)); + grid-auto-rows: minmax(0, 1fr); gap: var(--space-md); + min-height: 0; } /* Workspace Cards */ @@ -14589,6 +14589,7 @@ body.dependency-onboarding-active #dependency-setup-modal { overflow: hidden; display: flex; flex-direction: column; + min-height: 0; transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s; } @@ -14619,7 +14620,9 @@ body.dependency-onboarding-active #dependency-setup-modal { .bento-workspace-card .workspace-card-body { padding: 4px 14px 10px 14px; - flex: 1; + flex: 1 1 0%; + min-height: 0; + overflow: hidden; } .bento-workspace-card .workspace-info h3 { @@ -14669,7 +14672,7 @@ body.dependency-onboarding-active #dependency-setup-modal { /* Running Services - bigger container */ .ports-dashboard-section { - flex: 1; + flex: 1 1 0%; min-height: 0; } @@ -14677,9 +14680,8 @@ body.dependency-onboarding-active #dependency-setup-modal { display: flex; flex-direction: column; gap: var(--space-sm); - flex: 1; + flex: 1 1 0%; min-height: 0; - overflow: hidden; } .port-dashboard-card { @@ -14692,6 +14694,9 @@ body.dependency-onboarding-active #dependency-setup-modal { border-left: 4px solid var(--border-color); cursor: pointer; transition: all 0.2s; + flex-shrink: 1; + min-height: 0; + overflow: hidden; } .port-dashboard-card:hover { @@ -14742,14 +14747,15 @@ body.dependency-onboarding-active #dependency-setup-modal { } .dashboard-bento-section { + flex: 1 1 0%; min-height: 0; - overflow: hidden; - flex: 1; + display: flex; + flex-direction: column; } .dashboard-bento-section .bento-workspace-grid { + flex: 1 1 0%; min-height: 0; - overflow: hidden; } @media (max-width: 1200px) { From 884c7712bd21c6c69ddf8f00240c5abb561d00f1 Mon Sep 17 00:00:00 2001 From: AnrokX <192667251+AnrokX@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:36:25 -0600 Subject: [PATCH 04/16] fix: simplify dashboard responsive layout - zoom to shrink on smaller screens Revert the overcomplicated flex/grid shrinking approach. Instead: - Restore original layout styles that work well at full size - Use CSS zoom to scale down the entire dashboard on smaller screens - 85% at <=1200px, 75% at <=900px, 60% at <=600px - No clipping, no hidden content, everything just gets smaller --- client/styles.css | 69 +++++++++++++++++++++-------------------------- 1 file changed, 30 insertions(+), 39 deletions(-) diff --git a/client/styles.css b/client/styles.css index 00b485db..2bd4c7e8 100644 --- a/client/styles.css +++ b/client/styles.css @@ -14486,7 +14486,7 @@ body.dependency-onboarding-active #dependency-setup-modal { color: #fff; gap: var(--space-sm); height: 100%; - overflow: hidden; + overflow: auto; } .dashboard-header-modern { @@ -14497,9 +14497,9 @@ body.dependency-onboarding-active #dependency-setup-modal { .dashboard-main-content { display: grid; - grid-template-columns: minmax(0, 1fr) minmax(200px, 420px); + grid-template-columns: minmax(0, 1fr) 420px; gap: var(--space-lg); - flex: 1 1 0%; + flex: 1; min-height: 0; } @@ -14507,14 +14507,18 @@ body.dependency-onboarding-active #dependency-setup-modal { display: flex; flex-direction: column; gap: var(--space-md); - min-height: 0; + height: 100%; + overflow-y: auto; + scrollbar-width: thin; } .dashboard-content-right { display: flex; flex-direction: column; gap: var(--space-md); - min-height: 0; + height: 100%; + overflow-y: auto; + scrollbar-width: thin; } /* Create Workspace Banner */ @@ -14527,9 +14531,8 @@ body.dependency-onboarding-active #dependency-setup-modal { border: 1px solid var(--border-color); border-radius: 10px; padding: 14px 16px; - flex-shrink: 1; + flex-shrink: 0; align-self: flex-start; - min-height: 0; } .dashboard-create-title { @@ -14562,8 +14565,6 @@ body.dependency-onboarding-active #dependency-setup-modal { padding: var(--space-md); box-shadow: var(--shadow-soft); transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s; - min-height: 0; - overflow: hidden; } .dashboard-bento-card:hover { @@ -14575,10 +14576,8 @@ body.dependency-onboarding-active #dependency-setup-modal { /* Workspace Grid */ .bento-workspace-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(min(260px, 100%), 1fr)); - grid-auto-rows: minmax(0, 1fr); + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: var(--space-md); - min-height: 0; } /* Workspace Cards */ @@ -14589,7 +14588,6 @@ body.dependency-onboarding-active #dependency-setup-modal { overflow: hidden; display: flex; flex-direction: column; - min-height: 0; transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s; } @@ -14620,9 +14618,7 @@ body.dependency-onboarding-active #dependency-setup-modal { .bento-workspace-card .workspace-card-body { padding: 4px 14px 10px 14px; - flex: 1 1 0%; - min-height: 0; - overflow: hidden; + flex: 1; } .bento-workspace-card .workspace-info h3 { @@ -14672,7 +14668,7 @@ body.dependency-onboarding-active #dependency-setup-modal { /* Running Services - bigger container */ .ports-dashboard-section { - flex: 1 1 0%; + flex: 1; min-height: 0; } @@ -14680,8 +14676,9 @@ body.dependency-onboarding-active #dependency-setup-modal { display: flex; flex-direction: column; gap: var(--space-sm); - flex: 1 1 0%; - min-height: 0; + flex: 1; + overflow-y: auto; + scrollbar-width: thin; } .port-dashboard-card { @@ -14694,9 +14691,6 @@ body.dependency-onboarding-active #dependency-setup-modal { border-left: 4px solid var(--border-color); cursor: pointer; transition: all 0.2s; - flex-shrink: 1; - min-height: 0; - overflow: hidden; } .port-dashboard-card:hover { @@ -14746,27 +14740,24 @@ body.dependency-onboarding-active #dependency-setup-modal { border: 1px solid var(--border-color); } -.dashboard-bento-section { - flex: 1 1 0%; - min-height: 0; - display: flex; - flex-direction: column; -} - -.dashboard-bento-section .bento-workspace-grid { - flex: 1 1 0%; - min-height: 0; -} - +/* Scale down dashboard on smaller screens */ @media (max-width: 1200px) { .dashboard-main-content { - grid-template-columns: minmax(0, 1fr) minmax(160px, 280px); + grid-template-columns: 1fr; + } + .dashboard-wrapper { + zoom: 0.85; } } -@media (max-width: 768px) { - .dashboard-main-content { - grid-template-columns: 1fr; - grid-template-rows: 1fr auto; +@media (max-width: 900px) { + .dashboard-wrapper { + zoom: 0.75; + } +} + +@media (max-width: 600px) { + .dashboard-wrapper { + zoom: 0.6; } } From 745c4685fe4bd9303ae4a238cde34a3eac2d032d Mon Sep 17 00:00:00 2001 From: AnrokX <192667251+AnrokX@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:50:57 -0600 Subject: [PATCH 05/16] fix: improve dashboard modal responsiveness --- client/styles.css | 86 +++++++++++++++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 29 deletions(-) diff --git a/client/styles.css b/client/styles.css index 2bd4c7e8..40a02580 100644 --- a/client/styles.css +++ b/client/styles.css @@ -7681,8 +7681,10 @@ body.dependency-onboarding-active #dependency-setup-modal { bottom: 0; background: var(--bg-primary); z-index: 1000; - padding: 2rem; + padding: clamp(0.75rem, 2vw, 2rem); + box-sizing: border-box; overflow-y: auto; + overflow-x: hidden; } .dashboard-topbar { @@ -14317,7 +14319,7 @@ body.dependency-onboarding-active #dependency-setup-modal { .bento-grid { display: grid; - grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + grid-template-columns: repeat(auto-fit, minmax(min(280px, 100%), 1fr)); gap: var(--space-md); } @@ -14478,15 +14480,16 @@ body.dependency-onboarding-active #dependency-setup-modal { /* Dashboard Layout */ .dashboard-wrapper { - max-width: none; - margin: 0; - padding: 0 var(--space-lg) var(--space-lg); + width: 100%; + max-width: 1520px; + margin: 0 auto; + padding: 0 0 var(--space-lg); + box-sizing: border-box; display: flex; flex-direction: column; color: #fff; - gap: var(--space-sm); - height: 100%; - overflow: auto; + gap: var(--space-md); + min-height: 100%; } .dashboard-header-modern { @@ -14497,28 +14500,23 @@ body.dependency-onboarding-active #dependency-setup-modal { .dashboard-main-content { display: grid; - grid-template-columns: minmax(0, 1fr) 420px; + grid-template-columns: minmax(0, 1fr) minmax(320px, 420px); gap: var(--space-lg); - flex: 1; - min-height: 0; + align-items: start; } .dashboard-content-left { display: flex; flex-direction: column; gap: var(--space-md); - height: 100%; - overflow-y: auto; - scrollbar-width: thin; + min-width: 0; } .dashboard-content-right { display: flex; flex-direction: column; gap: var(--space-md); - height: 100%; - overflow-y: auto; - scrollbar-width: thin; + min-width: 0; } /* Create Workspace Banner */ @@ -14576,7 +14574,7 @@ body.dependency-onboarding-active #dependency-setup-modal { /* Workspace Grid */ .bento-workspace-grid { display: grid; - grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(min(260px, 100%), 1fr)); gap: var(--space-md); } @@ -14676,9 +14674,6 @@ body.dependency-onboarding-active #dependency-setup-modal { display: flex; flex-direction: column; gap: var(--space-sm); - flex: 1; - overflow-y: auto; - scrollbar-width: thin; } .port-dashboard-card { @@ -14740,24 +14735,57 @@ body.dependency-onboarding-active #dependency-setup-modal { border: 1px solid var(--border-color); } -/* Scale down dashboard on smaller screens */ +/* Reflow dashboard on smaller screens instead of shrinking everything */ @media (max-width: 1200px) { .dashboard-main-content { - grid-template-columns: 1fr; - } - .dashboard-wrapper { - zoom: 0.85; + grid-template-columns: minmax(0, 1fr); } } @media (max-width: 900px) { - .dashboard-wrapper { - zoom: 0.75; + .dashboard-title-group { + align-items: flex-start; + } + + .dashboard-title-group h1 { + font-size: 1.4rem; + } + + .dashboard-topbar { + flex-wrap: wrap; + align-items: flex-start; } } @media (max-width: 600px) { .dashboard-wrapper { - zoom: 0.6; + padding-bottom: var(--space-md); + } + + .dashboard-title-group { + gap: var(--space-sm); + } + + .dashboard-title-icon { + width: 40px; + height: 40px; + } + + .dashboard-title-group h1 { + font-size: 1.25rem; + } + + .dashboard-title-group p { + font-size: 0.9rem; + } + + .bento-grid, + .bento-workspace-grid, + .workspace-grid { + grid-template-columns: minmax(0, 1fr); + } + + .dashboard-wrapper { + gap: var(--space-sm); } } From a0263fd4db876614496dff52ba5bc50b07087f04 Mon Sep 17 00:00:00 2001 From: AnrokX <192667251+AnrokX@users.noreply.github.com> Date: Thu, 12 Mar 2026 13:21:29 -0600 Subject: [PATCH 06/16] fix: make dashboard adapt without overflow --- client/dashboard.js | 177 +++++++++++++++++++++------ client/styles.css | 289 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 393 insertions(+), 73 deletions(-) diff --git a/client/dashboard.js b/client/dashboard.js index 5f21d6c5..7258796f 100644 --- a/client/dashboard.js +++ b/client/dashboard.js @@ -9,6 +9,9 @@ class Dashboard { this.quickLinks = null; this._escHandler = null; this._projectLaunchInFlight = false; + this._resizeHandler = null; + this._layoutMode = 'desktop'; + this.compactTab = 'workspaces'; } async show() { @@ -64,6 +67,16 @@ class Dashboard { document.removeEventListener('keydown', this._escHandler); this._escHandler = null; } + + if (this._resizeHandler) { + window.removeEventListener('resize', this._resizeHandler); + this._resizeHandler = null; + } + } + + getLayoutMode() { + if (typeof window === 'undefined') return 'desktop'; + return window.innerWidth <= 1100 ? 'compact' : 'desktop'; } render() { @@ -112,11 +125,18 @@ class Dashboard { const bTime = b.lastAccess ? new Date(b.lastAccess).getTime() : 0; return bTime - aTime; }; + const escapeHtml = (value) => String(value ?? '') + .replace(/&/g, '&') + .replace(//g, '>'); const activeWorkspaces = this.workspaces.filter(ws => this.isWorkspaceActive(ws)).sort(sortByLastAccess); const inactiveWorkspaces = this.workspaces.filter(ws => !this.isWorkspaceActive(ws)).sort(sortByLastAccess); const canReturnToWorkspaces = !!(this.orchestrator.tabManager?.tabs?.size); const visibility = this.orchestrator.getUiVisibilityConfig()?.dashboard || {}; const showProcessBanner = visibility.processBanner !== false; + const layoutMode = this.getLayoutMode(); + const isCompactLayout = layoutMode === 'compact'; + this._layoutMode = layoutMode; // SVG Icons replacing Emojis const svgIcon = (path, cls="dashboard-svg-icon") => `${path}`; @@ -254,18 +274,6 @@ class Dashboard { ` : ''; - const createSection = (visibility.createSection !== false) ? ` -
-
-
✨ Get Started
-
Set up a new workspace environment to begin building.
-
- -
- ` : ''; - const quickLinksSection = (visibility.quickLinks !== false) ? `