@@ -429,6 +429,12 @@ export default function Graph() {
429429
430430 // ── Load data ────────────────────────────────────────────────────────────────
431431
432+ // Lock body scroll so the graph page doesn't overflow the viewport
433+ useEffect ( ( ) => {
434+ document . body . style . overflow = 'hidden'
435+ return ( ) => { document . body . style . overflow = '' }
436+ } , [ ] )
437+
432438 useEffect ( ( ) => {
433439 // 250ms: ensures the navbar CSS transition (duration-200) fully completes.
434440 const timer = setTimeout ( ( ) => {
@@ -944,7 +950,7 @@ export default function Graph() {
944950
945951
946952 { /* Selected node panel */ }
947- < div className = "px-3 sm:px-4 py-2 sm:py-3 flex-1 overflow-y-auto " >
953+ < div className = "px-3 sm:px-4 py-2 sm:py-3" >
948954 < div className = "text-[0.6rem] sm:text-xs font-bold uppercase tracking-wider mb-1.5 sm:mb-2" style = { { color : C . muted } } >
949955 Selected Node
950956 </ div >
@@ -1020,7 +1026,7 @@ export default function Graph() {
10201026 < div className = "text-[0.6rem] sm:text-xs uppercase tracking-wider mb-1" style = { { color : C . muted } } >
10211027 Connected ({ selectedNode . connectedNodes . length } )
10221028 </ div >
1023- < div className = "flex flex-col gap-0.5 max-h-36 sm:max-h-48 overflow-y-auto " >
1029+ < div className = "flex flex-col gap-0.5" >
10241030 { selectedNode . connectedNodes . map ( ( n , i ) => {
10251031 const meta = TYPE_META [ n . type ] ?? TYPE_META . skill
10261032 return (
@@ -1044,19 +1050,12 @@ export default function Graph() {
10441050 ) }
10451051 </ div >
10461052
1047- { /* Footer hint — desktop only */ }
1048- < div
1049- className = "hidden sm:block px-4 py-2 flex-shrink-0 text-xs text-center"
1050- style = { { borderTop : `1px solid ${ C . border } ` , color : C . border2 } }
1051- >
1052- scroll · pan · zoom · click · drag
1053- </ div >
10541053 </ >
10551054 )
10561055
10571056 return (
10581057 < div
1059- className = "flex flex-col-reverse sm:flex-row overflow-hidden font-mono h-full max-w-[100vw]"
1058+ className = "flex flex-col-reverse sm:flex-row overflow-hidden font-mono h-screen max-w-[100vw]"
10601059 style = { { background : C . bg } }
10611060 >
10621061 < SEO
@@ -1066,7 +1065,7 @@ export default function Graph() {
10661065 />
10671066 { /* ── Sidebar — desktop: left panel (collapsible); mobile: bottom drawer ── */ }
10681067 < aside
1069- className = { `flex flex-col flex-shrink-0 w-full ${ sidebarOpen ? 'sm:w-[280px] sm:min-w-[280px] sm:max-w-[280px]' : 'sm:w-[21px] sm:min-w-[21px] sm:max-w-[21px]' } ` }
1068+ className = { `graph-sidebar flex flex-col flex-shrink-0 w-full ${ sidebarOpen ? 'sm:w-[280px] sm:min-w-[280px] sm:max-w-[280px]' : 'sm:w-[21px] sm:min-w-[21px] sm:max-w-[21px]' } ` }
10701069 style = { {
10711070 background : C . surface ,
10721071 borderRight : sidebarOpen ? `1px solid ${ C . border } ` : 'none' ,
@@ -1099,8 +1098,8 @@ export default function Graph() {
10991098
11001099 { /* ── Desktop header with collapse toggle (hidden on mobile) ── */ }
11011100 < div
1102- className = "hidden sm:block relative flex-shrink-0"
1103- style = { { borderBottom : `1px solid ${ C . border } ` } }
1101+ className = "hidden sm:block relative flex-shrink-0 sticky top-0 z-10 "
1102+ style = { { borderBottom : `1px solid ${ C . border } ` , background : C . surface } }
11041103 >
11051104 { /* Title text — pr-7 keeps text clear of the absolute button */ }
11061105 { sidebarOpen && (
0 commit comments