@@ -16,89 +16,78 @@ type Meta = {
16
16
fileSize ?: string ;
17
17
} ;
18
18
19
- function EnvironmentPanel ( {
20
- sun,
21
- fog,
22
- } : {
23
- sun : Parameters < typeof SunParams > [ 0 ] ;
24
- fog : Parameters < typeof FogParams > [ 0 ] ;
25
- } ) {
26
- return (
27
- < div
28
- className = "
29
- grid gap-10
30
- lg:grid-cols-2 /* ≥1024 px: two columns */
31
- lg:gap-x-12
32
- "
33
- >
34
- < SunParams { ...sun } />
35
- < FogParams { ...fog } />
36
- </ div >
37
- ) ;
19
+ function useModalBehaviour ( onClose : ( ) => void ) {
20
+ useEffect ( ( ) => {
21
+ const prev = document . documentElement . style . overflow ;
22
+ document . documentElement . style . overflow = 'hidden' ;
23
+ return ( ) => ( document . documentElement . style . overflow = prev ) ;
24
+ } , [ ] ) ;
25
+
26
+ useEffect ( ( ) => {
27
+ const h = ( e : KeyboardEvent ) => e . key === 'Escape' && onClose ( ) ;
28
+ window . addEventListener ( 'keydown' , h ) ;
29
+ return ( ) => window . removeEventListener ( 'keydown' , h ) ;
30
+ } , [ onClose ] ) ;
38
31
}
39
32
40
33
export default function Modal ( { slug, onClose } : { slug : string ; onClose : ( ) => void } ) {
41
34
const [ meta , setMeta ] = useState < Meta | null > ( null ) ;
42
35
const imgBase = `/Source_Skyboxes_NextJS/skyboxes/${ slug } /images` ;
43
-
36
+
44
37
useEffect ( ( ) => { fetch ( `/Source_Skyboxes_NextJS/data/${ slug } .json` ) . then ( r => r . ok ?r . json ( ) :null ) . then ( setMeta ) ; } , [ slug ] ) ;
45
- useEffect ( ( ) => { const o = document . documentElement . style . overflow ; document . documentElement . style . overflow = 'hidden' ; return ( ) => { document . documentElement . style . overflow = o } } , [ ] ) ;
46
- useEffect ( ( ) => { const h = ( e :KeyboardEvent ) => e . key === 'Escape' && onClose ( ) ; window . addEventListener ( 'keydown' , h ) ; return ( ) => window . removeEventListener ( 'keydown' , h ) } , [ onClose ] ) ;
38
+ useModalBehaviour ( onClose ) ;
47
39
48
40
return (
49
41
< div onClick = { onClose } className = "fixed inset-0 z-50 bg-black/75 backdrop-blur-sm flex items-center justify-center p-4" >
50
42
< article onClick = { e => e . stopPropagation ( ) } className = "w-full max-w-[90vw] sm:max-w-xl md:max-w-2xl lg:max-w-3xl xl:max-w-4xl max-h-[70vh] overflow-y-auto overscroll-contain bg-neutral-900 rounded-lg shadow-xl ring-1 ring-neutral-700/60" >
51
- < div className = "m-4" >
52
-
53
43
{ /* Header */ }
54
- < div className = "flex items-center justify-between" >
44
+ < div className = "flex items-center justify-between p-4 " >
55
45
56
46
{ /* Title */ }
57
- < div >
58
- < h2 className = "text-xl font-bold" > { slug } </ h2 >
47
+ < div className = "flex flex-col" >
48
+ < h2 className = "text-2xl font-bold" > { slug } </ h2 >
49
+ { /* Author */ }
59
50
< span className = "text-sm text-neutral-400" > By { meta ?. author } </ span >
60
51
</ div >
61
52
62
53
{ /* Download Button */ }
63
- < div className = "flex items-center " >
54
+ < div className = "flex" >
64
55
< DownloadButton
65
56
href = { `/Source_Skyboxes_NextJS/skyboxes/${ slug } /download/${ slug } .7z` }
66
57
download
67
- //format=".7z"
68
58
size = { meta ?. fileSize }
69
59
/>
70
60
</ div >
71
61
</ div >
72
62
73
63
{ /* Preview */ }
74
- < div className = "relative w-full aspect-[16/9] mb-6 mt-2 " >
75
- < img src = { `${ imgBase } /previews/1.webp` } alt = "" className = "absolute inset-0 w-full h-full object-cover rounded-md" />
64
+ < div className = "p-4 relative w-full aspect-[16/9]" >
65
+ < img src = { `${ imgBase } /previews/1.webp` } alt = { ` ${ slug } preview` } className = "w-full h-full object-cover rounded-md" />
76
66
</ div >
77
67
78
68
{ /* Tabs */ }
79
- < div className = "lg:grid lg:grid-cols-[1fr_auto]" >
69
+ < div className = "lg:grid lg:grid-cols-[1fr_auto] p-4 " >
80
70
< Tabs items = { [
81
71
{
82
72
value : 'environment' ,
83
73
label : 'Environment Parameters' ,
84
74
content : (
85
75
< div
86
- className = "
87
- grid gap-10
88
- lg:grid-cols-2 lg:gap-x-12
89
- items-start /* top-align all children */
90
- "
91
- >
92
- < SunParams { ...meta ?. sunParameters } />
93
- < FogParams { ...meta ?. fogParameters } />
94
- </ div >
95
- ) ,
96
- } ,
97
- { value : 'community-maps' , label : 'Community Maps' , content : < MapList maps = { meta ?. steamMaps } /> } ,
98
- ] } />
76
+ className = "
77
+ grid gap-10
78
+ lg:grid-cols-2 lg:gap-x-12
79
+ items-start
80
+ "
81
+ >
82
+ < SunParams { ...meta ?. sunParameters } />
83
+ < FogParams { ...meta ?. fogParameters } />
84
+ </ div >
85
+ ) ,
86
+ } ,
87
+ { value : 'community-maps' , label : 'Community Maps' , content : < MapList maps = { meta ?. steamMaps } /> } ,
88
+ ] } />
99
89
</ div >
100
-
101
- </ div >
90
+
102
91
</ article >
103
92
</ div >
104
93
) ;
0 commit comments