@@ -5,6 +5,7 @@ export function UpdaterNotifier() {
55 const [ version , setVersion ] = useState < string | null > ( null )
66 const [ progress , setProgress ] = useState < number > ( 0 )
77 const [ visible , setVisible ] = useState ( false )
8+ const [ closeHovered , setCloseHovered ] = useState ( false )
89
910 useEffect ( ( ) => {
1011 const removeStatus = ( window as any ) . electronAPI . onUpdateStatus ( ( newStatus : string , newVersion ?: string ) => {
@@ -42,30 +43,38 @@ export function UpdaterNotifier() {
4243 if ( ! visible ) return null
4344
4445 return (
45- < div className = "fixed bottom-6 right-6 z-[200] animate-in slide-in-from-right-10 duration-500" >
46- < div className = "bg-[#111] border border-white/10 rounded-2xl p-5 shadow-2xl flex flex-col gap-4 w-[320px] backdrop-blur-xl" >
47- < div className = "flex items-center gap-3" >
48- < div className = "bg-white/5 p-2.5 rounded-xl border border-white/10" >
46+ < div
47+ className = "animate-in slide-in-from-right-10 duration-500"
48+ style = { { position : 'fixed' , bottom : '24px' , right : '24px' , zIndex : 200 } }
49+ >
50+ < div style = { {
51+ background : '#111111' , border : '1px solid rgba(255,255,255,0.1)' , borderRadius : '16px' ,
52+ padding : '20px' , boxShadow : '0 25px 50px -12px rgba(0,0,0,0.5)' ,
53+ display : 'flex' , flexDirection : 'column' , gap : '16px' , width : '320px' ,
54+ backdropFilter : 'blur(24px)' , position : 'relative'
55+ } } >
56+ < div style = { { display : 'flex' , alignItems : 'center' , gap : '12px' } } >
57+ < div style = { { background : 'rgba(255,255,255,0.05)' , padding : '10px' , borderRadius : '12px' , border : '1px solid rgba(255,255,255,0.1)' , display : 'flex' , alignItems : 'center' , justifyContent : 'center' } } >
4958 { status === 'downloaded' ? (
50- < svg className = "w-5 h-5 text-emerald-400" fill = "none" viewBox = "0 0 24 24" stroke = "currentColor" strokeWidth = "2.5" >
59+ < svg style = { { width : '20px' , height : '20px' , color : '#34d399' } } fill = "none" viewBox = "0 0 24 24" stroke = "currentColor" strokeWidth = "2.5" >
5160 < path strokeLinecap = "round" strokeLinejoin = "round" d = "M5 13l4 4L19 7" />
5261 </ svg >
5362 ) : status === 'error' ? (
54- < svg className = "w-5 h-5 text-red-400" fill = "none" viewBox = "0 0 24 24" stroke = "currentColor" strokeWidth = "2.5" >
63+ < svg style = { { width : '20px' , height : '20px' , color : '#f87171' } } fill = "none" viewBox = "0 0 24 24" stroke = "currentColor" strokeWidth = "2.5" >
5564 < path strokeLinecap = "round" strokeLinejoin = "round" d = "M6 18L18 6M6 6l12 12" />
5665 </ svg >
5766 ) : (
58- < div className = "w-5 h-5 border-2 border-white/20 border-t-white rounded-full animate-spin" />
67+ < div className = "animate-spin" style = { { width : '20px' , height : '20px' , border : '2px solid rgba(255,255,255,0.2)' , borderTopColor : '#FFFFFF' , borderRadius : '50%' } } />
5968 ) }
6069 </ div >
61- < div >
62- < h4 className = "text-[ 14px] font-bold text-white mb-0.5" >
70+ < div style = { { display : 'flex' , flexDirection : 'column' , gap : '2px' } } >
71+ < h4 style = { { fontSize : ' 14px' , fontWeight : 700 , color : '#FFFFFF' , margin : 0 } } >
6372 { status === 'available' && 'Update Available' }
6473 { status === 'downloading' && 'Downloading Update' }
6574 { status === 'downloaded' && 'Update Ready' }
6675 { status === 'error' && 'Update Failed' }
6776 </ h4 >
68- < p className = "text-[ 12px] text-neutral-400 font-medium" >
77+ < p style = { { fontSize : ' 12px' , color : '#9CA3AF' , fontWeight : 500 , margin : 0 } } >
6978 { status === 'available' && `Version ${ version } is ready` }
7079 { status === 'downloading' && `Fetching software overhaul...` }
7180 { status === 'downloaded' && `Installing v${ version } now!` }
@@ -75,36 +84,37 @@ export function UpdaterNotifier() {
7584 </ div >
7685
7786 { ( status === 'downloading' || status === 'available' ) && (
78- < div className = "space-y-2" >
79- < div className = "h-1.5 w- 100 bg-white/5 rounded-full overflow- hidden" >
87+ < div style = { { display : 'flex' , flexDirection : 'column' , gap : '8px' } } >
88+ < div style = { { height : '6px' , width : ' 100%' , background : 'rgba(255,255,255,0.05)' , borderRadius : '9999px' , overflow : ' hidden' } } >
8089 < div
81- className = "h-full bg-white transition-all duration-300 ease-out"
82- style = { { width : `${ progress } %` } }
90+ style = { { height : '100%' , background : '#FFFFFF' , width : `${ progress } %` , transition : 'width 300ms ease-out' } }
8391 />
8492 </ div >
85- < div className = " flex justify -between items- center text-[ 10px] uppercase tracking-widest font-bold text-neutral-500" >
93+ < div style = { { display : ' flex' , justifyContent : 'space -between' , alignItems : ' center' , fontSize : ' 10px' , textTransform : ' uppercase' , letterSpacing : '0.1em' , fontWeight : 700 , color : '#737373' } } >
8694 < span > { progress } %</ span >
8795 < span > Secure Layer</ span >
8896 </ div >
8997 </ div >
9098 ) }
9199
92100 { status === 'downloaded' && (
93- < div className = "text-[ 10px] uppercase tracking-widest font-extrabold text-emerald-500/80 flex items- center gap-2" >
94- < span className = "flex h-1.5 w-1.5 rounded-full bg-emerald-500 animate-pulse" />
101+ < div style = { { fontSize : ' 10px' , textTransform : ' uppercase' , letterSpacing : '0.1em' , fontWeight : 800 , color : 'rgba(16, 185, 129, 0.8)' , display : ' flex' , alignItems : ' center' , gap : '8px' } } >
102+ < span className = "animate-pulse" style = { { display : ' flex' , height : '6px' , width : '6px' , borderRadius : '50%' , background : '#10b981' } } />
95103 Restarting to apply v{ version }
96104 </ div >
97105 ) }
98106
99107 < button
100108 onClick = { ( ) => setVisible ( false ) }
101- className = "absolute top-3 right-3 text-neutral-600 hover:text-white transition-colors"
109+ style = { { position : 'absolute' , top : '12px' , right : '12px' , color : closeHovered ? '#FFFFFF' : '#52525B' , background : 'transparent' , border : 'none' , cursor : 'pointer' , padding : '4px' , transition : 'color 150ms ease' } }
110+ onMouseEnter = { ( ) => setCloseHovered ( true ) }
111+ onMouseLeave = { ( ) => setCloseHovered ( false ) }
102112 >
103- < svg className = "w-4 h-4" fill = "none" viewBox = "0 0 24 24" stroke = "currentColor" >
113+ < svg style = { { width : '16px' , height : '16px' } } fill = "none" viewBox = "0 0 24 24" stroke = "currentColor" >
104114 < path strokeLinecap = "round" strokeLinejoin = "round" strokeWidth = "2" d = "M6 18L18 6M6 6l12 12" />
105115 </ svg >
106116 </ button >
107117 </ div >
108118 </ div >
109119 )
110- }
120+ }
0 commit comments