Compare commits

...
Sign in to create a new pull request.

3 commits

Author SHA1 Message Date
David Hill
1bf2a3ff71 fix(app): reduce free model logo width 2026-07-15 11:46:28 +00:00
David Hill
df09cff22e fix(app): align free model logo bounds 2026-07-15 11:41:54 +00:00
David Hill
799889c5cd fix(app): use OpenCode logo for free models 2026-07-13 13:33:38 +00:00

View file

@ -34,6 +34,7 @@ import { useComments } from "@/context/comments"
import { Button } from "@opencode-ai/ui/button" import { Button } from "@opencode-ai/ui/button"
import { DockShellForm, DockTray } from "@opencode-ai/ui/dock-surface" import { DockShellForm, DockTray } from "@opencode-ai/ui/dock-surface"
import { Icon } from "@opencode-ai/ui/icon" import { Icon } from "@opencode-ai/ui/icon"
import { Mark } from "@opencode-ai/ui/logo"
import { ProviderIcon } from "@opencode-ai/ui/provider-icon" import { ProviderIcon } from "@opencode-ai/ui/provider-icon"
import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip"
import { ButtonV2 } from "@opencode-ai/ui/v2/button-v2" import { ButtonV2 } from "@opencode-ai/ui/v2/button-v2"
@ -1550,6 +1551,9 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
keybind: command.keybindParts("model.choose"), keybind: command.keybindParts("model.choose"),
model: props.controls.model.selection, model: props.controls.model.selection,
providerID: props.controls.model.selection.current()?.provider?.id, providerID: props.controls.model.selection.current()?.provider?.id,
free:
props.controls.model.selection.current()?.provider?.id === "opencode" &&
(!props.controls.model.selection.current()?.cost || props.controls.model.selection.current()?.cost.input === 0),
modelName: props.controls.model.selection.current()?.name ?? language.t("dialog.model.select.title"), modelName: props.controls.model.selection.current()?.name ?? language.t("dialog.model.select.title"),
newLayoutDesigns: props.controls.newLayoutDesigns, newLayoutDesigns: props.controls.newLayoutDesigns,
style: control(), style: control(),
@ -2083,13 +2087,10 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
)) ))
}} }}
> >
<Show when={props.controls.model.selection.current()?.provider?.id}> <ModelProviderIcon
<ProviderIcon providerID={modelControlState().providerID}
id={props.controls.model.selection.current()?.provider?.id ?? ""} free={modelControlState().free}
class="size-4 shrink-0 opacity-40 group-hover:opacity-100 transition-opacity duration-150"
style={{ "will-change": "opacity", transform: "translateZ(0)" }}
/> />
</Show>
<span class="truncate"> <span class="truncate">
{props.controls.model.selection.current()?.name ?? {props.controls.model.selection.current()?.name ??
language.t("dialog.model.select.title")} language.t("dialog.model.select.title")}
@ -2117,13 +2118,10 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
}} }}
onClose={restoreFocus} onClose={restoreFocus}
> >
<Show when={props.controls.model.selection.current()?.provider?.id}> <ModelProviderIcon
<ProviderIcon providerID={modelControlState().providerID}
id={props.controls.model.selection.current()?.provider?.id ?? ""} free={modelControlState().free}
class="size-4 shrink-0 opacity-40 group-hover:opacity-100 transition-opacity duration-150"
style={{ "will-change": "opacity", transform: "translateZ(0)" }}
/> />
</Show>
<span class="truncate"> <span class="truncate">
{props.controls.model.selection.current()?.name ?? {props.controls.model.selection.current()?.name ??
language.t("dialog.model.select.title")} language.t("dialog.model.select.title")}
@ -2192,6 +2190,7 @@ type ComposerModelControlState = {
keybind: string[] keybind: string[]
model: ReturnType<typeof useLocal>["model"] model: ReturnType<typeof useLocal>["model"]
providerID?: string providerID?: string
free: boolean
modelName: string modelName: string
newLayoutDesigns: boolean newLayoutDesigns: boolean
style: JSX.CSSProperties | undefined style: JSX.CSSProperties | undefined
@ -2260,15 +2259,7 @@ function ComposerModelControl(props: { state: ComposerModelControlState }) {
style={props.state.style} style={props.state.style}
onClick={props.state.onUnpaidClick} onClick={props.state.onUnpaidClick}
> >
<Show when={props.state.providerID}> <ModelProviderIcon providerID={props.state.providerID} free={props.state.free} />
{(providerID) => (
<ProviderIcon
id={providerID()}
class="size-4 shrink-0 opacity-40 group-hover:opacity-100 transition-opacity duration-150"
style={{ "will-change": "opacity", transform: "translateZ(0)" }}
/>
)}
</Show>
<span class="truncate">{props.state.modelName}</span> <span class="truncate">{props.state.modelName}</span>
<span class="-ml-1 shrink-0 flex size-fit"> <span class="-ml-1 shrink-0 flex size-fit">
<Icon name="chevron-down" size="small" class="text-v2-icon-icon-muted" /> <Icon name="chevron-down" size="small" class="text-v2-icon-icon-muted" />
@ -2347,15 +2338,7 @@ function ComposerModelControl(props: { state: ComposerModelControlState }) {
function ModelControlContent(props: { state: ComposerModelControlState; v2?: boolean }) { function ModelControlContent(props: { state: ComposerModelControlState; v2?: boolean }) {
return ( return (
<> <>
<Show when={props.state.providerID}> <ModelProviderIcon providerID={props.state.providerID} free={props.state.free} />
{(providerID) => (
<ProviderIcon
id={providerID()}
class="size-4 shrink-0 opacity-40 group-hover:opacity-100 transition-opacity duration-150"
style={{ "will-change": "opacity", transform: "translateZ(0)" }}
/>
)}
</Show>
<span class="truncate leading-4">{props.state.modelName}</span> <span class="truncate leading-4">{props.state.modelName}</span>
<span class={props.v2 ? "-ml-0.5 -mr-1 flex shrink-0" : "-ml-1 shrink-0 flex size-fit"}> <span class={props.v2 ? "-ml-0.5 -mr-1 flex shrink-0" : "-ml-1 shrink-0 flex size-fit"}>
<Icon name="chevron-down" size="small" class="text-v2-icon-icon-muted" /> <Icon name="chevron-down" size="small" class="text-v2-icon-icon-muted" />
@ -2363,3 +2346,26 @@ function ModelControlContent(props: { state: ComposerModelControlState; v2?: boo
</> </>
) )
} }
function ModelProviderIcon(props: { providerID?: string; free: boolean }) {
return (
<Show when={props.providerID}>
{(providerID) => (
<Show
when={props.free}
fallback={
<ProviderIcon
id={providerID()}
class="size-4 shrink-0 opacity-40 group-hover:opacity-100 transition-opacity duration-150"
style={{ "will-change": "opacity", transform: "translateZ(0)" }}
/>
}
>
<span class="size-4 shrink-0 flex items-center justify-center opacity-40 group-hover:opacity-100 transition-opacity duration-150">
<Mark class="h-4 w-3" />
</span>
</Show>
)}
</Show>
)
}