Skip to content

Commit 1ecbc97

Browse files
committed
feat: add scope indicators (Global/Project) to mode selector and editor
- Add visual badges showing 'Global' or 'Project' scope for custom modes - Display scope in mode selector dropdown items - Display scope in currently selected mode button - Display scope in modes editor view - Use existing translations from common.json Fixes #8238
1 parent 0e1b23d commit 1ecbc97

File tree

2 files changed

+56
-15
lines changed

2 files changed

+56
-15
lines changed

webview-ui/src/components/chat/ModeSelector.tsx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ export const ModeSelector = ({
198198
disabled={disabled}
199199
data-testid="mode-selector-trigger"
200200
className={cn(
201-
"inline-flex items-center relative whitespace-nowrap px-1.5 py-1 text-xs",
201+
"inline-flex items-center gap-1 relative whitespace-nowrap px-1.5 py-1 text-xs",
202202
"bg-transparent border border-[rgba(255,255,255,0.08)] rounded-md text-vscode-foreground",
203203
"transition-all duration-150 focus:outline-none focus-visible:ring-1 focus-visible:ring-vscode-focusBorder focus-visible:ring-inset",
204204
disabled
@@ -210,6 +210,11 @@ export const ModeSelector = ({
210210
: null,
211211
)}>
212212
<span className="truncate">{selectedMode?.name || ""}</span>
213+
{selectedMode?.source && (
214+
<span className="text-[10px] px-1 py-0.5 rounded bg-vscode-badge-background text-vscode-badge-foreground">
215+
{selectedMode.source === "project" ? t("common:scope.project") : t("common:scope.global")}
216+
</span>
217+
)}
213218
</PopoverTrigger>
214219
</StandardTooltip>
215220
<PopoverContent
@@ -255,6 +260,7 @@ export const ModeSelector = ({
255260
<div className="py-1">
256261
{filteredModes.map((mode) => {
257262
const isSelected = mode.slug === value
263+
const isCustomMode = mode.source !== undefined
258264
return (
259265
<div
260266
key={mode.slug}
@@ -269,7 +275,16 @@ export const ModeSelector = ({
269275
)}
270276
data-testid="mode-selector-item">
271277
<div className="flex-1 min-w-0">
272-
<div className="font-bold truncate">{mode.name}</div>
278+
<div className="flex items-center gap-1.5">
279+
<span className="font-bold truncate">{mode.name}</span>
280+
{isCustomMode && (
281+
<span className="text-[10px] px-1 py-0.5 rounded bg-vscode-badge-background text-vscode-badge-foreground">
282+
{mode.source === "project"
283+
? t("common:scope.project")
284+
: t("common:scope.global")}
285+
</span>
286+
)}
287+
</div>
273288
{mode.description && (
274289
<div className="text-xs text-vscode-descriptionForeground truncate">
275290
{mode.description}

webview-ui/src/components/modes/ModesView.tsx

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -619,8 +619,17 @@ const ModesView = ({ onDone }: ModesViewProps) => {
619619
aria-expanded={open}
620620
className="justify-between w-full"
621621
data-testid="mode-select-trigger">
622-
<div className="truncate">
623-
{getCurrentMode()?.name || t("prompts:modes.selectMode")}
622+
<div className="flex items-center gap-1.5 truncate">
623+
<span className="truncate">
624+
{getCurrentMode()?.name || t("prompts:modes.selectMode")}
625+
</span>
626+
{getCurrentMode()?.source && (
627+
<span className="text-[10px] px-1 py-0.5 rounded bg-vscode-badge-background text-vscode-badge-foreground">
628+
{getCurrentMode()?.source === "project"
629+
? t("common:scope.project")
630+
: t("common:scope.global")}
631+
</span>
632+
)}
624633
</div>
625634
<ChevronDown className="opacity-50" />
626635
</Button>
@@ -672,16 +681,24 @@ const ModesView = ({ onDone }: ModesViewProps) => {
672681
}}
673682
data-testid={`mode-option-${modeConfig.slug}`}>
674683
<div className="flex items-center justify-between w-full">
675-
<span
676-
style={{
677-
whiteSpace: "nowrap",
678-
overflow: "hidden",
679-
textOverflow: "ellipsis",
680-
flex: 2,
681-
minWidth: 0,
682-
}}>
683-
{modeConfig.name}
684-
</span>
684+
<div className="flex items-center gap-1.5 flex-1 min-w-0">
685+
<span
686+
style={{
687+
whiteSpace: "nowrap",
688+
overflow: "hidden",
689+
textOverflow: "ellipsis",
690+
minWidth: 0,
691+
}}>
692+
{modeConfig.name}
693+
</span>
694+
{modeConfig.source && (
695+
<span className="text-[10px] px-1 py-0.5 rounded bg-vscode-badge-background text-vscode-badge-foreground">
696+
{modeConfig.source === "project"
697+
? t("common:scope.project")
698+
: t("common:scope.global")}
699+
</span>
700+
)}
701+
</div>
685702
<span
686703
className="text-foreground"
687704
style={{
@@ -741,7 +758,16 @@ const ModesView = ({ onDone }: ModesViewProps) => {
741758
{visualMode && findModeBySlug(visualMode, customModes) && (
742759
<div className="flex gap-3 mb-4">
743760
<div className="flex-1">
744-
<div className="font-bold mb-1">{t("prompts:createModeDialog.name.label")}</div>
761+
<div className="flex items-center gap-1.5 mb-1">
762+
<span className="font-bold">{t("prompts:createModeDialog.name.label")}</span>
763+
{findModeBySlug(visualMode, customModes)?.source && (
764+
<span className="text-[10px] px-1 py-0.5 rounded bg-vscode-badge-background text-vscode-badge-foreground">
765+
{findModeBySlug(visualMode, customModes)?.source === "project"
766+
? t("common:scope.project")
767+
: t("common:scope.global")}
768+
</span>
769+
)}
770+
</div>
745771
<div className="flex gap-2">
746772
<Input
747773
type="text"

0 commit comments

Comments
 (0)