Skip to content

Commit 446510a

Browse files
committed
tui: surface a dismissible new-interface notice and tighten settings copy for clarity
Users who were migrated to the new interface will now see a dismissible notice in Settings explaining the old interface was phased out, so they are not surprised by the change. The new-interface toggle is also visually elevated with a card style so it is easier to find. Settings labels and descriptions across General have been rewritten to be shorter and more direct, so it is quicker to understand what each option controls. The "New" badge color is also adjusted for better readability.
1 parent ac5e249 commit 446510a

6 files changed

Lines changed: 89 additions & 37 deletions

File tree

packages/app/src/components/settings-general.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ export const SettingsGeneral: Component = () => {
251251
})
252252

253253
const InterfaceSection = () => (
254-
<div class="flex flex-col gap-1">
254+
<div class="flex flex-col gap-4">
255255
<SettingsList>
256256
<SettingsRow
257257
title={
@@ -280,6 +280,23 @@ export const SettingsGeneral: Component = () => {
280280
</div>
281281
</SettingsRow>
282282
</SettingsList>
283+
284+
<Show when={!settings.general.newInterfaceNoticeDismissed()}>
285+
<SettingsList>
286+
<SettingsRow
287+
title={language.t("settings.general.row.newInterfaceNotice.title")}
288+
description={language.t("settings.general.row.newInterfaceNotice.description", {
289+
date: new Intl.DateTimeFormat(language.intl(), { month: "long", day: "numeric" }).format(
290+
oldInterfaceSunset,
291+
),
292+
})}
293+
>
294+
<Button size="small" variant="ghost" onClick={settings.general.dismissNewInterfaceNotice}>
295+
{language.t("settings.general.row.newInterfaceNotice.dismiss")}
296+
</Button>
297+
</SettingsRow>
298+
</SettingsList>
299+
</Show>
283300
</div>
284301
)
285302

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

Lines changed: 47 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -230,34 +230,53 @@ export const SettingsGeneralV2: Component<{
230230

231231
const InterfaceSection = () => (
232232
<div class="settings-v2-section">
233-
<SettingsListV2>
234-
<SettingsRowV2
235-
title={
236-
<span class="flex items-center gap-2">
237-
{language.t("settings.general.row.newInterface.title")}
238-
<Tag variant="accent">{language.t("settings.general.row.newInterface.badge")}</Tag>
239-
</span>
240-
}
241-
description={language.t("settings.general.row.newInterface.description", {
242-
date: new Intl.DateTimeFormat(language.intl(), { month: "long", day: "numeric" }).format(
243-
oldInterfaceSunset,
244-
),
245-
})}
246-
>
247-
<div data-action="settings-new-layout-designs">
248-
<Switch
249-
checked={settings.general.newLayoutDesigns()}
250-
onChange={(checked) => {
251-
settings.general.setNewLayoutDesigns(checked)
252-
if (checked) return
253-
void import("@/components/dialog-settings").then((module) => {
254-
void dialog.show(() => <module.DialogSettings />)
255-
})
256-
}}
257-
/>
258-
</div>
259-
</SettingsRowV2>
260-
</SettingsListV2>
233+
<div class="settings-v2-interface-feature">
234+
<SettingsListV2>
235+
<SettingsRowV2
236+
title={
237+
<span class="flex items-center gap-2">
238+
{language.t("settings.general.row.newInterface.title")}
239+
<Tag variant="accent">{language.t("settings.general.row.newInterface.badge")}</Tag>
240+
</span>
241+
}
242+
description={language.t("settings.general.row.newInterface.description", {
243+
date: new Intl.DateTimeFormat(language.intl(), { month: "long", day: "numeric" }).format(
244+
oldInterfaceSunset,
245+
),
246+
})}
247+
>
248+
<div data-action="settings-new-layout-designs">
249+
<Switch
250+
checked={settings.general.newLayoutDesigns()}
251+
onChange={(checked) => {
252+
settings.general.setNewLayoutDesigns(checked)
253+
if (checked) return
254+
void import("@/components/dialog-settings").then((module) => {
255+
void dialog.show(() => <module.DialogSettings />)
256+
})
257+
}}
258+
/>
259+
</div>
260+
</SettingsRowV2>
261+
</SettingsListV2>
262+
</div>
263+
264+
<Show when={!settings.general.newInterfaceNoticeDismissed()}>
265+
<SettingsListV2>
266+
<SettingsRowV2
267+
title={language.t("settings.general.row.newInterfaceNotice.title")}
268+
description={language.t("settings.general.row.newInterfaceNotice.description", {
269+
date: new Intl.DateTimeFormat(language.intl(), { month: "long", day: "numeric" }).format(
270+
oldInterfaceSunset,
271+
),
272+
})}
273+
>
274+
<ButtonV2 size="small" variant="ghost-muted" onClick={settings.general.dismissNewInterfaceNotice}>
275+
{language.t("settings.general.row.newInterfaceNotice.dismiss")}
276+
</ButtonV2>
277+
</SettingsRowV2>
278+
</SettingsListV2>
279+
</Show>
261280
</div>
262281
)
263282

packages/app/src/components/settings-v2/settings-v2.css

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@
9090
box-shadow: inset 0 0 0 0.5px var(--v2-border-border-muted);
9191
}
9292

93+
.settings-v2-interface-feature [data-component="settings-v2-list"] {
94+
background-color: var(--v2-background-bg-base);
95+
box-shadow: var(--v2-elevation-raised);
96+
}
97+
9398
[data-component="settings-v2-row"] {
9499
display: flex;
95100
flex-wrap: wrap;
@@ -128,7 +133,7 @@
128133
}
129134

130135
[data-slot="settings-v2-row-description"] {
131-
font-size: 11px;
136+
font-size: 13px;
132137
font-weight: 440;
133138
line-height: 1;
134139
color: var(--v2-text-text-muted);

packages/app/src/context/settings.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ export interface Settings {
3434
showCustomAgents: boolean
3535
mobileTitlebarPosition: "top" | "bottom"
3636
newLayoutDesigns?: boolean
37+
newInterfaceNoticeDismissed?: boolean
3738
}
3839
appearance: {
3940
fontSize: number
@@ -254,6 +255,13 @@ export const { use: useSettings, provider: SettingsProvider } = createSimpleCont
254255
setNewLayoutDesigns(value: boolean) {
255256
setStore("general", "newLayoutDesigns", value)
256257
},
258+
newInterfaceNoticeDismissed: withFallback(
259+
() => store.general?.newInterfaceNoticeDismissed,
260+
false,
261+
),
262+
dismissNewInterfaceNotice() {
263+
setStore("general", "newInterfaceNoticeDismissed", true)
264+
},
257265
},
258266
visibility: {
259267
fileTree: visible(showFileTree),

packages/app/src/i18n/en.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -855,9 +855,8 @@ export const dict = {
855855

856856
"settings.general.row.language.title": "Language",
857857
"settings.general.row.language.description": "Change the display language for OpenCode",
858-
"settings.general.row.shell.title": "Terminal Shell",
859-
"settings.general.row.shell.description":
860-
"Choose the shell used for your terminal. Compatible shells are also used for agent tool calls.",
858+
"settings.general.row.shell.title": "Terminal shell",
859+
"settings.general.row.shell.description": "Shell used by the terminal and agent tools",
861860
"settings.general.row.shell.autoDefault": "Auto (Default)",
862861
"settings.general.row.shell.terminalOnly": "terminal only",
863862
"settings.general.row.appearance.title": "Appearance",
@@ -889,8 +888,9 @@ export const dict = {
889888
"settings.general.row.mobileTitlebarBottom.title": "Bottom navigation",
890889
"settings.general.row.mobileTitlebarBottom.description":
891890
"Place the title bar and session tabs at the bottom of the screen on mobile",
892-
"settings.general.row.showCustomAgents.title": "Custom agents",
893-
"settings.general.row.showCustomAgents.description": "Show the agent picker in the composer",
891+
"settings.general.row.showCustomAgents.title": "Show agent",
892+
"settings.general.row.showCustomAgents.description":
893+
"Switch between agents in the composer. When hidden, defaults to Build agent.",
894894
"settings.general.row.reasoningSummaries.title": "Show reasoning summaries",
895895
"settings.general.row.reasoningSummaries.description": "Display model reasoning summaries in the timeline",
896896
"settings.general.row.shellToolPartsExpanded.title": "Expand shell tool parts",
@@ -902,7 +902,10 @@ export const dict = {
902902
"settings.general.row.newInterface.title": "Use the new interface",
903903
"settings.general.row.newInterface.badge": "New",
904904
"settings.general.row.newInterface.description":
905-
"A redesigned layout, tabs, composer and new home. Old interface goes away on {{date}}.",
905+
"New layout, tabs, composer and home. Switch back until {{date}}.",
906+
"settings.general.row.newInterfaceNotice.title": "You're now using the new interface",
907+
"settings.general.row.newInterfaceNotice.description": "The old interface was phased out on {{date}}.",
908+
"settings.general.row.newInterfaceNotice.dismiss": "Dismiss",
906909
"settings.general.row.pinchZoom.title": "Pinch to zoom",
907910
"settings.general.row.pinchZoom.description": "Allow trackpad pinch and Ctrl-scroll gestures to zoom",
908911

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,5 @@
2929
[data-component="tag"][data-variant="accent"] {
3030
border: 0;
3131
background: var(--v2-background-bg-accent);
32-
color: var(--v2-text-text-inverse);
32+
color: var(--v2-text-text-contrast);
3333
}

0 commit comments

Comments
 (0)