diff --git a/apps/code/src/renderer/components/ui/combobox/Combobox.css b/apps/code/src/renderer/components/ui/combobox/Combobox.css index b00067e84..06d2ce115 100644 --- a/apps/code/src/renderer/components/ui/combobox/Combobox.css +++ b/apps/code/src/renderer/components/ui/combobox/Combobox.css @@ -381,7 +381,7 @@ .combobox-trigger.size-1 { height: var(--space-5); - gap: var(--space-1); + gap: var(--space-2); font-size: var(--font-size-1); line-height: var(--line-height-1); letter-spacing: var(--letter-spacing-1); @@ -586,7 +586,7 @@ } .combobox-trigger.variant-outline { - color: var(--gray-11); + color: var(--gray-12); background-color: transparent; box-shadow: inset 0 0 0 1px var(--gray-a7); } @@ -609,7 +609,7 @@ } .combobox-trigger.variant-outline .combobox-trigger-icon { - color: var(--gray-11); + color: var(--gray-12); } .combobox-trigger:disabled .combobox-trigger-icon { diff --git a/apps/code/src/renderer/components/ui/combobox/Combobox.tsx b/apps/code/src/renderer/components/ui/combobox/Combobox.tsx index 41a128115..d36c7dc2b 100644 --- a/apps/code/src/renderer/components/ui/combobox/Combobox.tsx +++ b/apps/code/src/renderer/components/ui/combobox/Combobox.tsx @@ -1,5 +1,7 @@ -import { CaretDown, Check, MagnifyingGlass } from "@phosphor-icons/react"; -import { Popover } from "@radix-ui/themes"; +import { Check, MagnifyingGlass } from "@phosphor-icons/react"; +import { ChevronDownIcon } from "@radix-ui/react-icons"; +import { Button, Flex, Popover } from "@radix-ui/themes"; +import type { Responsive } from "@radix-ui/themes/dist/esm/props/prop-def.js"; import { Command as CmdkCommand } from "cmdk"; import React, { createContext, @@ -15,12 +17,6 @@ import "./Combobox.css"; import { useComboboxFilter } from "./useComboboxFilter"; type ComboboxSize = "1" | "2" | "3"; -type ComboboxTriggerVariant = - | "classic" - | "surface" - | "soft" - | "ghost" - | "outline"; type ComboboxContentVariant = "solid" | "soft"; interface ComboboxContextValue { @@ -150,7 +146,7 @@ function ComboboxRoot({ interface ComboboxTriggerProps { children?: React.ReactNode; className?: string; - variant?: ComboboxTriggerVariant; + variant?: "outline" | "ghost" | "surface" | "soft" | "classic"; color?: string; placeholder?: string; style?: React.CSSProperties; @@ -159,7 +155,7 @@ interface ComboboxTriggerProps { function ComboboxTrigger({ children, className = "", - variant = "surface", + variant = "outline", placeholder = "Select...", style, }: ComboboxTriggerProps) { @@ -167,25 +163,25 @@ function ComboboxTrigger({ const displayValue = children ?? (getItemLabel(value) || value || placeholder); - const hasPlaceholder = !children && !value; return ( - + + + {displayValue} + + {!disabled && } + + ); } diff --git a/apps/code/src/renderer/features/command-center/components/CommandCenterToolbar.tsx b/apps/code/src/renderer/features/command-center/components/CommandCenterToolbar.tsx index 60574aa6a..567574fba 100644 --- a/apps/code/src/renderer/features/command-center/components/CommandCenterToolbar.tsx +++ b/apps/code/src/renderer/features/command-center/components/CommandCenterToolbar.tsx @@ -118,7 +118,7 @@ export function CommandCenterToolbar({ gap="3" px="3" py="2" - className="shrink-0 border-gray-6 border-b" + className="no-drag shrink-0 border-gray-6 border-b" > + {showSpinner ? ( ) : ( diff --git a/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx b/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx index 7d2e9743b..aa5e0b847 100644 --- a/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx +++ b/apps/code/src/renderer/features/message-editor/components/ModeIndicatorInput.tsx @@ -90,8 +90,10 @@ export function ModeIndicatorInput({ diff --git a/apps/code/src/renderer/features/message-editor/components/message-editor.css b/apps/code/src/renderer/features/message-editor/components/message-editor.css index 90d5e5c21..5beead9cb 100644 --- a/apps/code/src/renderer/features/message-editor/components/message-editor.css +++ b/apps/code/src/renderer/features/message-editor/components/message-editor.css @@ -1,7 +1,7 @@ /* Tiptap placeholder - targets empty first paragraph */ .cli-editor p.is-editor-empty:first-child::before { content: attr(data-placeholder); - color: var(--gray-11); + color: var(--gray-8); pointer-events: none; float: left; height: 0; diff --git a/apps/code/src/renderer/features/message-editor/stores/taskInputHistoryStore.ts b/apps/code/src/renderer/features/message-editor/stores/taskInputHistoryStore.ts index 367166f50..9083e762a 100644 --- a/apps/code/src/renderer/features/message-editor/stores/taskInputHistoryStore.ts +++ b/apps/code/src/renderer/features/message-editor/stores/taskInputHistoryStore.ts @@ -11,7 +11,7 @@ interface TaskInputHistoryActions { type TaskInputHistoryStore = TaskInputHistoryState & TaskInputHistoryActions; -const MAX_HISTORY = 50; +const MAX_HISTORY = 15; export const useTaskInputHistoryStore = create()( persist( diff --git a/apps/code/src/renderer/features/message-editor/tiptap/useTiptapEditor.ts b/apps/code/src/renderer/features/message-editor/tiptap/useTiptapEditor.ts index a5752157a..27761a1c3 100644 --- a/apps/code/src/renderer/features/message-editor/tiptap/useTiptapEditor.ts +++ b/apps/code/src/renderer/features/message-editor/tiptap/useTiptapEditor.ts @@ -38,7 +38,7 @@ export interface UseTiptapEditorOptions { } const EDITOR_CLASS = - "cli-editor min-h-[1.5em] w-full break-words border-none bg-transparent pr-2 text-[13px] text-[var(--gray-12)] outline-none [overflow-wrap:break-word] [white-space:pre-wrap] [word-break:break-word]"; + "cli-editor min-h-[1.5em] w-full break-words border-none bg-transparent pr-2 text-[14px] text-[var(--gray-12)] outline-none [overflow-wrap:break-word] [white-space:pre-wrap] [word-break:break-word]"; async function pasteTextAsFile( view: EditorView, diff --git a/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx b/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx index df4b15c77..9270d9dee 100644 --- a/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx +++ b/apps/code/src/renderer/features/sessions/components/ReasoningLevelSelector.tsx @@ -1,6 +1,6 @@ import type { SessionConfigOption } from "@agentclientprotocol/sdk"; -import { Brain } from "@phosphor-icons/react"; -import { Flex, Select, Text } from "@radix-ui/themes"; +import { Brain, CaretDown, Check } from "@phosphor-icons/react"; +import { Button, DropdownMenu, Flex, Text } from "@radix-ui/themes"; import { flattenSelectOptions } from "../stores/sessionStore"; interface ReasoningLevelSelectorProps { @@ -10,6 +10,16 @@ interface ReasoningLevelSelectorProps { disabled?: boolean; } +const triggerStyle = { + fontSize: "var(--font-size-1)", + color: "var(--gray-11)", + padding: "4px 8px", + height: "auto", + minHeight: "unset", + gap: "6px", + userSelect: "none" as const, +}; + export function ReasoningLevelSelector({ thoughtOption, adapter, @@ -27,25 +37,9 @@ export function ReasoningLevelSelector({ options.find((opt) => opt.value === activeLevel)?.name ?? activeLevel; return ( - onChange?.(value)} - disabled={disabled} - size="1" - > - - + + + + + + {options.map((level) => ( - - {level.name} - + onChange?.(level.value)} + > + + + {level.name} + + ))} - - + + ); } diff --git a/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx b/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx index b18359cd4..738197f9f 100644 --- a/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx +++ b/apps/code/src/renderer/features/sessions/components/UnifiedModelSelector.tsx @@ -5,6 +5,7 @@ import type { import type { AgentAdapter } from "@features/settings/stores/settingsStore"; import { ArrowsClockwise, + CaretDown, Check, Cpu, Robot, @@ -71,10 +72,10 @@ export function UnifiedModelSelector({ fontSize: "var(--font-size-1)", color: "var(--gray-11)", padding: "4px 8px", - marginLeft: "4px", height: "auto", minHeight: "unset", gap: "6px", + userSelect: "none" as const, }; if (isConnecting) { @@ -123,6 +124,11 @@ export function UnifiedModelSelector({ {ADAPTER_ICONS[adapter]} {currentLabel ?? "Model"} + diff --git a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx index 6d5f29456..e0d47a552 100644 --- a/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx +++ b/apps/code/src/renderer/features/sidebar/components/TaskListView.tsx @@ -360,7 +360,22 @@ export function TaskListView({ } /> - {organizeMode === "by-project" ? ( + {pinnedTasks.length === 0 && + flatTasks.length === 0 && + groupedTasks.length === 0 ? ( +
+ + No tasks yet + + +
+ ) : organizeMode === "by-project" ? ( s.prompts.length > 0); + const getPromptHistory = useCallback( () => useTaskInputHistoryStore.getState().prompts, [], ); + const hints = [ + "@ to add files", + "/ for skills", + hasHistory ? "\u2191\u2193 for history" : "", + ] + .filter(Boolean) + .join(", "); + const { editor, isEmpty, @@ -85,8 +95,7 @@ export const TaskInputEditor = forwardRef< removeAttachment, } = useTiptapEditor({ sessionId, - placeholder: - "What do you want to work on? \u2191\u2193 for history, @ to add context", + placeholder: `What do you want to ship? ${hints}`, disabled: isCreatingTask, submitDisabled: !isOnline, isLoading: isCreatingTask, @@ -180,7 +189,7 @@ export const TaskInputEditor = forwardRef< > - - + +