Skip to content

Commit 21bfbff

Browse files
dbpolitodl-alexandre
authored andcommitted
feat(desktop): Adding Provider Icons (anomalyco#8215)
1 parent ac9ed85 commit 21bfbff

File tree

5 files changed

+45
-9
lines changed

5 files changed

+45
-9
lines changed

packages/app/src/components/dialog-select-model.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import { Button } from "@opencode-ai/ui/button"
77
import { Tag } from "@opencode-ai/ui/tag"
88
import { Dialog } from "@opencode-ai/ui/dialog"
99
import { List } from "@opencode-ai/ui/list"
10+
import { ProviderIcon } from "@opencode-ai/ui/provider-icon"
11+
import type { IconName } from "@opencode-ai/ui/icons/provider"
1012
import { DialogSelectProvider } from "./dialog-select-provider"
1113
import { DialogManageModels } from "./dialog-manage-models"
1214

@@ -36,6 +38,12 @@ const ModelList: Component<{
3638
filter=""
3739
sortBy={(a, b) => a.name.localeCompare(b.name)}
3840
groupBy={(x) => x.provider.name}
41+
groupHeader={(group) => (
42+
<div class="flex items-center gap-x-3">
43+
<ProviderIcon data-slot="list-item-extra-icon" id={group.items[0].provider.id as IconName} />
44+
<span>{group.category}</span>
45+
</div>
46+
)}
3947
sortGroupsBy={(a, b) => {
4048
if (a.category === "Recent" && b.category !== "Recent") return -1
4149
if (b.category === "Recent" && a.category !== "Recent") return 1
@@ -53,7 +61,8 @@ const ModelList: Component<{
5361
}}
5462
>
5563
{(i) => (
56-
<div class="w-full flex items-center gap-x-2 text-13-regular">
64+
<div class="w-full flex items-center gap-x-3 pl-1 text-13-regular">
65+
<ProviderIcon data-slot="list-item-extra-icon" id={i.provider.id as IconName} />
5766
<span class="truncate">{i.name}</span>
5867
<Show when={i.provider.id === "opencode" && (!i.cost || i.cost?.input === 0)}>
5968
<Tag>Free</Tag>

packages/app/src/components/prompt-input.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ import { useSync } from "@/context/sync"
3333
import { FileIcon } from "@opencode-ai/ui/file-icon"
3434
import { Button } from "@opencode-ai/ui/button"
3535
import { Icon } from "@opencode-ai/ui/icon"
36+
import { ProviderIcon } from "@opencode-ai/ui/provider-icon"
37+
import type { IconName } from "@opencode-ai/ui/icons/provider"
3638
import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip"
3739
import { IconButton } from "@opencode-ai/ui/icon-button"
3840
import { Select } from "@opencode-ai/ui/select"
@@ -1560,6 +1562,12 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
15601562
fallback={
15611563
<TooltipKeybind placement="top" title="Choose model" keybind={command.keybind("model.choose")}>
15621564
<Button as="div" variant="ghost" onClick={() => dialog.show(() => <DialogSelectModelUnpaid />)}>
1565+
<Show when={local.model.current()?.provider?.id}>
1566+
<ProviderIcon
1567+
id={local.model.current()!.provider.id as IconName}
1568+
class="size-4 shrink-0"
1569+
/>
1570+
</Show>
15631571
{local.model.current()?.name ?? "Select model"}
15641572
<Icon name="chevron-down" size="small" />
15651573
</Button>
@@ -1569,6 +1577,12 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
15691577
<ModelSelectorPopover>
15701578
<TooltipKeybind placement="top" title="Choose model" keybind={command.keybind("model.choose")}>
15711579
<Button as="div" variant="ghost">
1580+
<Show when={local.model.current()?.provider?.id}>
1581+
<ProviderIcon
1582+
id={local.model.current()!.provider.id as IconName}
1583+
class="size-4 shrink-0"
1584+
/>
1585+
</Show>
15721586
{local.model.current()?.name ?? "Select model"}
15731587
<Icon name="chevron-down" size="small" />
15741588
</Button>
@@ -1583,10 +1597,10 @@ export const PromptInput: Component<PromptInputProps> = (props) => {
15831597
>
15841598
<Button
15851599
variant="ghost"
1586-
class="text-text-base _hidden group-hover/prompt-input:inline-block"
1600+
class="text-text-base _hidden group-hover/prompt-input:inline-block capitalize text-12-regular"
15871601
onClick={() => local.model.variant.cycle()}
15881602
>
1589-
<span class="capitalize text-12-regular">{local.model.variant.current() ?? "Default"}</span>
1603+
{local.model.variant.current() ?? "Default"}
15901604
</Button>
15911605
</TooltipKeybind>
15921606
</Show>

packages/ui/src/components/button.css

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,21 +123,20 @@
123123

124124
&[data-size="normal"] {
125125
height: 24px;
126+
line-height: 24px;
126127
padding: 0 6px;
127128
&[data-icon] {
128129
padding: 0 12px 0 4px;
129130
}
130131

131132
font-size: var(--font-size-small);
132-
line-height: var(--line-height-large);
133133
gap: 6px;
134134

135135
/* text-12-medium */
136136
font-family: var(--font-family-sans);
137137
font-size: var(--font-size-small);
138138
font-style: normal;
139139
font-weight: var(--font-weight-medium);
140-
line-height: var(--line-height-large); /* 166.667% */
141140
letter-spacing: var(--letter-spacing-normal);
142141
}
143142

packages/ui/src/components/list.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,15 @@ export interface ListSearchProps {
1010
autofocus?: boolean
1111
}
1212

13+
export interface ListGroup<T> {
14+
category: string
15+
items: T[]
16+
}
17+
1318
export interface ListProps<T> extends FilteredListProps<T> {
1419
class?: string
1520
children: (item: T) => JSX.Element
21+
groupHeader?: (group: ListGroup<T>) => JSX.Element
1622
emptyMessage?: string
1723
onKeyEvent?: (event: KeyboardEvent, item: T | undefined) => void
1824
onMove?: (item: T | undefined) => void
@@ -116,7 +122,7 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void })
116122
setScrollRef,
117123
})
118124

119-
function GroupHeader(props: { category: string }): JSX.Element {
125+
function GroupHeader(groupProps: { category: string; children?: JSX.Element }): JSX.Element {
120126
const [stuck, setStuck] = createSignal(false)
121127
const [header, setHeader] = createSignal<HTMLDivElement | undefined>(undefined)
122128

@@ -138,7 +144,7 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void })
138144

139145
return (
140146
<div data-slot="list-header" data-stuck={stuck()} ref={setHeader}>
141-
{props.category}
147+
{groupProps.children ?? groupProps.category}
142148
</div>
143149
)
144150
}
@@ -185,7 +191,7 @@ export function List<T>(props: ListProps<T> & { ref?: (ref: ListRef) => void })
185191
{(group) => (
186192
<div data-slot="list-group">
187193
<Show when={group.category}>
188-
<GroupHeader category={group.category} />
194+
<GroupHeader category={group.category}>{props.groupHeader?.(group)}</GroupHeader>
189195
</Show>
190196
<div data-slot="list-items">
191197
<For each={group.items}>

packages/ui/src/components/session-turn.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import { Accordion } from "./accordion"
2222
import { StickyAccordionHeader } from "./sticky-accordion-header"
2323
import { FileIcon } from "./file-icon"
2424
import { Icon } from "./icon"
25+
import { ProviderIcon } from "./provider-icon"
26+
import type { IconName } from "./provider-icons/types"
2527
import { IconButton } from "./icon-button"
2628
import { Tooltip } from "./tooltip"
2729
import { Card } from "./card"
@@ -498,7 +500,13 @@ export function SessionTurn(
498500
<span data-slot="session-turn-badge">{(msg() as UserMessage).agent}</span>
499501
</Show>
500502
<Show when={(msg() as UserMessage).model?.modelID}>
501-
<span data-slot="session-turn-badge">{(msg() as UserMessage).model?.modelID}</span>
503+
<span data-slot="session-turn-badge" class="inline-flex items-center gap-1">
504+
<ProviderIcon
505+
id={(msg() as UserMessage).model!.providerID as IconName}
506+
class="size-3.5 shrink-0"
507+
/>
508+
{(msg() as UserMessage).model?.modelID}
509+
</span>
502510
</Show>
503511
<span data-slot="session-turn-badge">{(msg() as UserMessage).variant || "default"}</span>
504512
</div>

0 commit comments

Comments
 (0)