Skip to content

Commit 995388a

Browse files
committed
animations for hover
1 parent 35208cb commit 995388a

File tree

1 file changed

+44
-48
lines changed

1 file changed

+44
-48
lines changed

cli/src/components/agent-mode-toggle.tsx

Lines changed: 44 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { TextAttributes } from '@opentui/core'
12
import React, { useRef, useState } from 'react'
23
import stringWidth from 'string-width'
34

@@ -41,6 +42,7 @@ export const AgentModeToggle = ({
4142
const [isOpen, setIsOpen] = useState(false)
4243
const closeTimeoutRef = useRef<NodeJS.Timeout | null>(null)
4344
const openTimeoutRef = useRef<NodeJS.Timeout | null>(null)
45+
const [hoveredIndex, setHoveredIndex] = useState<number>(ALL_MODES.length)
4446

4547
const handlePress = (selectedMode: AgentMode) => {
4648
// Cancel any pending open timeout - click should be immediate
@@ -88,6 +90,7 @@ export const AgentModeToggle = ({
8890
closeTimeoutRef.current = setTimeout(() => {
8991
setIsOpen(false)
9092
closeTimeoutRef.current = null
93+
setHoveredIndex(ALL_MODES.length)
9194
}, 100)
9295
}
9396

@@ -150,7 +153,7 @@ export const AgentModeToggle = ({
150153
const { frameColor, textColor, label } = config[modeItem]
151154
const isActive = isLast
152155
const width = segmentWidths[index]
153-
const content = isActive ? ` < ${label} ` : ` ${label} `
156+
const content = isLast ? ` < ${label} ` : ` ${label} `
154157
const horizontal = '─'.repeat(width)
155158

156159
return {
@@ -179,64 +182,57 @@ export const AgentModeToggle = ({
179182
onMouseOver={handleMouseOver}
180183
onMouseOut={handleMouseOut}
181184
>
182-
{/* Left edge */}
183-
<box style={{ flexDirection: 'column', gap: 0 }}>
184-
<text>
185-
<span fg={segments[0].frameColor}></span>
186-
</text>
187-
<text>
188-
<span fg={segments[0].frameColor}></span>
189-
</text>
190-
<text>
191-
<span fg={segments[0].frameColor}></span>
192-
</text>
193-
</box>
194-
195185
{/* Segments as vertical columns */}
196186
{segments.map((seg, idx) => {
197187
const modeItem = orderedModes[idx]
198-
const isLast = idx === segments.length - 1
188+
const leftOfHovered = idx <= hoveredIndex
189+
const rightOfHovered = idx >= hoveredIndex
190+
199191
return (
200192
<React.Fragment key={`segment-${idx}`}>
201193
<box
202194
onMouseDown={() => handlePress(modeItem)}
195+
onMouseOver={() => setHoveredIndex(idx)}
203196
style={{
204-
flexDirection: 'column',
197+
flexDirection: 'row',
205198
gap: 0,
206-
width: seg.width,
207-
minWidth: seg.width,
208199
}}
209200
>
210-
<text>
211-
<span fg={seg.frameColor}>{seg.topBorder}</span>
212-
</text>
213-
<text>
214-
{seg.isActive ? (
215-
<>
216-
<span fg={seg.textColor}> {'< '}</span>
217-
<b>
218-
<span fg={seg.textColor}>{seg.label}</span>
219-
</b>
220-
<span fg={seg.textColor}> </span>
221-
</>
222-
) : (
223-
<span fg={seg.textColor}>{seg.content}</span>
224-
)}
225-
</text>
226-
<text>
227-
<span fg={seg.frameColor}>{seg.bottomBorder}</span>
228-
</text>
229-
</box>
230-
<box style={{ flexDirection: 'column', gap: 0 }}>
231-
<text>
232-
<span fg={seg.frameColor}></span>
233-
</text>
234-
<text>
235-
<span fg={seg.frameColor}></span>
236-
</text>
237-
<text>
238-
<span fg={seg.frameColor}></span>
239-
</text>
201+
{
202+
/* Left edge */
203+
leftOfHovered ? (
204+
<box style={{ flexDirection: 'column', gap: 0, maxWidth: 1 }}>
205+
<text fg={seg.frameColor}>╭│╰</text>
206+
</box>
207+
) : null
208+
}
209+
{
210+
/* Segments as vertical columns for sorting */
211+
<box>
212+
<text>
213+
<span fg={seg.frameColor}>{seg.topBorder}</span>
214+
</text>
215+
<text
216+
attributes={
217+
idx === hoveredIndex ? TextAttributes.BOLD : undefined
218+
}
219+
fg={seg.textColor}
220+
>
221+
{seg.isActive ? ` < ${seg.label} ` : seg.content}
222+
</text>
223+
<text>
224+
<span fg={seg.frameColor}>{seg.bottomBorder}</span>
225+
</text>
226+
</box>
227+
}
228+
{
229+
/* Right edge */
230+
rightOfHovered ? (
231+
<box style={{ flexDirection: 'column', gap: 0, maxWidth: 1 }}>
232+
<text fg={seg.frameColor}>╮│╯</text>
233+
</box>
234+
) : null
235+
}
240236
</box>
241237
</React.Fragment>
242238
)

0 commit comments

Comments
 (0)