@@ -103,12 +103,9 @@ export default function InstallationDetail() {
103103 </ div >
104104 ) }
105105
106- { /* Scrollable content */ }
107- < div className = "flex-1 min-h-0 overflow-y-auto" >
108-
109106 { /* Error */ }
110107 { error && (
111- < div className = "mb-4 px-4 py-3 bg-danger/8 border border-danger/20 rounded-card text-danger text-sm" >
108+ < div className = "shrink-0 mb-4 px-4 py-3 bg-danger/8 border border-danger/20 rounded-card text-danger text-sm" >
112109 { error }
113110 </ div >
114111 ) }
@@ -129,24 +126,24 @@ export default function InstallationDetail() {
129126 </ div >
130127 ) }
131128
132- { /* Session table */ }
129+ { /* Session table — sticky header, scrollable rows */ }
133130 { ! loading && sessions . length > 0 && (
134- < >
135- < div className = "border border-rule-str rounded-card overflow-hidden" >
136- { /* Header row */ }
137- < div
138- className = "grid bg-bg2 px-4 py-2.5 font-mono text-[10px] text-dim tracking-[0.18em] uppercase border-b border-rule"
139- style = { { gridTemplateColumns : '36px 1fr 140px 110px 80px 80px' } }
140- >
141- < span > # </ span >
142- < span > REPO / PR </ span >
143- < span > SKILL </ span >
144- < span > STATUS </ span >
145- < span className = "text-right" > DURATION </ span >
146- < span className = "text-right" > RAN </ span >
147- </ div >
148-
149- { /* Data rows */ }
131+ < div className = "flex-1 min-h-0 flex flex-col border border-rule-str rounded-card overflow-hidden" >
132+ { /* Table header (sticky) */ }
133+ < div
134+ className = "shrink-0 grid bg-bg2 px-4 py-2.5 font-mono text-[10px] text-dim tracking-[0.18em] uppercase border-b border-rule"
135+ style = { { gridTemplateColumns : '36px 1fr 140px 110px 80px 80px' } }
136+ >
137+ < span > # </ span >
138+ < span > REPO / PR </ span >
139+ < span > SKILL </ span >
140+ < span > STATUS </ span >
141+ < span className = "text-right" > DURATION </ span >
142+ < span className = "text-right" > RAN </ span >
143+ </ div >
144+
145+ { /* Scrollable rows */ }
146+ < div className = "flex-1 min-h-0 overflow-y-auto" >
150147 { sessions . map ( ( session , idx ) => {
151148 const statusColor =
152149 session . status === 'completed' ? 'ok' as const :
@@ -181,35 +178,33 @@ export default function InstallationDetail() {
181178 )
182179 } ) }
183180 </ div >
184-
185- { /* Pagination */ }
186- { totalPages > 1 && (
187- < div className = "flex items-center justify-center gap-4 mt-6" >
188- < Button
189- variant = "secondary"
190- onClick = { ( ) => setPage ( ( p ) => Math . max ( 1 , p - 1 ) ) }
191- disabled = { page <= 1 }
192- className = "text-xs"
193- >
194- Previous
195- </ Button >
196- < span className = "text-dim text-xs font-mono" >
197- Page { page } of { totalPages }
198- </ span >
199- < Button
200- variant = "secondary"
201- onClick = { ( ) => setPage ( ( p ) => Math . min ( totalPages , p + 1 ) ) }
202- disabled = { page >= totalPages }
203- className = "text-xs"
204- >
205- Next
206- </ Button >
207- </ div >
208- ) }
209- </ >
181+ </ div >
210182 ) }
211183
212- </ div > { /* end scrollable */ }
184+ { /* Pagination (always outside scroll) */ }
185+ { ! loading && totalPages > 1 && (
186+ < div className = "shrink-0 flex items-center justify-center gap-4 py-4" >
187+ < Button
188+ variant = "secondary"
189+ onClick = { ( ) => setPage ( ( p ) => Math . max ( 1 , p - 1 ) ) }
190+ disabled = { page <= 1 }
191+ className = "text-xs"
192+ >
193+ Previous
194+ </ Button >
195+ < span className = "text-dim text-xs font-mono" >
196+ Page { page } of { totalPages }
197+ </ span >
198+ < Button
199+ variant = "secondary"
200+ onClick = { ( ) => setPage ( ( p ) => Math . min ( totalPages , p + 1 ) ) }
201+ disabled = { page >= totalPages }
202+ className = "text-xs"
203+ >
204+ Next
205+ </ Button >
206+ </ div >
207+ ) }
213208 </ div >
214209 )
215210}
0 commit comments