{children}
@@ -357,7 +357,7 @@ function MarkdownContent({ content }: { content: string }) {
}
return (
-
+
{children}
)
@@ -374,7 +374,7 @@ function MarkdownContent({ content }: { content: string }) {
},
th({ children }: { children?: React.ReactNode }) {
return (
-
+
{children}
)
@@ -424,7 +424,7 @@ function MarkdownContent({ content }: { content: string }) {
},
img({ alt, src }: { alt?: string; src?: string }) {
return (
-
+
πΌ {alt || src || "image"}
)
@@ -559,7 +559,7 @@ function TuiSelectPrompt({
data-testid="tui-select-prompt"
tabIndex={0}
onKeyDown={handleKeyDown}
- className="mt-2 rounded-xl border border-border/60 bg-background/60 p-1.5 shadow-sm outline-none focus-visible:ring-1 focus-visible:ring-border"
+ className="mt-2 rounded-xl border border-border bg-background p-1.5 shadow-sm outline-none focus-visible:ring-1 focus-visible:ring-border"
aria-label={`Select: ${prompt.label}`}
role="listbox"
aria-activedescendant={`tui-select-option-${localIndex}`}
@@ -584,7 +584,7 @@ function TuiSelectPrompt({
"flex w-full items-start gap-2 rounded-lg px-3 py-1.5 text-left text-sm transition-colors",
isSelected
? "bg-primary/15 text-primary font-medium"
- : "text-foreground hover:bg-muted/60",
+ : "text-foreground hover:bg-muted",
)}
>
@@ -671,7 +671,7 @@ function TuiTextPrompt({
return (
{prompt.label && (
@@ -695,7 +695,7 @@ function TuiTextPrompt({
"flex h-8 items-center justify-center rounded-lg px-3 text-xs font-medium transition-all",
value.trim()
? "bg-primary text-primary-foreground hover:bg-primary/90 active:scale-95 shadow-sm"
- : "bg-muted text-muted-foreground/40 cursor-not-allowed",
+ : "bg-muted text-muted-foreground cursor-not-allowed",
)}
>
Submit
@@ -771,7 +771,7 @@ function TuiPasswordPrompt({
return (
{prompt.label && (
@@ -796,7 +796,7 @@ function TuiPasswordPrompt({
onClick={() => setShowPassword((s) => !s)}
tabIndex={-1}
aria-label={showPassword ? "Hide input" : "Show input"}
- className="absolute right-2.5 top-1/2 -translate-y-1/2 text-muted-foreground/50 hover:text-muted-foreground transition-colors"
+ className="absolute right-2.5 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-muted-foreground transition-colors"
>
{showPassword ? (
@@ -812,13 +812,13 @@ function TuiPasswordPrompt({
"flex h-8 items-center justify-center rounded-lg px-3 text-xs font-medium transition-all",
value
? "bg-primary text-primary-foreground hover:bg-primary/90 active:scale-95 shadow-sm"
- : "bg-muted text-muted-foreground/40 cursor-not-allowed",
+ : "bg-muted text-muted-foreground cursor-not-allowed",
)}
>
Submit
-
+
Value is transmitted securely and not stored in chat history.
@@ -910,7 +910,7 @@ function InlineThinking({ content, isStreaming }: { content: string; isStreaming
onClick={() => setExpanded((e) => !e)}
className={cn(
"group w-full rounded-xl border px-3.5 py-2.5 text-left transition-all",
- "border-border/40 bg-muted/20 hover:bg-muted/30",
+ "border-border/50 bg-muted/50 hover:bg-muted/50",
)}
>
{/* Header row */}
@@ -922,21 +922,21 @@ function InlineThinking({ content, isStreaming }: { content: string; isStreaming
) : (
- π
+ π
)}
-
+
{isStreaming ? "Thinkingβ¦" : "Thought process"}
{hasMore && !expanded && (
-
+
{lines.length} lines
)}
{expanded
- ?
- :
+ ?
+ :
}
@@ -945,7 +945,7 @@ function InlineThinking({ content, isStreaming }: { content: string; isStreaming
{!expanded && (
{previewLines.map((line, i) => (
-
+
{line}
))}
@@ -957,7 +957,7 @@ function InlineThinking({ content, isStreaming }: { content: string; isStreaming
{expanded && (
{content}
{isStreaming && }
@@ -991,7 +991,7 @@ function ChatBubble({
if (message.role === "system") {
return (
-
+
{message.content}
@@ -1047,7 +1047,7 @@ function ChatBubble({
-
+
{/* Minimal waiting indicator β shown when streaming starts but no content yet */}
{isThinking && !message.content && (
@@ -1055,7 +1055,7 @@ function ChatBubble({
-
+
Thinkingβ¦
@@ -1326,7 +1326,7 @@ function ChatInputBar({
const overflowGroups = useMemo(() => groupByCategory(OVERFLOW_ACTIONS), [])
return (
-
+
@@ -1367,7 +1367,7 @@ function ChatInputBar({
))}
{imageNotice && (
- {imageNotice}
+ {imageNotice}
)}
)}
@@ -1386,12 +1386,12 @@ function ChatInputBar({
? "Messageβ¦"
: "Connectingβ¦"
}
- className="min-h-[40px] flex-1 resize-none bg-transparent px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground/50 focus:outline-none disabled:cursor-not-allowed disabled:text-muted-foreground"
+ className="min-h-[40px] flex-1 resize-none bg-transparent px-3 py-2.5 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none disabled:cursor-not-allowed disabled:text-muted-foreground"
style={{ height: "40px", maxHeight: "160px", overflowY: "auto" }}
/>
{!connected && (
-
+
Disconnected
)}
@@ -1403,7 +1403,7 @@ function ChatInputBar({
"flex h-7 w-7 items-center justify-center rounded-lg transition-all",
hasContent && connected
? "bg-primary text-primary-foreground shadow-sm hover:bg-primary/90 active:scale-95"
- : "bg-muted text-muted-foreground/40 cursor-not-allowed",
+ : "bg-muted text-muted-foreground cursor-not-allowed",
)}
>
@@ -1476,7 +1476,7 @@ function ChatInputBar({
{overflowGroups.map((group, gi) => (
{gi > 0 && }
-
+
{group.label}
{group.items.map((action) => {
@@ -1542,9 +1542,9 @@ function PlaceholderState({
{showSpinner ? (
-
+
) : (
-
+
)}
@@ -1608,7 +1608,7 @@ function InlineUiRequest({ request }: { request: PendingUiRequest }) {
-
+
{request.title && (
{request.title}
)}
@@ -1675,7 +1675,7 @@ function InlineSelect({
disabled={disabled}
className={cn(
"flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm transition-colors",
- checked ? "bg-primary/15 text-primary font-medium" : "text-foreground hover:bg-muted/60",
+ checked ? "bg-primary/15 text-primary font-medium" : "text-foreground hover:bg-muted",
)}
>
@@ -1693,7 +1693,7 @@ function InlineSelect({
disabled={disabled}
className={cn(
"flex w-full items-center gap-2.5 rounded-lg px-3 py-2 text-left text-sm transition-colors",
- selected ? "bg-primary/15 text-primary font-medium" : "text-foreground hover:bg-muted/60",
+ selected ? "bg-primary/15 text-primary font-medium" : "text-foreground hover:bg-muted",
)}
>
@@ -1714,7 +1714,7 @@ function InlineSelect({
"mt-2 flex w-full items-center justify-center rounded-lg px-3 py-2 text-xs font-medium transition-all",
canSubmit && !disabled
? "bg-primary text-primary-foreground hover:bg-primary/90 active:scale-[0.98] shadow-sm"
- : "bg-muted text-muted-foreground/40 cursor-not-allowed",
+ : "bg-muted text-muted-foreground cursor-not-allowed",
)}
>
{isMulti ? `Submit (${multiValues.size})` : "Submit"}
@@ -1816,7 +1816,7 @@ function InlineInput({
"flex h-8 items-center justify-center rounded-lg px-3 text-xs font-medium transition-all",
value.trim() && !disabled
? "bg-primary text-primary-foreground hover:bg-primary/90 active:scale-95 shadow-sm"
- : "bg-muted text-muted-foreground/40 cursor-not-allowed",
+ : "bg-muted text-muted-foreground cursor-not-allowed",
)}
>
Submit
@@ -1927,12 +1927,12 @@ function ToolExecutionBlock({ tool }: { tool: CompletedToolExecution }) {
"w-full rounded-lg border px-3 py-2 text-left text-xs transition-colors",
isError
? "border-destructive/30 bg-destructive/5 hover:bg-destructive/10"
- : "border-border/40 bg-muted/20 hover:bg-muted/30",
+ : "border-border/50 bg-muted/50 hover:bg-muted/50",
)}
>
{/* Header */}
-
+
{icon}
@@ -1942,16 +1942,16 @@ function ToolExecutionBlock({ tool }: { tool: CompletedToolExecution }) {
{shortPath}
)}
{bashCommand && !shortPath && (
- {bashCommand.length > 60 ? bashCommand.slice(0, 60) + "β¦" : bashCommand}
+ {bashCommand.length > 60 ? bashCommand.slice(0, 60) + "β¦" : bashCommand}
)}
-
+
{expanded ? : }
{/* Expanded content */}
{expanded && diff && (
-
+
{diff.split("\n").map((line, i) => {
const isAdd = line.startsWith("+")
const isRemove = line.startsWith("-")
@@ -1963,8 +1963,8 @@ function ToolExecutionBlock({ tool }: { tool: CompletedToolExecution }) {
"whitespace-pre",
isAdd && "bg-success/10 text-success",
isRemove && "bg-destructive/10 text-destructive",
- isContext && "text-muted-foreground/60",
- !isAdd && !isRemove && !isContext && "text-muted-foreground/40",
+ isContext && "text-muted-foreground",
+ !isAdd && !isRemove && !isContext && "text-muted-foreground",
)}
>
{line}
@@ -1976,7 +1976,7 @@ function ToolExecutionBlock({ tool }: { tool: CompletedToolExecution }) {
{/* Expanded: bash output or other result */}
{expanded && !diff && resultText && (
-
+
{resultText.length > 2000 ? resultText.slice(0, 2000) + "\nβ¦" : resultText}
)}
@@ -2291,8 +2291,8 @@ export function ChatPane({ className, onOpenAction }: ChatPaneProps) {
-
-
+
+
{item.tool.name}
diff --git a/web/components/gsd/code-editor.tsx b/web/components/gsd/code-editor.tsx
index 2243fb8f1..164b1ce0c 100644
--- a/web/components/gsd/code-editor.tsx
+++ b/web/components/gsd/code-editor.tsx
@@ -78,7 +78,7 @@ const darkTheme = createTheme({
selection: "oklch(0.2 0 0)",
lineHighlight: "oklch(0.12 0 0)",
gutterBackground: "oklch(0.09 0 0)",
- gutterForeground: "oklch(0.35 0 0)",
+ gutterForeground: "oklch(0.42 0 0)",
gutterBorder: "transparent",
},
styles: darkStyles,
diff --git a/web/components/gsd/command-surface.tsx b/web/components/gsd/command-surface.tsx
index 90a8baa0d..29e434f3a 100644
--- a/web/components/gsd/command-surface.tsx
+++ b/web/components/gsd/command-surface.tsx
@@ -224,7 +224,7 @@ function SectionHeader({
return (
- {title}
+ {title}
{status}
{action}
@@ -290,7 +290,7 @@ function SegmentedControl({
disabled?: boolean
}) {
return (
-
+
{options.map((opt) => (