@@ -216,6 +216,7 @@ export function SovereignDashboard({ demoMode = false }: { demoMode?: boolean }
216216 const [ showWsPicker , setShowWsPicker ] = useState ( false ) ;
217217 const [ showScoreInfo , setShowScoreInfo ] = useState ( false ) ;
218218 const [ showDemoModal , setShowDemoModal ] = useState ( false ) ;
219+ const [ mobileSidebarOpen , setMobileSidebarOpen ] = useState ( false ) ;
219220
220221
221222 /** Load workspaces on mount */
@@ -1011,7 +1012,7 @@ Requirements:
10111012 }
10121013
10131014 return (
1014- < div className = "flex h-screen overflow-hidden text-th-text" style = { { background : "var(--bg-deep)" } } >
1015+ < div className = "flex h-[100dvh] overflow-hidden text-th-text" style = { { background : "var(--bg-deep)" } } >
10151016 { /* ── Rate limit modal ───────────────────────────────── */ }
10161017 { showDemoModal && < DemoLimitModal onClose = { ( ) => setShowDemoModal ( false ) } /> }
10171018
@@ -1021,18 +1022,44 @@ Requirements:
10211022 < div className = "absolute inset-0 bd-bg-grid opacity-100" />
10221023 </ div >
10231024
1024- { /* ── Fixed sidebar ──────────────────────────────────── */ }
1025- < aside className = "relative z-10 flex w-[252px] shrink-0 flex-col border-r border-[var(--border-subtle)] bg-[var(--bg-elevated)]" style = { { backdropFilter : "blur(12px)" } } >
1025+ { /* ── Mobile sidebar backdrop ────────────────────────── */ }
1026+ { mobileSidebarOpen && (
1027+ < div
1028+ className = "fixed inset-0 z-20 bg-black/60 md:hidden"
1029+ onClick = { ( ) => setMobileSidebarOpen ( false ) }
1030+ />
1031+ ) }
1032+
1033+ { /* ── Sidebar (drawer on mobile, fixed on desktop) ───── */ }
1034+ < aside
1035+ className = { `
1036+ fixed inset-y-0 left-0 z-30 flex w-[252px] shrink-0 flex-col border-r border-[var(--border-subtle)] bg-[var(--bg-elevated)]
1037+ transition-transform duration-300
1038+ ${ mobileSidebarOpen ? "translate-x-0" : "-translate-x-full" }
1039+ md:relative md:translate-x-0 md:z-10
1040+ ` }
1041+ style = { { backdropFilter : "blur(12px)" } }
1042+ >
10261043 { /* Brand / Workspace switcher */ }
10271044 < div className = "border-b border-[var(--border-subtle)] px-4 py-3" >
10281045 { /* Logo row */ }
10291046 < div className = "flex items-center gap-2 mb-3" >
10301047 < img src = { `${ BASE_PATH } /brightdata-logo.svg` } alt = "Bright Data" className = "h-5 w-auto" />
10311048 { demoMode && (
1032- < span className = "ml-auto px-1.5 py-0.5 rounded text-[10px] font-medium bg-white/8 text-[var(--text-tertiary)] border border-[var(--border-subtle)]" >
1049+ < span className = "px-1.5 py-0.5 rounded text-[10px] font-medium bg-white/8 text-[var(--text-tertiary)] border border-[var(--border-subtle)]" >
10331050 Demo
10341051 </ span >
10351052 ) }
1053+ { /* Close button — mobile only */ }
1054+ < button
1055+ onClick = { ( ) => setMobileSidebarOpen ( false ) }
1056+ className = "ml-auto flex md:hidden items-center justify-center w-7 h-7 rounded-md text-[var(--text-disabled)] hover:text-white hover:bg-white/8 transition-colors"
1057+ aria-label = "Close menu"
1058+ >
1059+ < svg width = "14" height = "14" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" strokeWidth = "2" strokeLinecap = "round" strokeLinejoin = "round" >
1060+ < line x1 = "18" y1 = "6" x2 = "6" y2 = "18" /> < line x1 = "6" y1 = "6" x2 = "18" y2 = "18" />
1061+ </ svg >
1062+ </ button >
10361063 </ div >
10371064 { demoMode ? (
10381065 < div className = "flex items-center gap-2 px-2 py-1.5 rounded-lg bg-[var(--accent-primary-muted)] border border-[var(--border-accent)]" >
@@ -1128,7 +1155,7 @@ Requirements:
11281155 ) }
11291156 < button
11301157 title = { tabMeta [ tab ] . tooltip }
1131- onClick = { ( ) => setActiveTab ( tab ) }
1158+ onClick = { ( ) => { setActiveTab ( tab ) ; setMobileSidebarOpen ( false ) ; } }
11321159 className = { `bd-nav-item mb-0.5 ${ active ? "active" : "" } ` }
11331160 >
11341161 < span className = { `shrink-0 bd-nav-icon ${ active ? "text-[var(--accent-primary)]" : "text-[var(--text-disabled)]" } ` } >
@@ -1177,10 +1204,23 @@ Requirements:
11771204 ) }
11781205
11791206 { /* Toolbar */ }
1180- < header className = "flex shrink-0 items-center gap-2 border-b border-[var(--border-subtle)] bg-[var(--bg-elevated)]/80 px-5 py-2.5" style = { { backdropFilter : "blur(12px)" } } >
1207+ < header className = "flex shrink-0 flex-wrap items-center gap-2 border-b border-[var(--border-subtle)] bg-[var(--bg-elevated)]/80 px-3 py-2.5 md:px-5" style = { { backdropFilter : "blur(12px)" } } >
1208+ { /* Hamburger — mobile only */ }
1209+ < button
1210+ onClick = { ( ) => setMobileSidebarOpen ( true ) }
1211+ className = "flex md:hidden items-center justify-center w-8 h-8 rounded-md text-[var(--text-tertiary)] hover:text-white hover:bg-white/8 transition-colors"
1212+ aria-label = "Open menu"
1213+ >
1214+ < svg width = "18" height = "18" viewBox = "0 0 24 24" fill = "none" stroke = "currentColor" strokeWidth = "2" strokeLinecap = "round" strokeLinejoin = "round" >
1215+ < line x1 = "3" y1 = "6" x2 = "21" y2 = "6" /> < line x1 = "3" y1 = "12" x2 = "21" y2 = "12" /> < line x1 = "3" y1 = "18" x2 = "21" y2 = "18" />
1216+ </ svg >
1217+ </ button >
1218+
11811219 < h1 className = "mr-auto text-sm font-semibold text-white" > { tabMeta [ activeTab ] . title } </ h1 >
1182- < span className = "text-[10px] font-semibold uppercase tracking-widest text-[var(--text-disabled)]" > Models</ span >
1220+
1221+ { /* Models row — wraps on small screens */ }
11831222 < div className = "flex flex-wrap items-center gap-1" >
1223+ < span className = "text-[10px] font-semibold uppercase tracking-widest text-[var(--text-disabled)] hidden sm:inline" > Models</ span >
11841224 { ALL_PROVIDERS . map ( ( p ) => {
11851225 const active = state . activeProviders . includes ( p ) ;
11861226 return (
@@ -1221,18 +1261,18 @@ Requirements:
12211261 </ div >
12221262
12231263 { /* Status chip */ }
1224- < span className = { `flex items-center gap-1.5 rounded-md px-2.5 py-1 text-[11px] transition-all ${
1264+ < span className = { `flex items-center gap-1.5 rounded-md px-2.5 py-1 text-[11px] transition-all max-w-[160px] sm:max-w-none truncate ${
12251265 busy
12261266 ? "bg-[var(--accent-primary-muted)] text-[var(--accent-primary)] border border-[var(--border-accent)]"
12271267 : "bg-white/5 text-[var(--text-tertiary)] border border-[var(--border-subtle)]"
12281268 } `} >
1229- { busy && < span className = "bd-dot-live" style = { { width : 6 , height : 6 } } /> }
1230- { message || "Ready" }
1269+ { busy && < span className = "bd-dot-live shrink-0 " style = { { width : 6 , height : 6 } } /> }
1270+ < span className = "truncate" > { message || "Ready" } </ span >
12311271 </ span >
12321272 </ header >
12331273
12341274 { /* Scrollable body */ }
1235- < main className = "flex-1 overflow-y-auto px-5 py-4" style = { { background : "transparent" } } >
1275+ < main className = "flex-1 overflow-y-auto px-3 py-3 md:px-5 md: py-4" style = { { background : "transparent" } } >
12361276 { /* Brand not configured warning */ }
12371277 { ! demoMode && state . runs . length > 0 && ! state . brand . brandName . trim ( ) && (
12381278 < div className = "mb-4 flex items-center gap-3 rounded-xl border border-[var(--accent-error-muted)] bg-[var(--accent-error-muted)] px-4 py-3 text-sm text-[var(--accent-error)]" >
@@ -1340,7 +1380,7 @@ Requirements:
13401380 ) }
13411381
13421382 { /* Active tab panel */ }
1343- < section className = "rounded-xl border border-[var(--border-default)] p-5" style = { { background : "var(--surface-card)" , backdropFilter : "blur(8px)" } } >
1383+ < section className = "rounded-xl border border-[var(--border-default)] p-3 md:p- 5" style = { { background : "var(--surface-card)" , backdropFilter : "blur(8px)" } } >
13441384 { renderActiveTab ( ) }
13451385 </ section >
13461386 < section className = "mt-3 rounded-lg border border-[var(--border-subtle)] px-4 py-3" style = { { background : "var(--surface-card)" } } >
0 commit comments