diff --git a/src/components/ChatInput.tsx b/src/components/ChatInput.tsx index d1ebdc214..bfe13a27b 100644 --- a/src/components/ChatInput.tsx +++ b/src/components/ChatInput.tsx @@ -27,7 +27,7 @@ import { prepareCompactionMessage, type CommandHandlerContext, } from "@/utils/chatCommands"; -import { ToggleGroup } from "./ToggleGroup"; +import { ToggleGroup, type ToggleOption } from "./ToggleGroup"; import { CUSTOM_EVENTS } from "@/constants/events"; import type { UIMode } from "@/types/mode"; import { @@ -88,6 +88,25 @@ export interface ChatInputAPI { appendText: (text: string) => void; } +const MODE_OPTIONS: Array> = [ + { value: "exec", label: "Exec", activeClassName: "bg-exec-mode text-white" }, + { value: "plan", label: "Plan", activeClassName: "bg-plan-mode text-white" }, +]; + +const ModeHelpTooltip: React.FC = () => ( + + ? + + Exec Mode: AI edits files and execute commands +
+
+ Plan Mode: AI proposes plans but does not edit files +
+
+ Toggle with: {formatKeybind(KEYBINDS.TOGGLE_MODE)} +
+
+); export interface ChatInputProps { workspaceId: string; onMessageSent?: () => void; // Optional callback after successful send @@ -847,18 +866,19 @@ export const ChatInput: React.FC = ({ - {/* Thinking Slider - hide on small viewports */} + {/* Thinking Slider - slider hidden on narrow viewports, label always clickable */}
- {/* Context 1M Checkbox - hide on smaller viewports */} -
+ {/* Context 1M Checkbox - always visible */} +
+ {preferredModel && (
= ({
)} + + {/* Mode Switch - full version for wide viewports */}
= ({ "[&>button:last-of-type]:bg-plan-mode [&>button:last-of-type]:text-white [&>button:last-of-type]:hover:bg-plan-mode-hover" )} > - - options={[ - { value: "exec", label: "Exec", activeClassName: "bg-exec-mode text-white" }, - { value: "plan", label: "Plan", activeClassName: "bg-plan-mode text-white" }, - ]} - value={mode} - onChange={setMode} - /> + options={MODE_OPTIONS} value={mode} onChange={setMode} />
- - ? - - Exec Mode: AI edits files and execute commands -
-
- Plan Mode: AI proposes plans but does not edit files -
-
- Toggle with: {formatKeybind(KEYBINDS.TOGGLE_MODE)} -
-
+ +
+ + {/* Mode Switch - compact version for narrow viewports */} +
+ options={MODE_OPTIONS} value={mode} onChange={setMode} compact /> +
diff --git a/src/components/Context1MCheckbox.tsx b/src/components/Context1MCheckbox.tsx index 37e6290b3..e98ad1831 100644 --- a/src/components/Context1MCheckbox.tsx +++ b/src/components/Context1MCheckbox.tsx @@ -19,7 +19,7 @@ export const Context1MCheckbox: React.FC = ({ modelStrin
? diff --git a/src/components/ThinkingSlider.tsx b/src/components/ThinkingSlider.tsx index 56b9bc412..8d58d7cce 100644 --- a/src/components/ThinkingSlider.tsx +++ b/src/components/ThinkingSlider.tsx @@ -124,6 +124,13 @@ export const ThinkingSliderComponent: React.FC = ({ modelS } }; + // Cycle through allowed thinking levels: off → low → medium → high → off + const cycleThinkingLevel = () => { + const currentIndex = THINKING_LEVELS.indexOf(thinkingLevel); + const nextIndex = (currentIndex + 1) % THINKING_LEVELS.length; + handleThinkingLevelChange(THINKING_LEVELS[nextIndex]); + }; + return (
@@ -154,16 +161,23 @@ export const ThinkingSliderComponent: React.FC = ({ modelS } as React.CSSProperties } /> - - {thinkingLevel} - + + {thinkingLevel} + +
- Thinking: {formatKeybind(KEYBINDS.TOGGLE_THINKING)} to toggle + Thinking: {formatKeybind(KEYBINDS.TOGGLE_THINKING)} to toggle. Click level to cycle.
); diff --git a/src/components/ToggleGroup.tsx b/src/components/ToggleGroup.tsx index 6388a2a65..bc223e646 100644 --- a/src/components/ToggleGroup.tsx +++ b/src/components/ToggleGroup.tsx @@ -10,9 +10,37 @@ interface ToggleGroupProps { options: Array>; value: T; onChange: (value: T) => void; + compact?: boolean; // If true, show only active option as clickable badge } -export function ToggleGroup({ options, value, onChange }: ToggleGroupProps) { +export function ToggleGroup({ + options, + value, + onChange, + compact = false, +}: ToggleGroupProps) { + // Compact mode: show only active option, click cycles to next option + if (compact) { + const currentIndex = options.findIndex((opt) => opt.value === value); + const activeOption = options[currentIndex]; + const nextOption = options[(currentIndex + 1) % options.length]; + + return ( + + ); + } + return (
{options.map((option) => {