@@ -7,14 +7,12 @@ import { Button } from "../ui/button";
77import {
88 Menu ,
99 MenuGroup ,
10+ MenuGroupLabel ,
1011 MenuItem ,
1112 MenuPopup ,
1213 MenuRadioGroup ,
1314 MenuRadioItem ,
1415 MenuSeparator as MenuDivider ,
15- MenuSub ,
16- MenuSubPopup ,
17- MenuSubTrigger ,
1816 MenuTrigger ,
1917} from "../ui/menu" ;
2018import { ClaudeAI , CursorIcon , Gemini , Icon , OpenAI , OpenCodeIcon } from "../Icons" ;
@@ -48,6 +46,10 @@ function providerIconClassName(
4846 return provider === "claudeAgent" ? "text-[#d97757]" : fallbackClassName ;
4947}
5048
49+ function getProviderLabel ( provider : ProviderKind ) : string {
50+ return AVAILABLE_PROVIDER_OPTIONS . find ( ( option ) => option . value === provider ) ?. label ?? provider ;
51+ }
52+
5153export const ProviderModelPicker = memo ( function ProviderModelPicker ( props : {
5254 provider : ProviderKind ;
5355 model : ModelSlug ;
@@ -122,6 +124,9 @@ export const ProviderModelPicker = memo(function ProviderModelPicker(props: {
122124 < MenuPopup align = "start" >
123125 { props . lockedProvider !== null ? (
124126 < MenuGroup >
127+ < MenuGroupLabel className = "px-2 pb-1 pt-2 text-[11px] uppercase tracking-[0.08em]" >
128+ { getProviderLabel ( props . lockedProvider ) } · locked for this thread
129+ </ MenuGroupLabel >
125130 < MenuRadioGroup
126131 value = { props . model }
127132 onValueChange = { ( value ) => handleModelChange ( props . lockedProvider ! , value ) }
@@ -139,39 +144,36 @@ export const ProviderModelPicker = memo(function ProviderModelPicker(props: {
139144 </ MenuGroup >
140145 ) : (
141146 < >
142- { AVAILABLE_PROVIDER_OPTIONS . map ( ( option ) => {
147+ { AVAILABLE_PROVIDER_OPTIONS . map ( ( option , index ) => {
143148 const OptionIcon = PROVIDER_ICON_BY_PROVIDER [ option . value ] ;
144149 return (
145- < MenuSub key = { option . value } >
146- < MenuSubTrigger >
150+ < MenuGroup key = { option . value } >
151+ { index > 0 ? < MenuDivider /> : null }
152+ < MenuGroupLabel className = "flex items-center gap-2 px-2 pb-1 pt-2 text-[11px] uppercase tracking-[0.08em]" >
147153 < OptionIcon
148154 aria-hidden = "true"
149155 className = { cn (
150156 "size-4 shrink-0" ,
151157 providerIconClassName ( option . value , "text-muted-foreground/85" ) ,
152158 ) }
153159 />
154- { option . label }
155- </ MenuSubTrigger >
156- < MenuSubPopup className = "[--available-height:min(24rem,70vh)]" >
157- < MenuGroup >
158- < MenuRadioGroup
159- value = { props . provider === option . value ? props . model : "" }
160- onValueChange = { ( value ) => handleModelChange ( option . value , value ) }
160+ < span > { option . label } </ span >
161+ </ MenuGroupLabel >
162+ < MenuRadioGroup
163+ value = { props . provider === option . value ? props . model : "" }
164+ onValueChange = { ( value ) => handleModelChange ( option . value , value ) }
165+ >
166+ { props . modelOptionsByProvider [ option . value ] . map ( ( modelOption ) => (
167+ < MenuRadioItem
168+ key = { `${ option . value } :${ modelOption . slug } ` }
169+ value = { modelOption . slug }
170+ onClick = { ( ) => setIsMenuOpen ( false ) }
161171 >
162- { props . modelOptionsByProvider [ option . value ] . map ( ( modelOption ) => (
163- < MenuRadioItem
164- key = { `${ option . value } :${ modelOption . slug } ` }
165- value = { modelOption . slug }
166- onClick = { ( ) => setIsMenuOpen ( false ) }
167- >
168- { modelOption . name }
169- </ MenuRadioItem >
170- ) ) }
171- </ MenuRadioGroup >
172- </ MenuGroup >
173- </ MenuSubPopup >
174- </ MenuSub >
172+ { modelOption . name }
173+ </ MenuRadioItem >
174+ ) ) }
175+ </ MenuRadioGroup >
176+ </ MenuGroup >
175177 ) ;
176178 } ) }
177179 { UNAVAILABLE_PROVIDER_OPTIONS . length > 0 && < MenuDivider /> }
0 commit comments