Skip to content

Commit fbb5cfc

Browse files
authored
More theme fixes for select, dropdown & command (#1789)
* More theme fixes * Fix typo * Add changeset * Fix button variant * More fixes * More tweaks * More tweaks * Fix test * Fix tsc errors
1 parent 454124c commit fbb5cfc

File tree

13 files changed

+68
-105
lines changed

13 files changed

+68
-105
lines changed

.changeset/happy-ladybugs-stare.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"roo-cline": patch
3+
---
4+
5+
VSCode theme fixes for select, dropdown and command

webview-ui/src/components/settings/ModelPicker.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ export const ModelPicker = ({
116116
<Popover open={open} onOpenChange={onOpenChange}>
117117
<PopoverTrigger asChild>
118118
<Button
119-
variant="outline"
119+
variant="combobox"
120120
role="combobox"
121121
aria-expanded={open}
122122
className="w-full justify-between">
@@ -138,7 +138,7 @@ export const ModelPicker = ({
138138
{searchValue.length > 0 && (
139139
<div className="absolute right-2 top-0 bottom-0 flex items-center justify-center">
140140
<X
141-
className="opacity-25 hover:opacity-100 cursor-pointer size-4 bg-vscode-button-secondaryBackground rounded-full p-0.5"
141+
className="text-vscode-input-foreground opacity-50 hover:opacity-100 size-4 p-0.5 cursor-pointer"
142142
onClick={onClearSearch}
143143
/>
144144
</div>
@@ -152,7 +152,7 @@ export const ModelPicker = ({
152152
{model}
153153
<Check
154154
className={cn(
155-
"ml-auto",
155+
"size-4 p-0.5 ml-auto",
156156
model === selectedModelId ? "opacity-100" : "opacity-0",
157157
)}
158158
/>

webview-ui/src/components/ui/__tests__/select-dropdown.test.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// npx jest webview-ui/src/components/ui/__tests__/select-dropdown.test.tsx
1+
// npx jest src/components/ui/__tests__/select-dropdown.test.tsx
22

33
import { ReactNode } from "react"
44
import { render, screen, fireEvent } from "@testing-library/react"
@@ -168,10 +168,9 @@ describe("SelectDropdown", () => {
168168
/>,
169169
)
170170

171-
// The shortcut text should be rendered as a div, not a dropdown item
172171
expect(screen.queryByText(shortcutText)).toBeInTheDocument()
173172
const dropdownItems = screen.getAllByTestId("dropdown-item")
174-
expect(dropdownItems.length).toBe(1) // Only one regular option
173+
expect(dropdownItems.length).toBe(2)
175174
})
176175

177176
it("handles action options correctly", () => {

webview-ui/src/components/ui/autosize-textarea.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,10 @@ export const AutosizeTextarea = React.forwardRef<AutosizeTextAreaRef, AutosizeTe
9191
value={value}
9292
ref={textAreaRef}
9393
className={cn(
94-
"flex w-full text-vscode-input-foreground border border-vscode-input-border bg-vscode-input-background rounded-xs ring-offset-background placeholder:text-muted-foreground focus:outline-0 focus-visible:outline-none focus-visible:border-vscode-focusBorder disabled:cursor-not-allowed disabled:opacity-50 scrollbar-hide",
94+
"flex w-full rounded-xs ring-offset-background placeholder:text-muted-foreground focus:outline-0 focus-visible:outline-none focus-visible:border-vscode-focusBorder disabled:cursor-not-allowed disabled:opacity-50 scrollbar-hide",
95+
"border-[var(--vscode-input-border,var(--vscode-input-background))] focus-visible:border-vscode-focusBorder",
96+
"bg-vscode-input-background",
97+
"text-vscode-input-foreground",
9598
className,
9699
)}
97100
onChange={(e) => {

webview-ui/src/components/ui/button.tsx

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,21 @@ import { cva, type VariantProps } from "class-variance-authority"
55
import { cn } from "@/lib/utils"
66

77
const buttonVariants = cva(
8-
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xs text-base font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
8+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-xs text-base font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 cursor-pointer",
99
{
1010
variants: {
1111
variant: {
1212
default:
13-
"border border-vscode-input-border bg-primary text-primary-foreground shadow hover:bg-primary/90 cursor-pointer",
14-
destructive:
15-
"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90 cursor-pointer",
13+
"border border-vscode-input-border bg-primary text-primary-foreground shadow hover:bg-primary/90",
14+
destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90",
1615
outline:
17-
"border border-vscode-input-border bg-background shadow-sm hover:bg-accent hover:text-accent-foreground cursor-pointer",
16+
"border border-vscode-input-border bg-background shadow-sm hover:bg-accent hover:text-accent-foreground",
1817
secondary:
19-
"border border-vscode-input-border bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80 cursor-pointer",
20-
ghost: "hover:bg-accent hover:text-accent-foreground cursor-pointer",
21-
link: "text-primary underline-offset-4 hover:underline cursor-pointer",
18+
"border border-vscode-input-border bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80",
19+
ghost: "hover:bg-accent hover:text-accent-foreground",
20+
link: "text-primary underline-offset-4 hover:underline",
2221
combobox:
23-
"text-vscode-font-size font-normal text-popover-foreground bg-vscode-input-background border border-vscode-dropdown-border hover:bg-vscode-input-background/80 cursor-pointer",
22+
"border border-vscode-dropdown-border focus-visible:border-vscode-focusBorder bg-vscode-dropdown-background hover:bg-transparent text-vscode-dropdown-foreground font-normal",
2423
},
2524
size: {
2625
default: "h-7 px-3",

webview-ui/src/components/ui/command.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const Command = React.forwardRef<
1414
<CommandPrimitive
1515
ref={ref}
1616
className={cn(
17-
"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground",
17+
"flex h-full w-full flex-col overflow-hidden rounded-xs bg-popover text-popover-foreground",
1818
className,
1919
)}
2020
{...props}
@@ -43,7 +43,7 @@ const CommandInput = React.forwardRef<
4343
<CommandPrimitive.Input
4444
ref={ref}
4545
className={cn(
46-
"flex h-10 w-full rounded-md bg-transparent py-3 text-base outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
46+
"flex h-10 w-full rounded-xs bg-transparent py-3 text-base outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
4747
className,
4848
)}
4949
{...props}
@@ -108,7 +108,9 @@ const CommandItem = React.forwardRef<
108108
<CommandPrimitive.Item
109109
ref={ref}
110110
className={cn(
111-
"relative flex cursor-pointer gap-2 select-none items-center rounded-sm px-2 py-1.5 text-base text-vscode-dropdown-foreground outline-none data-[disabled=true]:pointer-events-none data-[selected=true]:bg-vscode-list-activeSelectionBackground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
111+
"relative flex cursor-pointer gap-2 select-none items-center rounded-xs px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
112+
"data-[selected=true]:bg-vscode-list-activeSelectionBackground data-[selected=true]:text-vscode-list-activeSelectionForeground",
113+
"text-vscode-dropdown-foreground",
112114
className,
113115
)}
114116
{...props}

webview-ui/src/components/ui/dropdown-menu.tsx

Lines changed: 10 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as React from "react"
22
import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"
33
import { PortalProps } from "@radix-ui/react-portal"
4-
import { CheckIcon, ChevronRightIcon, DotFilledIcon } from "@radix-ui/react-icons"
4+
import { CheckIcon, DotFilledIcon } from "@radix-ui/react-icons"
55

66
import { cn } from "@/lib/utils"
77

@@ -13,45 +13,8 @@ const DropdownMenuGroup = DropdownMenuPrimitive.Group
1313

1414
const DropdownMenuPortal = DropdownMenuPrimitive.Portal
1515

16-
const DropdownMenuSub = DropdownMenuPrimitive.Sub
17-
1816
const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup
1917

20-
const DropdownMenuSubTrigger = React.forwardRef<
21-
React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,
22-
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {
23-
inset?: boolean
24-
}
25-
>(({ className, inset, children, ...props }, ref) => (
26-
<DropdownMenuPrimitive.SubTrigger
27-
ref={ref}
28-
className={cn(
29-
"flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-vscode-list-activeSelectionBackground data-[state=open]:bg-vscode-list-activeSelectionBackground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
30-
inset && "pl-8",
31-
className,
32-
)}
33-
{...props}>
34-
{children}
35-
<ChevronRightIcon className="ml-auto" />
36-
</DropdownMenuPrimitive.SubTrigger>
37-
))
38-
DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName
39-
40-
const DropdownMenuSubContent = React.forwardRef<
41-
React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,
42-
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>
43-
>(({ className, ...props }, ref) => (
44-
<DropdownMenuPrimitive.SubContent
45-
ref={ref}
46-
className={cn(
47-
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
48-
className,
49-
)}
50-
{...props}
51-
/>
52-
))
53-
DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName
54-
5518
const DropdownMenuContent = React.forwardRef<
5619
React.ElementRef<typeof DropdownMenuPrimitive.Content>,
5720
React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> & Pick<PortalProps, "container">
@@ -61,8 +24,11 @@ const DropdownMenuContent = React.forwardRef<
6124
ref={ref}
6225
sideOffset={sideOffset}
6326
className={cn(
64-
"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md",
27+
"z-50 min-w-[8rem] overflow-hidden rounded-xs p-1 shadow-xs",
6528
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
29+
"border border-vscode-focusBorder",
30+
"bg-vscode-dropdown-background",
31+
"text-vscode-dropdown-foreground",
6632
className,
6733
)}
6834
{...props}
@@ -80,7 +46,8 @@ const DropdownMenuItem = React.forwardRef<
8046
<DropdownMenuPrimitive.Item
8147
ref={ref}
8248
className={cn(
83-
"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-vscode-list-activeSelectionBackground focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0 active:opacity-90",
49+
"relative flex cursor-pointer select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&>svg]:size-4 [&>svg]:shrink-0 active:opacity-90",
50+
"focus:bg-vscode-list-activeSelectionBackground focus:text-vscode-list-activeSelectionForeground",
8451
inset && "pl-8",
8552
className,
8653
)}
@@ -96,7 +63,8 @@ const DropdownMenuCheckboxItem = React.forwardRef<
9663
<DropdownMenuPrimitive.CheckboxItem
9764
ref={ref}
9865
className={cn(
99-
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-vscode-list-activeSelectionBackground focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
66+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
67+
"focus:bg-vscode-list-activeSelectionBackground focus:text-vscode-list-activeSelectionForeground",
10068
className,
10169
)}
10270
checked={checked}
@@ -152,7 +120,7 @@ const DropdownMenuSeparator = React.forwardRef<
152120
>(({ className, ...props }, ref) => (
153121
<DropdownMenuPrimitive.Separator
154122
ref={ref}
155-
className={cn("-mx-1 my-1 h-px bg-vscode-input-border", className)}
123+
className={cn("-mx-1 my-1 h-px bg-vscode-dropdown-foreground/10", className)}
156124
{...props}
157125
/>
158126
))
@@ -175,8 +143,5 @@ export {
175143
DropdownMenuShortcut,
176144
DropdownMenuGroup,
177145
DropdownMenuPortal,
178-
DropdownMenuSub,
179-
DropdownMenuSubContent,
180-
DropdownMenuSubTrigger,
181146
DropdownMenuRadioGroup,
182147
}

webview-ui/src/components/ui/popover.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ const PopoverContent = React.forwardRef<
2020
align={align}
2121
sideOffset={sideOffset}
2222
className={cn(
23-
"z-50 w-72 rounded-xs border border-vscode-dropdown-border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
23+
"z-50 w-72 rounded-xs p-4 shadow-xs outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
24+
"bg-popover",
25+
"border border-vscode-focusBorder",
26+
"text-popover-foreground",
2427
className,
2528
)}
2629
{...props}

webview-ui/src/components/ui/select-dropdown.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,7 @@ export const SelectDropdown = React.forwardRef<React.ElementRef<typeof DropdownM
117117
onEscapeKeyDown={() => setOpen(false)}
118118
onInteractOutside={() => setOpen(false)}
119119
container={portalContainer}
120-
className={cn(
121-
"bg-vscode-dropdown-background text-vscode-dropdown-foreground border border-vscode-dropdown-border z-50",
122-
contentClassName,
123-
)}>
120+
className={contentClassName}>
124121
{options.map((option, index) => {
125122
if (option.type === DropdownOptionType.SEPARATOR) {
126123
return <DropdownMenuSeparator key={`sep-${index}`} />
@@ -131,22 +128,21 @@ export const SelectDropdown = React.forwardRef<React.ElementRef<typeof DropdownM
131128
(option.disabled && shortcutText && option.label.includes(shortcutText))
132129
) {
133130
return (
134-
<div key={`label-${index}`} className="px-2 py-1.5 text-xs opacity-50">
131+
<DropdownMenuItem key={`label-${index}`} disabled>
135132
{option.label}
136-
</div>
133+
</DropdownMenuItem>
137134
)
138135
}
139136

140137
return (
141138
<DropdownMenuItem
142139
key={`item-${option.value}`}
143140
disabled={option.disabled}
144-
className="text-xs focus:bg-vscode-list-activeSelectionBackground cursor-pointer"
145141
onClick={() => handleSelect(option)}>
146142
{option.label}
147143
{option.value === value && (
148144
<DropdownMenuShortcut>
149-
<Check className="w-3 h-3" />
145+
<Check className="size-4 p-0.5" />
150146
</DropdownMenuShortcut>
151147
)}
152148
</DropdownMenuItem>

0 commit comments

Comments
 (0)