@@ -192,61 +192,82 @@ export default function NotesPage() {
192192 < p className = "text-xs uppercase tracking-wide text-slate-500" > 笔记分类</ p >
193193 < p className = "text-base font-semibold text-slate-900 dark:text-slate-100" > 文件夹</ p >
194194 </ div >
195- < span className = "rounded-lg border border-slate-200 px-2.5 py-1 text-[11px] font-medium text-slate-600 dark:border-slate-600 dark:text-slate-300" >
196- 共 { folderGroups . length }
197- </ span >
195+ < Link
196+ href = "/notes/new"
197+ className = "rounded-lg border border-slate-200 px-2.5 py-1 text-xs font-medium text-slate-600 transition hover:bg-slate-50 dark:border-slate-600 dark:text-slate-300 dark:hover:bg-slate-700/60"
198+ >
199+ + 新建
200+ </ Link >
198201 </ div >
202+ < p className = "mt-1 text-[11px] text-slate-400 dark:text-slate-500" >
203+ 共 { folderGroups . length } 个分类,支持展开查看论文及其关联笔记
204+ </ p >
199205 { loading ? (
200206 < div className = "py-8 text-center text-sm text-slate-500 dark:text-slate-400" > 加载中...</ div >
201207 ) : ( ! folderGroups . some ( ( group ) => group . papers . length > 0 ) && unlinkedNotes . length === 0 ) ? (
202208 < div className = "py-8 text-center text-sm text-slate-500 dark:text-slate-400" > 还没有笔记,先创建一条吧。</ div >
203209 ) : (
204- < div className = "space-y-3 " >
210+ < div className = "mt-4 space-y-2 " >
205211 { folderGroups . map ( ( { folder, papers : folderPapers , noteCount } ) => {
206212 const folderKey = `folder-${ folder . id } ` ;
207213 const isFolderOpen = expandedGroups [ folderKey ] ?? true ;
214+ const folderSummary = `${ folderPapers . length } 论文 / ${ noteCount } 笔记` ;
208215 return (
209- < div
210- key = { folderKey }
211- className = "overflow-hidden rounded-xl border border-slate-200 bg-white/80 shadow-sm dark:border-slate-700 dark:bg-slate-800/70 dark:shadow-none"
212- >
216+ < div key = { folderKey } className = "space-y-2" >
213217 < button
214218 type = "button"
215219 onClick = { ( ) => toggleGroup ( folderKey ) }
216- className = "flex w-full items-center justify-between px-3 py-2 text-left text-sm font-medium text-slate-800 transition hover:bg-slate-100/60 dark:text-slate-100 dark:hover:bg-slate-800/60"
220+ className = { `w-full rounded-xl border px-4 py-3 text-left transition ${
221+ isFolderOpen
222+ ? "border-blue-500 bg-blue-50 text-blue-700 shadow-sm dark:border-blue-400 dark:bg-blue-900/40 dark:text-blue-100"
223+ : "border-transparent bg-white/70 text-slate-700 hover:border-slate-200 hover:bg-white dark:bg-slate-800/40 dark:text-slate-200 dark:hover:border-slate-600"
224+ } `}
217225 >
218- < span className = "flex items-center gap-2" >
219- < span
220- className = "h-2 w-2 rounded-full"
221- style = { { backgroundColor : folder . color ?? "#cbd5f5" } }
222- />
223- < span className = "truncate" > { folder . name } </ span >
224- </ span >
225- < span className = "flex items-center gap-2 text-xs text-slate-500 dark:text-slate-400" >
226- < span >
227- { folderPapers . length } 论文 / { noteCount } 笔记
226+ < div className = "flex items-center justify-between text-sm font-medium" >
227+ < div className = "flex items-center gap-2" >
228+ < span
229+ className = "h-2.5 w-2.5 rounded-full"
230+ style = { { backgroundColor : folder . color ?? "#cbd5f5" } }
231+ />
232+ < span className = "truncate" > { folder . name } </ span >
233+ </ div >
234+ < span className = "flex items-center gap-2 text-xs text-slate-500 dark:text-slate-300" >
235+ { folderSummary }
236+ < svg
237+ className = { `h-3 w-3 transition ${ isFolderOpen ? "rotate-90" : "" } ` }
238+ viewBox = "0 0 20 20"
239+ fill = "none"
240+ stroke = "currentColor"
241+ strokeWidth = "2"
242+ strokeLinecap = "round"
243+ strokeLinejoin = "round"
244+ >
245+ < path d = "M6 4l6 6-6 6" />
246+ </ svg >
228247 </ span >
229- < span className = { `transition ${ isFolderOpen ? "rotate-90" : "" } ` } > ›</ span >
230- </ span >
248+ </ div >
231249 </ button >
232250
233251 { isFolderOpen && (
234- < div className = "divide-y divide -slate-200 dark:divide -slate-800 " >
252+ < div className = "rounded-xl border border -slate-200 bg-white/80 p-2 shadow-sm dark:border -slate-700 dark:bg-slate-900/40 dark:shadow-none " >
235253 { folderPapers . length === 0 && (
236254 < div className = "px-3 py-2 text-xs text-slate-500 dark:text-slate-400" > 该文件夹暂无论文</ div >
237255 ) }
238256 { folderPapers . map ( ( { paper, notes : paperNotes } ) => {
239257 const paperKey = `paper-${ paper . id } ` ;
240258 const isPaperOpen = expandedGroups [ paperKey ] ?? false ;
241259 return (
242- < div key = { paperKey } className = "bg-white/60 dark:bg-slate-800/40" >
260+ < div
261+ key = { paperKey }
262+ className = "rounded-lg border border-transparent bg-white/60 dark:bg-slate-800/40"
263+ >
243264 < button
244265 type = "button"
245266 onClick = { ( ) => toggleGroup ( paperKey ) }
246- className = "flex w-full items-center justify-between px-3 py-2 text-left text-sm text-slate-800 transition hover:bg-slate-100/60 dark:text-slate-100 dark:hover:bg-slate-800/60"
267+ className = "flex w-full items-center justify-between px-3 py-2 text-left text-xs font-medium text-slate-800 transition hover:bg-blue-50 dark:text-slate-100 dark:hover:bg-slate-800/60"
247268 >
248269 < span className = "truncate" > { paper . original_filename } </ span >
249- < span className = "flex items-center gap-2 text-xs text-slate-500 dark:text-slate-400" >
270+ < span className = "flex items-center gap-2 text-[11px] text-slate-500 dark:text-slate-400" >
250271 < span > { paperNotes . length } </ span >
251272 < span className = { `transition ${ isPaperOpen ? "rotate-90" : "" } ` } > ›</ span >
252273 </ span >
@@ -261,7 +282,9 @@ export default function NotesPage() {
261282 className = "flex w-full items-center justify-between px-3 py-2 text-left text-xs text-slate-700 transition hover:bg-slate-50 dark:text-slate-200 dark:hover:bg-slate-800/50"
262283 >
263284 < span className = "truncate" > { note . title } </ span >
264- < span className = "text-[11px] text-slate-400 dark:text-slate-500" > { formatDate ( note . updated_at ) } </ span >
285+ < span className = "text-[11px] text-slate-400 dark:text-slate-500" >
286+ { formatDate ( note . updated_at ) }
287+ </ span >
265288 </ button >
266289 ) ) }
267290 </ div >
@@ -279,20 +302,36 @@ export default function NotesPage() {
279302 } ) }
280303
281304 { unlinkedNotes . length > 0 && (
282- < div className = "overflow-hidden rounded-xl border border-slate-200 bg-white/80 shadow-sm dark:border-slate-700 dark:bg-slate-800/70 dark:shadow-none " >
305+ < div className = "space-y-2 " >
283306 < button
284307 type = "button"
285308 onClick = { ( ) => toggleGroup ( "unlinked" ) }
286- className = "flex w-full items-center justify-between px-3 py-2 text-left text-sm font-medium text-slate-800 transition hover:bg-slate-100/60 dark:text-slate-100 dark:hover:bg-slate-800/60"
309+ className = { `w-full rounded-xl border px-4 py-3 text-left transition ${
310+ expandedGroups [ "unlinked" ]
311+ ? "border-emerald-500 bg-emerald-50 text-emerald-700 shadow-sm dark:border-emerald-400 dark:bg-emerald-900/30 dark:text-emerald-100"
312+ : "border-transparent bg-white/70 text-slate-700 hover:border-slate-200 hover:bg-white dark:bg-slate-800/40 dark:text-slate-200 dark:hover:border-slate-600"
313+ } `}
287314 >
288- < span className = "truncate" > 未关联论文</ span >
289- < span className = "flex items-center gap-2 text-xs text-slate-500 dark:text-slate-400" >
290- < span > { unlinkedNotes . length } </ span >
291- < span className = { `transition ${ expandedGroups [ "unlinked" ] ? "rotate-90" : "" } ` } > ›</ span >
292- </ span >
315+ < div className = "flex items-center justify-between text-sm font-medium" >
316+ < span className = "truncate" > 未关联论文</ span >
317+ < span className = "flex items-center gap-2 text-xs text-slate-500 dark:text-slate-300" >
318+ { unlinkedNotes . length }
319+ < svg
320+ className = { `h-3 w-3 transition ${ expandedGroups [ "unlinked" ] ? "rotate-90" : "" } ` }
321+ viewBox = "0 0 20 20"
322+ fill = "none"
323+ stroke = "currentColor"
324+ strokeWidth = "2"
325+ strokeLinecap = "round"
326+ strokeLinejoin = "round"
327+ >
328+ < path d = "M6 4l6 6-6 6" />
329+ </ svg >
330+ </ span >
331+ </ div >
293332 </ button >
294333 { expandedGroups [ "unlinked" ] && (
295- < div className = "divide-y divide -slate-200 dark:divide -slate-800 " >
334+ < div className = "rounded-xl border border -slate-200 bg-white/80 p-2 shadow-sm dark:border -slate-700 dark:bg-slate-900/40 dark:shadow-none " >
296335 { unlinkedNotes . map ( ( note ) => (
297336 < button
298337 key = { note . id }
0 commit comments