Skip to content

Commit 3aaa1da

Browse files
committed
One step.
1 parent ec3135b commit 3aaa1da

File tree

1 file changed

+61
-31
lines changed

1 file changed

+61
-31
lines changed

browser-extension/tests/playground/claude.tsx

Lines changed: 61 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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'
2020
import { twMerge } from 'tailwind-merge'
2121
import type { CommentSpot } from '@/lib/enhancer'
2222
import type { DraftStats } from '@/lib/enhancers/draftStats'
@@ -79,29 +79,57 @@ const typeIcons = {
7979
type 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

Comments
 (0)