@@ -1170,6 +1170,7 @@ function Widget({ label, value, sub, tint, theme }) {
11701170function CitiesScreen ( { cities, activeIdx, citySearch, setCitySearch, citySearching, citySearchError, onSelectCity, onSearch, onDeleteCity, closing } ) {
11711171 const [ suggestions , setSuggestions ] = useState ( [ ] ) ;
11721172 const [ suggestionsLoading , setSuggestionsLoading ] = useState ( false ) ;
1173+ const [ showAbout , setShowAbout ] = useState ( false ) ;
11731174 const searchAreaRef = useRef ( null ) ;
11741175
11751176 // ---- Swipe-to-delete state ----
@@ -1284,7 +1285,10 @@ function CitiesScreen({ cities, activeIdx, citySearch, setCitySearch, citySearch
12841285
12851286 { /* Header */ }
12861287 < div style = { { padding : "calc(env(safe-area-inset-top, 0px) + 20px) 20px 24px" , display : "flex" , justifyContent : "flex-start" , alignItems : "flex-end" } } >
1287- < div style = { { fontFamily : IMPACT_STACK , fontSize : "34px" , letterSpacing : "-0.5px" , color : "#111" } } > F*eather</ div >
1288+ < div
1289+ onClick = { ( ) => setShowAbout ( true ) }
1290+ style = { { fontFamily : IMPACT_STACK , fontSize : "34px" , letterSpacing : "-0.5px" , color : "#111" , cursor : "pointer" } }
1291+ > F*eather</ div >
12881292 </ div >
12891293
12901294 { /* City cards */ }
@@ -1433,6 +1437,83 @@ function CitiesScreen({ cities, activeIdx, citySearch, setCitySearch, citySearch
14331437 </ div >
14341438 </ div >
14351439 </ div >
1440+
1441+ { /* ---- About modal ---- */ }
1442+ { showAbout && (
1443+ < div
1444+ onClick = { ( ) => setShowAbout ( false ) }
1445+ style = { {
1446+ position : "fixed" , inset : 0 , zIndex : 100 ,
1447+ background : "rgba(0,0,0,0.28)" ,
1448+ backdropFilter : "blur(6px)" , WebkitBackdropFilter : "blur(6px)" ,
1449+ display : "flex" , alignItems : "center" , justifyContent : "center" ,
1450+ padding : "24px" ,
1451+ animation : "featherFadeIn 200ms ease both" ,
1452+ } }
1453+ >
1454+ < div
1455+ onClick = { e => e . stopPropagation ( ) }
1456+ style = { {
1457+ width : "100%" , maxWidth : "360px" ,
1458+ background : "rgba(255,255,255,0.88)" ,
1459+ backdropFilter : "blur(40px) saturate(200%)" ,
1460+ WebkitBackdropFilter : "blur(40px) saturate(200%)" ,
1461+ border : "1px solid rgba(255,255,255,0.7)" ,
1462+ borderRadius : "24px" ,
1463+ padding : "32px 28px 28px" ,
1464+ boxShadow : "0 24px 64px rgba(0,0,0,0.16), 0 4px 16px rgba(0,0,0,0.08)" ,
1465+ display : "flex" , flexDirection : "column" , gap : "0" ,
1466+ } }
1467+ >
1468+ { /* Title */ }
1469+ < div style = { { fontFamily : IMPACT_STACK , fontSize : "48px" , letterSpacing : "-1px" , color : "#111" , lineHeight : 1 , marginBottom : "14px" } } >
1470+ F*eather
1471+ </ div >
1472+
1473+ { /* Subtitle */ }
1474+ < div style = { { fontFamily : SFPRO_STACK , fontSize : "15px" , color : "rgba(0,0,0,0.60)" , lineHeight : 1.55 , marginBottom : "28px" } } >
1475+ A brutally honest weather app for the days when you just need the f*cking weather.
1476+ </ div >
1477+
1478+ { /* Divider */ }
1479+ < div style = { { height : "1px" , background : "rgba(0,0,0,0.08)" , marginBottom : "20px" } } />
1480+
1481+ { /* Made by */ }
1482+ < div style = { { display : "flex" , alignItems : "center" , justifyContent : "space-between" } } >
1483+ < div >
1484+ < div style = { { fontFamily : SFPRO_STACK , fontSize : "11px" , fontWeight : 600 , textTransform : "uppercase" , letterSpacing : "0.7px" , color : "rgba(0,0,0,0.38)" , marginBottom : "3px" } } >
1485+ Made by
1486+ </ div >
1487+ < div style = { { fontFamily : SFPRO_STACK , fontSize : "16px" , fontWeight : 600 , color : "#111" , letterSpacing : "-0.2px" } } >
1488+ Saim Alshafi
1489+ </ div >
1490+ </ div >
1491+ { /* GitHub link */ }
1492+ < a
1493+ href = "https://github.com/saimalshafi"
1494+ target = "_blank"
1495+ rel = "noopener noreferrer"
1496+ onClick = { e => e . stopPropagation ( ) }
1497+ style = { {
1498+ display : "flex" , alignItems : "center" , justifyContent : "center" ,
1499+ width : "44px" , height : "44px" , borderRadius : "12px" ,
1500+ background : "rgba(0,0,0,0.06)" ,
1501+ border : "1px solid rgba(0,0,0,0.08)" ,
1502+ color : "#111" , textDecoration : "none" ,
1503+ transition : "background 150ms ease" ,
1504+ flexShrink : 0 ,
1505+ } }
1506+ onPointerEnter = { e => e . currentTarget . style . background = "rgba(0,0,0,0.11)" }
1507+ onPointerLeave = { e => e . currentTarget . style . background = "rgba(0,0,0,0.06)" }
1508+ >
1509+ < svg width = "20" height = "20" viewBox = "0 0 24 24" fill = "currentColor" aria-label = "GitHub" >
1510+ < path d = "M12 0C5.37 0 0 5.37 0 12c0 5.31 3.435 9.795 8.205 11.385.6.105.825-.255.825-.57 0-.285-.015-1.23-.015-2.235-3.015.555-3.795-.735-4.035-1.41-.135-.345-.72-1.41-1.23-1.695-.42-.225-1.02-.78-.015-.795.945-.015 1.62.87 1.845 1.23 1.08 1.815 2.805 1.305 3.495.99.105-.78.42-1.305.765-1.605-2.67-.3-5.46-1.335-5.46-5.925 0-1.305.465-2.385 1.23-3.225-.12-.3-.54-1.53.12-3.18 0 0 1.005-.315 3.3 1.23.96-.27 1.98-.405 3-.405s2.04.135 3 .405c2.295-1.56 3.3-1.23 3.3-1.23.66 1.65.24 2.88.12 3.18.765.84 1.23 1.905 1.23 3.225 0 4.605-2.805 5.625-5.475 5.925.435.375.81 1.095.81 2.22 0 1.605-.015 2.895-.015 3.3 0 .315.225.69.825.57A12.02 12.02 0 0 0 24 12c0-6.63-5.37-12-12-12z" />
1511+ </ svg >
1512+ </ a >
1513+ </ div >
1514+ </ div >
1515+ </ div >
1516+ ) }
14361517 </ div >
14371518 ) ;
14381519}
0 commit comments