@@ -7,16 +7,16 @@ import {
77 Clock ,
88 Code ,
99 EyeOff ,
10- Filter ,
1110 Image ,
1211 Link ,
12+ LucideProps ,
1313 MailCheck ,
1414 MessageSquareDashed ,
1515 Monitor ,
1616 Search ,
1717 TextSelect ,
1818} from 'lucide-react'
19- import { useMemo , useState } from 'react'
19+ import react , { useMemo , useState } from 'react'
2020import { twMerge } from 'tailwind-merge'
2121import type { CommentSpot } from '@/lib/enhancer'
2222import type { DraftStats } from '@/lib/enhancers/draftStats'
@@ -79,29 +79,57 @@ const typeIcons = {
7979type BadgeProps = VariantProps < typeof statBadge > & {
8080 type : keyof typeof typeIcons
8181 text ?: number | string
82- onClick ?: ( ) => void
83- selected ?: boolean
8482}
8583
86- const Badge = ( { text, type, onClick , selected } : BadgeProps ) => {
84+ const Badge = ( { text, type } : BadgeProps ) => {
8785 const Icon = typeIcons [ type ]
88- const Component = onClick ? 'button' : 'span'
89-
9086 return (
91- < Component
87+ < span
9288 className = { twMerge (
9389 statBadge ( {
94- clickable : ! ! onClick ,
95- selected : selected || false ,
9690 type,
9791 } ) ,
9892 ) }
99- onClick = { onClick }
100- { ...( onClick && { type : 'button' } ) }
10193 >
10294 { type === 'blank' || < Icon className = 'w-3 h-3' /> }
10395 { text || type }
104- </ Component >
96+ </ span >
97+ )
98+ }
99+
100+
101+ interface Segment {
102+ text ?: string
103+ type : keyof typeof typeIcons
104+ onClick : ( ) => void
105+ selected : boolean
106+ }
107+ interface MultiSegmentProps {
108+ segments : Segment [ ]
109+ }
110+
111+ const MultiSegment = ( { segments } : MultiSegmentProps ) => {
112+ return (
113+ < div className = "inline-flex items-center gap-0" >
114+ { segments . map ( ( segment , index ) => {
115+ const Icon = typeIcons [ segment . type ]
116+ return (
117+ < button
118+ key = { index }
119+ className = { statBadge ( {
120+ clickable : true ,
121+ selected : segment . selected ,
122+ type : segment . type ,
123+ } ) }
124+ onClick = { segment . onClick }
125+ type = "button"
126+ >
127+ { segment . type === 'blank' || < Icon className = 'w-3 h-3' /> }
128+ { segment . text }
129+ </ button >
130+ )
131+ } ) }
132+ </ div >
105133 )
106134}
107135
@@ -529,24 +557,26 @@ export const ClaudePrototype = () => {
529557 />
530558 </ div >
531559 < div className = 'relative flex overflow-hidden' >
532- < Badge
533- type = 'unsent'
534- text = 'unsent only'
535- selected = { filters . sentFilter === 'unsent' }
536- onClick = { ( ) => updateFilter ( 'sentFilter' , 'unsent' ) }
537- />
538- < Badge
539- type = 'blank'
540- text = 'both'
541- selected = { filters . sentFilter === 'all' }
542- onClick = { ( ) => updateFilter ( 'sentFilter' , 'all' ) }
543- />
544- < Badge
545- type = 'sent'
546- text = 'sent only'
547- selected = { filters . sentFilter === 'sent' }
548- onClick = { ( ) => updateFilter ( 'sentFilter' , 'sent' ) }
549- />
560+ < MultiSegment segments = { [
561+ {
562+ type : 'unsent' ,
563+ text : '' ,
564+ selected : filters . sentFilter === 'unsent' ,
565+ onClick : ( ) => updateFilter ( 'sentFilter' , 'unsent' )
566+ } ,
567+ {
568+ type : 'blank' ,
569+ text : 'both' ,
570+ selected : filters . sentFilter === 'all' ,
571+ onClick : ( ) => updateFilter ( 'sentFilter' , 'all' )
572+ } ,
573+ {
574+ type : 'sent' ,
575+ text : ' ' ,
576+ selected : filters . sentFilter === 'sent' ,
577+ onClick : ( ) => updateFilter ( 'sentFilter' , 'sent' )
578+ }
579+ ] } />
550580 </ div >
551581 </ div >
552582 </ div >
0 commit comments