@@ -11,7 +11,6 @@ const styles: Record<string, CSSProperties> = {
1111 container : {
1212 display : 'flex' ,
1313 alignItems : 'center' ,
14- justifyContent : 'center' ,
1514 gap : '2rem' ,
1615 paddingLeft : 31 ,
1716 paddingRight : 31 ,
@@ -21,11 +20,18 @@ const styles: Record<string, CSSProperties> = {
2120 whiteSpace : 'pre-line' ,
2221 minWidth : '210px' ,
2322 } ,
23+ displayRow : {
24+ alignItems : 'center' ,
25+ justifyContent : 'center' ,
26+ display : 'flex' ,
27+ flex : '1 1 auto'
28+ } ,
2429 iconsRow : {
2530 display : 'flex' ,
2631 alignItems : 'center' ,
2732 justifyContent : 'center' ,
28- flexWrap : 'wrap' ,
33+ flexWrap : 'nowrap' ,
34+ flexShrink : 0
2935 } ,
3036 icon : {
3137 objectFit : 'contain' ,
@@ -51,10 +57,23 @@ const rows: Row[] = [
5157 { icon : '/files/icons/svelte.svg' , url : 'https://github.com/pubkey/rxdb/tree/master/examples/svelte' , label : 'Svelte' } ,
5258] ;
5359
60+
5461export function HeroRuntimes ( ) {
55- const [ hovered , setHovered ] = useState < number | null > ( null ) ;
62+ const [ hovered , setHovered ] = useState < string | null > ( null ) ;
63+
64+ const text = hovered !== null ? hovered : 'these Frameworks' ;
65+
66+
67+ const displayRows = ( ( ) => {
68+ const middle = Math . ceil ( rows . length / 2 ) ;
69+ const firstHalf = rows . slice ( 0 , middle ) ;
70+ const secondHalf = rows . slice ( middle ) ;
71+ return [
72+ firstHalf ,
73+ secondHalf
74+ ] ;
75+ } ) ( ) ;
5676
57- const text = hovered !== null ? rows [ hovered ] . label : 'these Frameworks' ;
5877
5978 return (
6079 < div style = { styles . container } className = "column-mobile padding-top-64-28" >
@@ -63,36 +82,52 @@ export function HeroRuntimes() {
6382 < br className = "hide-mobile" />
6483 < span > { text } </ span >
6584 </ div >
66- < div style = { styles . iconsRow } className = "gap-24-20" >
67- { rows . map ( ( item , i ) => {
68- const defaultFilter = item . invert
69- ? 'grayscale(100%) brightness(1.8) invert(1)'
70- : 'grayscale(100%) brightness(1.8)' ;
85+ < div style = { {
86+ flex : 'auto' ,
87+ display : 'flex' ,
88+ flexWrap : 'wrap' ,
89+ alignItems : 'center' ,
90+ // display: 'grid',
91+ // gridTemplateColumns: 'repeat(auto-fit, minmax(250px, 1fr))', /* two equal halves */
92+ // listStyle: 'none',
93+ } } className = "gap-24-20" >
94+ {
95+ displayRows . map ( displayRow => {
96+ return < div style = { styles . displayRow } > {
97+ < div style = { styles . iconsRow } className = "gap-24-20" >
98+ { displayRow . map ( ( item ) => {
99+ const defaultFilter = item . invert
100+ ? 'grayscale(100%) brightness(1.8) invert(1)'
101+ : 'grayscale(100%) brightness(1.8)' ;
71102
72- const hoverFilter = item . invert ? defaultFilter : 'none' ;
103+ const hoverFilter = item . invert ? defaultFilter : 'none' ;
73104
74- return (
75- < a
76- key = { i }
77- href = { item . url }
78- onMouseEnter = { ( ) => setHovered ( i ) }
79- onMouseLeave = { ( ) => setHovered ( null ) }
80- target = "_blank"
81- >
82- < img
83- className = "framework-icon"
84- src = { item . icon }
85- loading = "lazy"
86- alt = { item . label }
87- style = { {
88- ...styles . icon ,
89- filter : hovered === i ? hoverFilter : defaultFilter ,
90- opacity : hovered === i ? 1 : styles . icon . opacity ,
91- } }
92- />
93- </ a >
94- ) ;
95- } ) }
105+ return (
106+ < a
107+ key = { item . label }
108+ href = { item . url }
109+ onMouseEnter = { ( ) => setHovered ( item . label ) }
110+ onMouseLeave = { ( ) => setHovered ( null ) }
111+ target = "_blank"
112+ >
113+ < img
114+ className = "framework-icon"
115+ src = { item . icon }
116+ loading = "lazy"
117+ alt = { item . label }
118+ style = { {
119+ ...styles . icon ,
120+ filter : hovered === item . label ? hoverFilter : defaultFilter ,
121+ opacity : hovered === item . label ? 1 : styles . icon . opacity ,
122+ } }
123+ />
124+ </ a >
125+ ) ;
126+ } ) }
127+ </ div >
128+ } </ div >
129+ } )
130+ }
96131 </ div >
97132 </ div >
98133 ) ;
0 commit comments