@@ -20,25 +20,30 @@ import type { CommentSpot } from '@/lib/enhancer'
2020import type { DraftStats } from '@/lib/enhancers/draftStats'
2121
2222// CVA configuration for stat badges
23- const statBadge = cva ( 'inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs' , {
24- variants : {
25- type : {
26- archived : 'bg-gray-50 text-yellow-700' ,
27- code : 'bg-pink-50 text-pink-700' ,
28- image : 'bg-purple-50 text-purple-700' ,
29- link : 'bg-blue-50 text-blue-700' ,
30- open : 'bg-cyan-50 text-cyan-700' ,
31- sent : 'bg-green-50 text-green-700' ,
32- text : 'bg-gray-50 text-gray-700' ,
33- time : 'bg-gray-50 text-gray-700' ,
34- unsent : 'bg-amber-100 text-amber-700' ,
23+ const statBadge = cva (
24+ 'inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-xs font-normal tracking-normal' ,
25+ {
26+ variants : {
27+ type : {
28+ archived : 'bg-gray-50 text-yellow-700' ,
29+ blank : 'bg-transparent text-gray-700' ,
30+ code : 'bg-pink-50 text-pink-700' ,
31+ image : 'bg-purple-50 text-purple-700' ,
32+ link : 'bg-blue-50 text-blue-700' ,
33+ open : 'bg-cyan-50 text-cyan-700' ,
34+ sent : 'bg-green-50 text-green-700' ,
35+ text : 'bg-gray-50 text-gray-700' ,
36+ time : 'bg-gray-50 text-gray-700' ,
37+ unsent : 'bg-amber-100 text-amber-700' ,
38+ } ,
3539 } ,
3640 } ,
37- } )
41+ )
3842
3943// Map types to their icons
4044const typeIcons = {
4145 archived : Archive ,
46+ blank : Archive ,
4247 code : Code ,
4348 image : Image ,
4449 link : Link ,
@@ -59,7 +64,7 @@ const Badge = ({ text, type }: BadgeProps) => {
5964 const Icon = typeIcons [ type ]
6065 return (
6166 < span className = { statBadge ( { type } ) } >
62- < Icon className = 'w-3 h-3' />
67+ { type === 'blank' || < Icon className = 'w-3 h-3' /> }
6368 { text || type }
6469 </ span >
6570 )
@@ -306,6 +311,7 @@ export const ClaudePrototype = () => {
306311 const [ hasCodeFilter , setHasCodeFilter ] = useState ( false )
307312 const [ hasImageFilter , setHasImageFilter ] = useState ( false )
308313 const [ hasLinkFilter , setHasLinkFilter ] = useState ( false )
314+ const [ sentFilter , setSentFilter ] = useState < 'all' | 'sent' | 'unsent' > ( 'all' )
309315 const [ searchQuery , setSearchQuery ] = useState ( '' )
310316 const [ sortBy , _setSortBy ] = useState ( 'edited-newest' )
311317 const [ showFilters , setShowFilters ] = useState ( false )
@@ -321,6 +327,9 @@ export const ClaudePrototype = () => {
321327 if ( hasLinkFilter ) {
322328 filtered = filtered . filter ( ( d ) => d . latestDraft . stats . links . length > 0 )
323329 }
330+ if ( sentFilter !== 'all' ) {
331+ filtered = filtered . filter ( ( d ) => ( sentFilter === 'sent' ? d . isSent : ! d . isSent ) )
332+ }
324333 if ( searchQuery ) {
325334 const query = searchQuery . toLowerCase ( )
326335 filtered = filtered . filter ( ( d ) =>
@@ -339,7 +348,7 @@ export const ClaudePrototype = () => {
339348 break
340349 }
341350 return filtered
342- } , [ drafts , hasCodeFilter , hasImageFilter , hasLinkFilter , searchQuery , sortBy ] )
351+ } , [ drafts , hasCodeFilter , hasImageFilter , hasLinkFilter , sentFilter , searchQuery , sortBy ] )
343352
344353 const toggleSelection = ( id : string ) => {
345354 const newSelected = new Set ( selectedIds )
@@ -399,7 +408,7 @@ export const ClaudePrototype = () => {
399408
400409 if (
401410 filteredDrafts . length === 0 &&
402- ( searchQuery || hasCodeFilter || hasImageFilter || hasLinkFilter )
411+ ( searchQuery || hasCodeFilter || hasImageFilter || hasLinkFilter || sentFilter !== 'all' )
403412 ) {
404413 return (
405414 < div className = 'min-h-screen bg-white' >
@@ -428,6 +437,7 @@ export const ClaudePrototype = () => {
428437 setHasCodeFilter ( false )
429438 setHasImageFilter ( false )
430439 setHasLinkFilter ( false )
440+ setSentFilter ( 'all' )
431441 setSearchQuery ( '' )
432442 } }
433443 className = 'text-blue-600 hover:underline'
@@ -483,10 +493,7 @@ export const ClaudePrototype = () => {
483493 className = 'rounded'
484494 />
485495 </ th >
486- < th
487- scope = 'col'
488- className = 'px-3 py-3 text-left text-xs font-medium text-gray-500 tracking-wider'
489- >
496+ < th scope = 'col' className = 'px-3 py-3 text-left text-xs text-gray-500 tracking-wider' >
490497 < div className = 'relative' >
491498 < div className = 'flex items-center gap-1' >
492499 < div className = 'relative flex-1' >
@@ -510,34 +517,41 @@ export const ClaudePrototype = () => {
510517 </ div >
511518 { showFilters && (
512519 < div className = 'absolute top-full right-0 mt-1 p-3 bg-white border border-gray-300 rounded-md shadow-lg z-10 min-w-48' >
513- < div className = 'space-y-2' >
514- < label className = 'flex items-center gap-2 cursor-pointer' >
515- < input
516- type = 'checkbox'
517- checked = { hasLinkFilter }
518- onChange = { ( e ) => setHasLinkFilter ( e . target . checked ) }
519- className = 'rounded'
520- />
521- < Badge type = 'link' />
522- </ label >
523- < label className = 'flex items-center gap-2 cursor-pointer' >
524- < input
525- type = 'checkbox'
526- checked = { hasImageFilter }
527- onChange = { ( e ) => setHasImageFilter ( e . target . checked ) }
528- className = 'rounded'
529- />
530- < Badge type = 'image' />
531- </ label >
532- < label className = 'flex items-center gap-2 cursor-pointer' >
533- < input
534- type = 'checkbox'
535- checked = { hasCodeFilter }
536- onChange = { ( e ) => setHasCodeFilter ( e . target . checked ) }
537- className = 'rounded'
538- />
539- < Badge type = 'code' />
540- </ label >
520+ < div className = 'space-y-3' >
521+ < div className = 'space-y-2' >
522+ < label className = 'flex items-center gap-2 cursor-pointer' >
523+ < input
524+ type = 'checkbox'
525+ checked = { hasLinkFilter }
526+ onChange = { ( e ) => setHasLinkFilter ( e . target . checked ) }
527+ className = 'rounded'
528+ />
529+ < Badge type = 'link' />
530+ </ label >
531+ < label className = 'flex items-center gap-2 cursor-pointer' >
532+ < input
533+ type = 'checkbox'
534+ checked = { hasImageFilter }
535+ onChange = { ( e ) => setHasImageFilter ( e . target . checked ) }
536+ className = 'rounded'
537+ />
538+ < Badge type = 'image' />
539+ </ label >
540+ < label className = 'flex items-center gap-2 cursor-pointer' >
541+ < input
542+ type = 'checkbox'
543+ checked = { hasCodeFilter }
544+ onChange = { ( e ) => setHasCodeFilter ( e . target . checked ) }
545+ className = 'rounded'
546+ />
547+ < Badge type = 'code' />
548+ </ label >
549+ </ div >
550+ < div className = 'flex rounded-md overflow-hidden' >
551+ < Badge type = 'unsent' />
552+ < Badge type = 'blank' text = 'both' />
553+ < Badge type = 'sent' />
554+ </ div >
541555 </ div >
542556 </ div >
543557 ) }
0 commit comments