Skip to content

Commit 52eae83

Browse files
authored
fix(app): add server button dropdown (#33358)
1 parent 3cc626b commit 52eae83

4 files changed

Lines changed: 45 additions & 16 deletions

File tree

packages/app/src/components/settings-v2/servers.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { ButtonV2 } from "@opencode-ai/ui/v2/button-v2"
21
import { Tag } from "@opencode-ai/ui/v2/badge-v2"
32
import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon"
43
import { IconButtonV2 } from "@opencode-ai/ui/v2/icon-button-v2"
@@ -14,7 +13,7 @@ import { ServerConnection, serverName } from "@/context/server"
1413
import { useServerManagementController } from "../dialog-select-server"
1514
import { DialogServerV2 } from "./dialog-server-v2"
1615
import { SettingsListV2 } from "./parts/list"
17-
import { isWslServer, useFilteredWslServers, WslAddServerButton, WslServerSettings } from "@/wsl/settings"
16+
import { AddServerMenu, isWslServer, useFilteredWslServers, WslServerSettings } from "@/wsl/settings"
1817
import "./settings-v2.css"
1918

2019
export const SettingsServersV2: Component = () => {
@@ -55,10 +54,7 @@ export const SettingsServersV2: Component = () => {
5554
>
5655
<div class="settings-v2-tab-header-row">
5756
<h2 class="settings-v2-tab-title">{language.t("status.popover.tab.servers")}</h2>
58-
<ButtonV2 variant="ghost-muted" icon="plus" onClick={openAdd}>
59-
{language.t("dialog.server.add.button")}
60-
</ButtonV2>
61-
<WslAddServerButton />
57+
<AddServerMenu onAddServer={openAdd} />
6258
</div>
6359
<Show when={showSearch()}>
6460
<div class="settings-v2-tab-search">

packages/app/src/wsl/settings.tsx

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,37 @@ export function isWslServer(server: ServerConnection.Any) {
2424
return server.type === "sidecar" && server.variant === "wsl"
2525
}
2626

27-
export function WslAddServerButton() {
27+
export function AddServerMenu(props: { onAddServer: () => void }) {
2828
const platform = usePlatform()
2929
const dialog = useDialog()
3030
const language = useLanguage()
31-
const openAdd = () => {
31+
const openAddWsl = () => {
3232
dialog.push(() => (
3333
<Dialog title={language.t("wsl.server.add")} size="large" fit class="settings-v2-wsl-dialog">
3434
<DialogAddWslServer />
3535
</Dialog>
3636
))
3737
}
3838
return (
39-
<Show when={platform.wslServers}>
40-
<ButtonV2 variant="ghost-muted" icon="plus" onClick={openAdd}>
41-
{language.t("wsl.server.addShort")}
42-
</ButtonV2>
39+
<Show
40+
when={platform.wslServers}
41+
fallback={
42+
<ButtonV2 variant="ghost-muted" icon="plus" onClick={props.onAddServer}>
43+
{language.t("dialog.server.add.button")}
44+
</ButtonV2>
45+
}
46+
>
47+
<MenuV2 gutter={4} modal={false} placement="bottom-end">
48+
<MenuV2.Trigger as={ButtonV2} variant="ghost-muted" icon="plus">
49+
{language.t("dialog.server.add.button")}
50+
</MenuV2.Trigger>
51+
<MenuV2.Portal>
52+
<MenuV2.Content>
53+
<MenuV2.Item onSelect={props.onAddServer}>{language.t("dialog.server.add.button")}</MenuV2.Item>
54+
<MenuV2.Item onSelect={openAddWsl}>{language.t("wsl.server.add")}</MenuV2.Item>
55+
</MenuV2.Content>
56+
</MenuV2.Portal>
57+
</MenuV2>
4358
</Show>
4459
)
4560
}

packages/ui/src/v2/components/button-v2.css

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,18 @@
132132
color: var(--v2-text-text-base);
133133
}
134134

135-
[data-component="button-v2"][data-variant="ghost"]:is(:hover, [data-state="hover"]):not(:disabled) {
135+
[data-component="button-v2"][data-variant="ghost"]:is(:hover, [data-state="hover"]):not(:disabled):not([data-expanded]) {
136136
background-color: var(--v2-overlay-simple-overlay-hover);
137137
}
138138

139139
[data-component="button-v2"][data-variant="ghost"]:is(:active, [data-state="pressed"]):not(:disabled) {
140140
background-color: var(--v2-overlay-simple-overlay-pressed);
141141
}
142142

143+
[data-component="button-v2"][data-variant="ghost"]:where([data-expanded]):not(:disabled) {
144+
background-color: var(--v2-overlay-simple-overlay-pressed);
145+
}
146+
143147
[data-component="button-v2"][data-variant="ghost"]:is(:disabled, [data-state="disabled"]) {
144148
opacity: 0.5;
145149
cursor: not-allowed;
@@ -155,14 +159,23 @@
155159
color: var(--v2-icon-icon-muted);
156160
}
157161

158-
[data-component="button-v2"][data-variant="ghost-muted"]:is(:hover, [data-state="hover"]):not(:disabled) {
162+
[data-component="button-v2"][data-variant="ghost-muted"]:is(:hover, [data-state="hover"]):not(:disabled):not([data-expanded]) {
159163
background-color: var(--v2-overlay-simple-overlay-hover);
160164
}
161165

162166
[data-component="button-v2"][data-variant="ghost-muted"]:is(:active, [data-state="pressed"]):not(:disabled) {
163167
background-color: var(--v2-overlay-simple-overlay-pressed);
164168
}
165169

170+
[data-component="button-v2"][data-variant="ghost-muted"]:where([data-expanded]):not(:disabled) {
171+
background-color: var(--v2-overlay-simple-overlay-pressed);
172+
color: var(--v2-text-text-base);
173+
}
174+
175+
[data-component="button-v2"][data-variant="ghost-muted"]:where([data-expanded]):not(:disabled) [data-slot="icon-svg"] {
176+
color: var(--v2-icon-icon-base);
177+
}
178+
166179
[data-component="button-v2"][data-variant="ghost-muted"]:is(:disabled, [data-state="disabled"]) {
167180
opacity: 0.5;
168181
cursor: not-allowed;

packages/ui/src/v2/components/icon-button-v2.css

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112
color: var(--v2-text-text-base);
113113
}
114114

115-
[data-component="icon-button-v2"][data-variant="ghost"]:is(:hover, [data-state="hover"]):not(:disabled) {
115+
[data-component="icon-button-v2"][data-variant="ghost"]:is(:hover, [data-state="hover"]):not(:disabled):not([data-expanded]) {
116116
background-color: var(--v2-overlay-simple-overlay-hover);
117117
}
118118

@@ -131,7 +131,7 @@
131131
color: var(--v2-icon-icon-muted);
132132
}
133133

134-
[data-component="icon-button-v2"][data-variant="ghost-muted"]:is(:hover, [data-state="hover"]):not(:disabled) {
134+
[data-component="icon-button-v2"][data-variant="ghost-muted"]:is(:hover, [data-state="hover"]):not(:disabled):not([data-expanded]) {
135135
background-color: var(--v2-overlay-simple-overlay-hover);
136136
}
137137

@@ -140,6 +140,11 @@
140140
color: var(--v2-icon-icon-base);
141141
}
142142

143+
[data-component="icon-button-v2"][data-variant="ghost-muted"]:where([data-expanded]):not(:disabled) {
144+
background-color: var(--v2-overlay-simple-overlay-pressed);
145+
color: var(--v2-icon-icon-base);
146+
}
147+
143148
[data-component="icon-button-v2"][data-variant="ghost-muted"]:is(:disabled, [data-state="disabled"]) {
144149
opacity: 0.5;
145150
cursor: not-allowed;

0 commit comments

Comments
 (0)