@@ -69,58 +69,94 @@ export default function Home() {
6969 }
7070
7171 return (
72- < div class = "mx-auto mt-55 w-full md:w-auto px-4" >
73- < Logo class = "md:w-xl opacity-12" />
74- < Button
75- size = "large"
76- variant = "ghost"
77- class = "mt-4 mx-auto text-14-regular text-text-weak"
78- onClick = { ( ) => dialog . show ( ( ) => < DialogSelectServer /> ) }
72+ < div class = "mx-auto w-full max-w-lg px-6 flex flex-col items-center" style = "padding-top: min(20vh, 160px)" >
73+ { /* Logo with entrance animation */ }
74+ < div
75+ class = "opacity-0"
76+ style = "animation: fadeUp 0.6s cubic-bezier(0.16, 1, 0.3, 1) 0.05s forwards"
7977 >
80- < div
81- classList = { {
82- "size-2 rounded-full" : true ,
83- [ serverDotClass ( ) ] : true ,
84- } }
85- />
86- { server . name }
87- </ Button >
78+ < Logo class = "w-40 md:w-56 opacity-20" />
79+ </ div >
80+
81+ { /* Server status badge */ }
82+ < div
83+ class = "opacity-0"
84+ style = "animation: fadeUp 0.5s cubic-bezier(0.16, 1, 0.3, 1) 0.15s forwards"
85+ >
86+ < Button
87+ size = "large"
88+ variant = "ghost"
89+ class = "mt-4 mx-auto text-14-regular text-text-weak"
90+ onClick = { ( ) => dialog . show ( ( ) => < DialogSelectServer /> ) }
91+ >
92+ < div
93+ classList = { {
94+ "size-2 rounded-full" : true ,
95+ [ serverDotClass ( ) ] : true ,
96+ } }
97+ />
98+ { server . name }
99+ </ Button >
100+ </ div >
101+
88102 < Switch >
89103 < Match when = { sync . data . project . length > 0 } >
90- < div class = "mt-20 w-full flex flex-col gap-4" >
91- < div class = "flex gap-2 items-center justify-between pl-3" >
92- < div class = "text-14-medium text-text-strong" > { language . t ( "home.recentProjects" ) } </ div >
104+ < div
105+ class = "mt-12 w-full flex flex-col gap-3 opacity-0"
106+ style = "animation: fadeUp 0.5s cubic-bezier(0.16, 1, 0.3, 1) 0.25s forwards"
107+ >
108+ < div class = "flex gap-2 items-center justify-between pl-1 mb-1" >
109+ < div class = "text-12-medium text-text-weak uppercase tracking-wider" >
110+ { language . t ( "home.recentProjects" ) }
111+ </ div >
93112 < Button icon = "folder-add-left" size = "normal" class = "pl-2 pr-3" onClick = { chooseProject } >
94113 { language . t ( "command.project.open" ) }
95114 </ Button >
96115 </ div >
97- < ul class = "flex flex-col gap-2" >
116+ < ul
117+ class = "flex flex-col rounded-lg overflow-hidden"
118+ style = "border: 1px solid var(--border-weaker-base); background: var(--surface-base)"
119+ >
98120 < For each = { recent ( ) } >
99- { ( project ) => (
100- < Button
101- size = "large"
102- variant = "ghost"
103- class = "text-14-mono text-left justify-between px-3"
104- onClick = { ( ) => openProject ( project . worktree ) }
121+ { ( project , i ) => (
122+ < li
123+ class = "opacity-0"
124+ style = { `animation: fadeUp 0.4s cubic-bezier(0.16, 1, 0.3, 1) ${ 0.3 + i ( ) * 0.05 } s forwards` }
105125 >
106- { project . worktree . replace ( homedir ( ) , "~" ) }
107- < div class = "text-14-regular text-text-weak" >
108- { DateTime . fromMillis ( project . time . updated ?? project . time . created ) . toRelative ( ) }
109- </ div >
110- </ Button >
126+ < Button
127+ size = "large"
128+ variant = "ghost"
129+ class = "text-14-mono text-left justify-between px-4 py-2.5 w-full rounded-none"
130+ style = { i ( ) < recent ( ) . length - 1 ? "border-bottom: 1px solid var(--border-weaker-base)" : "" }
131+ onClick = { ( ) => openProject ( project . worktree ) }
132+ >
133+ < span class = "truncate" > { project . worktree . replace ( homedir ( ) , "~" ) } </ span >
134+ < span class = "text-12-regular text-text-weaker flex-shrink-0 ml-4" >
135+ { DateTime . fromMillis ( project . time . updated ?? project . time . created ) . toRelative ( ) }
136+ </ span >
137+ </ Button >
138+ </ li >
111139 ) }
112140 </ For >
113141 </ ul >
114142 </ div >
115143 </ Match >
116144 < Match when = { true } >
117- < div class = "mt-30 mx-auto flex flex-col items-center gap-3" >
118- < Icon name = "folder-add-left" size = "large" />
145+ < div
146+ class = "mt-20 mx-auto flex flex-col items-center gap-4 opacity-0"
147+ style = "animation: fadeUp 0.5s cubic-bezier(0.16, 1, 0.3, 1) 0.25s forwards"
148+ >
149+ < div
150+ class = "w-16 h-16 rounded-2xl flex items-center justify-center"
151+ style = "background: var(--surface-base); border: 1px solid var(--border-weaker-base)"
152+ >
153+ < Icon name = "folder-add-left" size = "large" />
154+ </ div >
119155 < div class = "flex flex-col gap-1 items-center justify-center" >
120156 < div class = "text-14-medium text-text-strong" > { language . t ( "home.empty.title" ) } </ div >
121157 < div class = "text-12-regular text-text-weak" > { language . t ( "home.empty.description" ) } </ div >
122158 </ div >
123- < Button class = "px-3 mt-1" onClick = { chooseProject } >
159+ < Button class = "px-4 mt-1" onClick = { chooseProject } >
124160 { language . t ( "command.project.open" ) }
125161 </ Button >
126162 </ div >
0 commit comments