@@ -302,27 +302,108 @@ export const Dashboard: React.FC = () => {
302302 </ div >
303303
304304
305- { /* Secondary Filters */ }
306- < div className = "bg-white/80 backdrop-blur-xl rounded-2xl shadow-xl border border-white/50 p-6 sm:p-8 mb-8" >
307- < div className = "flex items-center gap-3 mb-6" >
308- < div className = "w-10 h-10 bg-gradient-to-br from-[#FF2DAF] to-[#FF2DAF]/80 rounded-xl flex items-center justify-center" >
309- < svg className = "w-6 h-6 text-white" fill = "none" stroke = "currentColor" viewBox = "0 0 24 24" >
310- < path strokeLinecap = "round" strokeLinejoin = "round" strokeWidth = { 2 } d = "M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
311- </ svg >
305+ { /* Secondary Filters - Modern Design */ }
306+ < div className = "relative mb-8" >
307+ { /* Gradient Background Effect */ }
308+ < div className = "absolute inset-0 bg-gradient-to-r from-[#1B1EA9]/5 via-[#FF2DAF]/5 to-[#1B1EA9]/5 rounded-3xl blur-xl" > </ div >
309+
310+ < div className = "relative bg-white/90 backdrop-blur-xl rounded-3xl shadow-2xl border border-white/50 overflow-hidden" >
311+ { /* Header with Gradient Border */ }
312+ < div className = "bg-gradient-to-r from-[#1B1EA9] to-[#FF2DAF] p-[2px]" >
313+ < div className = "bg-white/95 backdrop-blur px-8 py-6" >
314+ < div className = "flex items-center justify-between" >
315+ < div className = "flex items-center gap-4" >
316+ < div className = "relative" >
317+ < div className = "absolute inset-0 bg-gradient-to-br from-[#FF2DAF] to-[#1B1EA9] rounded-2xl blur-lg opacity-60" > </ div >
318+ < div className = "relative w-12 h-12 bg-gradient-to-br from-[#FF2DAF] to-[#1B1EA9] rounded-2xl flex items-center justify-center shadow-lg" >
319+ < svg className = "w-7 h-7 text-white" fill = "none" stroke = "currentColor" viewBox = "0 0 24 24" >
320+ < path strokeLinecap = "round" strokeLinejoin = "round" strokeWidth = { 2.5 } d = "M3 4a1 1 0 011-1h16a1 1 0 011 1v2.586a1 1 0 01-.293.707l-6.414 6.414a1 1 0 00-.293.707V17l-4 4v-6.586a1 1 0 00-.293-.707L3.293 7.293A1 1 0 013 6.586V4z" />
321+ </ svg >
322+ </ div >
323+ </ div >
324+ < div >
325+ < h2 className = "text-2xl font-bold bg-gradient-to-r from-[#1B1EA9] to-[#FF2DAF] bg-clip-text text-transparent" >
326+ Advanced Filters
327+ </ h2 >
328+ < p className = "text-sm text-gray-600 mt-1" > Refine your search with precision</ p >
329+ </ div >
330+ </ div >
331+
332+ { /* Active Filter Count */ }
333+ { ( selectedMessageType !== 'all' || peerFilter ) && (
334+ < div className = "flex items-center gap-2 bg-gradient-to-r from-[#1B1EA9]/10 to-[#FF2DAF]/10 px-4 py-2 rounded-full" >
335+ < span className = "text-sm font-medium text-gray-700" >
336+ { [ selectedMessageType !== 'all' ? 1 : 0 , peerFilter ? 1 : 0 ] . reduce ( ( a , b ) => a + b , 0 ) } active
337+ </ span >
338+ < button
339+ onClick = { ( ) => {
340+ setSelectedMessageType ( 'all' ) ;
341+ setPeerFilter ( '' ) ;
342+ } }
343+ className = "ml-1 p-1 hover:bg-white/50 rounded-full transition-colors"
344+ >
345+ < svg className = "w-3 h-3 text-gray-600" fill = "none" stroke = "currentColor" viewBox = "0 0 24 24" >
346+ < path strokeLinecap = "round" strokeLinejoin = "round" strokeWidth = { 2 } d = "M6 18L18 6M6 6l12 12" />
347+ </ svg >
348+ </ button >
349+ </ div >
350+ ) }
351+ </ div >
352+ </ div >
353+ </ div >
354+
355+ { /* Filter Content */ }
356+ < div className = "p-8" >
357+ < div className = "grid grid-cols-1 lg:grid-cols-2 gap-8" >
358+ { /* Message Type Filter with Enhanced Styling */ }
359+ < div className = "group" >
360+ < div className = "relative" >
361+ < div className = "absolute -inset-0.5 bg-gradient-to-r from-[#1B1EA9] to-[#FF2DAF] rounded-2xl blur opacity-0 group-hover:opacity-30 transition duration-500" > </ div >
362+ < div className = "relative bg-gray-50/50 rounded-2xl p-6 border border-gray-200/50 hover:border-gray-300/50 transition-all duration-300" >
363+ < MessageTypeFilter
364+ selectedType = { selectedMessageType }
365+ onTypeChange = { setSelectedMessageType }
366+ messageTypes = { messageTypes }
367+ />
368+ </ div >
369+ </ div >
370+ </ div >
371+
372+ { /* Peer Filter with Enhanced Styling */ }
373+ < div className = "group" >
374+ < div className = "relative" >
375+ < div className = "absolute -inset-0.5 bg-gradient-to-r from-[#FF2DAF] to-[#1B1EA9] rounded-2xl blur opacity-0 group-hover:opacity-30 transition duration-500" > </ div >
376+ < div className = "relative bg-gray-50/50 rounded-2xl p-6 border border-gray-200/50 hover:border-gray-300/50 transition-all duration-300" >
377+ < PeerFilter
378+ value = { peerFilter }
379+ onChange = { setPeerFilter }
380+ recentPeers = { recentPeers }
381+ />
382+ </ div >
383+ </ div >
384+ </ div >
385+ </ div >
386+
387+ { /* Filter Summary Bar */ }
388+ < div className = "mt-6 flex items-center justify-between px-4 py-3 bg-gradient-to-r from-gray-50 to-gray-100 rounded-xl" >
389+ < div className = "flex items-center gap-2" >
390+ < svg className = "w-4 h-4 text-gray-500" fill = "none" stroke = "currentColor" viewBox = "0 0 24 24" >
391+ < path strokeLinecap = "round" strokeLinejoin = "round" strokeWidth = { 2 } d = "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
392+ </ svg >
393+ < span className = "text-sm text-gray-600" >
394+ Showing { selectedMessageType === 'all' ? 'all message types' : selectedMessageType . replace ( '_' , ' ' ) }
395+ { peerFilter && ` from peer ${ peerFilter . slice ( 0 , 8 ) } ...` }
396+ </ span >
397+ </ div >
398+ { loading && (
399+ < div className = "flex items-center gap-2" >
400+ < div className = "w-2 h-2 bg-[#1B1EA9] rounded-full animate-bounce" style = { { animationDelay : '0ms' } } > </ div >
401+ < div className = "w-2 h-2 bg-[#FF2DAF] rounded-full animate-bounce" style = { { animationDelay : '150ms' } } > </ div >
402+ < div className = "w-2 h-2 bg-[#1B1EA9] rounded-full animate-bounce" style = { { animationDelay : '300ms' } } > </ div >
403+ </ div >
404+ ) }
405+ </ div >
312406 </ div >
313- < h2 className = "text-xl font-semibold text-gray-900" > Filter Messages</ h2 >
314- </ div >
315- < div className = "grid grid-cols-1 lg:grid-cols-2 gap-6" >
316- < MessageTypeFilter
317- selectedType = { selectedMessageType }
318- onTypeChange = { setSelectedMessageType }
319- messageTypes = { messageTypes }
320- />
321- < PeerFilter
322- value = { peerFilter }
323- onChange = { setPeerFilter }
324- recentPeers = { recentPeers }
325- />
326407 </ div >
327408 </ div >
328409
0 commit comments