From 3a4e8b8d9684e8109c3fceebe205736f9c05fdfa Mon Sep 17 00:00:00 2001 From: Saoud Rizwan <7799382+saoudrizwan@users.noreply.github.com> Date: Tue, 10 Sep 2024 16:25:38 -0400 Subject: [PATCH] Cosmetic updates --- icons/icon.png | Bin 6128 -> 6760 bytes package.json | 2 +- src/integrations/TerminalManager.ts | 3 + webview-ui/src/components/ChatRow.tsx | 46 +-- webview-ui/src/components/ChatView.tsx | 7 +- webview-ui/src/components/CodeAccordian.tsx | 42 ++- webview-ui/src/components/TaskHeader.tsx | 312 ++++++++++++-------- 7 files changed, 238 insertions(+), 174 deletions(-) diff --git a/icons/icon.png b/icons/icon.png index f981fe0f699926940e9a880e35defc0647cafc05..c9dc6a8fa41517f3f644913fd49067409d8b99a7 100644 GIT binary patch delta 6691 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 delta 6054 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 { data = lines.join("\n") } + // sometimes chunks have leading/trailing commas which we'll remove too + data = data.replace(/^,+|,+$/g, "") + // For non-immediately returning commands we want to show loading spinner right away but this wouldnt happen until it emits a line break, so as soon as we get any output we emit "" to let webview know to show spinner if (!didEmitEmptyLine && !this.fullOutput && data) { this.emit("line", "") // empty line to indicate start of command output stream diff --git a/webview-ui/src/components/ChatRow.tsx b/webview-ui/src/components/ChatRow.tsx index 2ca2557..7bad2bf 100644 --- a/webview-ui/src/components/ChatRow.tsx +++ b/webview-ui/src/components/ChatRow.tsx @@ -1,4 +1,4 @@ -import { VSCodeBadge, VSCodeButton, VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react" +import { VSCodeBadge, VSCodeProgressRing } from "@vscode/webview-ui-toolkit/react" import deepEqual from "fast-deep-equal" import React, { memo, useMemo } from "react" import ReactMarkdown from "react-markdown" @@ -103,11 +103,11 @@ const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifiedMessa ), cost != null ? ( - API Request Complete + API Request ) : apiRequestFailedMessage ? ( API Request Failed ) : ( - Making API Request... + API Request... ), ] case "followup": @@ -299,15 +299,19 @@ const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifiedMessa ...headerStyle, marginBottom: cost == null && apiRequestFailedMessage ? 10 : 0, justifyContent: "space-between", - }}> + cursor: "pointer", + userSelect: "none", + WebkitUserSelect: "none", + MozUserSelect: "none", + msUserSelect: "none", + }} + onClick={onToggleExpand}>
{icon} {title} {cost != null && cost > 0 && ${Number(cost)?.toFixed(4)}}
- - - + {cost == null && apiRequestFailedMessage && ( <> @@ -391,24 +395,12 @@ const ChatRowContent = ({ message, isExpanded, onToggleExpand, lastModifiedMessa return (
- - The user made the following changes: - @@ -627,7 +619,8 @@ const Markdown = memo(({ markdown }: { markdown?: string }) => { // react-markdown lets us customize elements, so here we're using their example of replacing code blocks with SyntaxHighlighter. However when there are no language matches (` or ``` without a language specifier) then we default to a normal code element for inline code. Code blocks without a language specifier shouldn't be a common occurrence as we prompt Claude to always use a language specifier. // when claude wraps text in thinking tags, he doesnt use line breaks so we need to insert those ourselves to render markdown correctly const parsed = markdown?.replace(/([\s\S]*?)<\/thinking>/g, (match, content) => { - return `__\n\n${content}\n\n__` + return content + // return `__\n\n${content}\n\n__` }) return (
@@ -704,6 +697,13 @@ const Markdown = memo(({ markdown }: { markdown?: string }) => { whiteSpace: "pre-line", wordBreak: "break-word", overflowWrap: "anywhere", + backgroundColor: "var(--vscode-textCodeBlock-background)", + color: "var(--vscode-textPreformat-foreground)", + fontFamily: "var(--vscode-editor-font-family)", + fontSize: "var(--vscode-editor-font-size)", + borderRadius: "3px", + border: "1px solid var(--vscode-textSeparator-foreground)", + // padding: "2px 4px", }}> {children} diff --git a/webview-ui/src/components/ChatView.tsx b/webview-ui/src/components/ChatView.tsx index 126bb57..10b7e00 100644 --- a/webview-ui/src/components/ChatView.tsx +++ b/webview-ui/src/components/ChatView.tsx @@ -602,11 +602,12 @@ const ChatView = ({ isHidden, showAnnouncement, hideAnnouncement, showHistoryVie // Since we have maxRows, when text is long enough it starts to overflow the bottom padding, appearing behind the thumbnails. To fix this, we use a transparent border to push the text up instead. (https://stackoverflow.com/questions/42631947/maintaining-a-padding-inside-of-text-area/52538410#52538410) borderTop: "9px solid transparent", borderBottom: `${thumbnailsHeight + 9}px solid transparent`, - borderRight: "54px solid transparent", - borderLeft: "9px solid transparent", + borderColor: "transparent", + // borderRight: "54px solid transparent", + // borderLeft: "9px solid transparent", // NOTE: react-textarea-autosize doesn't calculate correct height when using borderLeft/borderRight so we need to use horizontal padding instead // Instead of using boxShadow, we use a div with a border to better replicate the behavior when the textarea is focused // boxShadow: "0px 0px 0px 1px var(--vscode-input-border)", - padding: 0, + padding: "0 50px 0 9px", cursor: textAreaDisabled ? "not-allowed" : undefined, flex: 1, }} diff --git a/webview-ui/src/components/CodeAccordian.tsx b/webview-ui/src/components/CodeAccordian.tsx index d9e2f76..358118c 100644 --- a/webview-ui/src/components/CodeAccordian.tsx +++ b/webview-ui/src/components/CodeAccordian.tsx @@ -7,6 +7,7 @@ interface CodeAccordianProps { diff?: string language?: string | undefined path?: string + isFeedback?: boolean isExpanded: boolean onToggleExpand: () => void } @@ -19,7 +20,7 @@ The replace method removes these matched characters, effectively trimming the st */ const removeLeadingNonAlphanumeric = (path: string): string => path.replace(/^[^a-zA-Z0-9]+/, "") -const CodeAccordian = ({ code, diff, language, path, isExpanded, onToggleExpand }: CodeAccordianProps) => { +const CodeAccordian = ({ code, diff, language, path, isFeedback, isExpanded, onToggleExpand }: CodeAccordianProps) => { const inferredLanguage = useMemo( () => code && (language ?? (path ? getLanguageFromPath(path) : undefined)), [path, language, code] @@ -33,7 +34,7 @@ const CodeAccordian = ({ code, diff, language, path, isExpanded, onToggleExpand overflow: "hidden", // This ensures the inner scrollable area doesn't overflow the rounded corners border: "1px solid var(--vscode-editorGroup-border)", }}> - {path && ( + {(path || isFeedback) && (
- - {removeLeadingNonAlphanumeric(path) + "\u200E"} - +
+ {isFeedback && ( + + )} + + {isFeedback ? "User Edits" : removeLeadingNonAlphanumeric(path ?? "") + "\u200E"} + +
)} - {(!path || isExpanded) && ( + {(!(path || isFeedback) || isExpanded) && (
= ({ onClose, }) => { const { apiConfiguration } = useExtensionState() - const [isExpanded, setIsExpanded] = useState(false) + const [isTaskExpanded, setIsTaskExpanded] = useState(true) + const [isTextExpanded, setIsTextExpanded] = useState(false) const [showSeeMore, setShowSeeMore] = useState(false) const textContainerRef = useRef(null) const textRef = useRef(null) @@ -68,11 +69,11 @@ const TaskHeader: React.FC = ({ const { height: windowHeight, width: windowWidth } = useWindowSize() useEffect(() => { - if (isExpanded && textContainerRef.current) { + if (isTextExpanded && textContainerRef.current) { const maxHeight = windowHeight * (1 / 2) textContainerRef.current.style.maxHeight = `${maxHeight}px` } - }, [isExpanded, windowHeight]) + }, [isTextExpanded, windowHeight]) useEffect(() => { if (textRef.current && textContainerRef.current) { @@ -83,7 +84,7 @@ const TaskHeader: React.FC = ({ const isOverflowing = textRef.current.scrollHeight > textContainerHeight // necessary to show see more button again if user resizes window to expand and then back to collapse if (!isOverflowing) { - setIsExpanded(false) + setIsTextExpanded(false) } setShowSeeMore(isOverflowing) } @@ -96,10 +97,10 @@ const TaskHeader: React.FC = ({ backgroundColor: "var(--vscode-badge-background)", color: "var(--vscode-badge-foreground)", borderRadius: "3px", - padding: "12px", + padding: "9px 10px 9px 14px", display: "flex", flexDirection: "column", - gap: "8px", + gap: 6, position: "relative", zIndex: 1, }}> @@ -109,144 +110,191 @@ const TaskHeader: React.FC = ({ justifyContent: "space-between", alignItems: "center", }}> - Task - +
setIsTaskExpanded(!isTaskExpanded)}> +
+ +
+
+ Task{!isTaskExpanded && ":"} + {!isTaskExpanded && {task.text}} +
+
+ {!isTaskExpanded && ( +
+ ${totalCost?.toFixed(4)} +
+ )} +
-
-
- {task.text} -
- {!isExpanded && showSeeMore && ( + {isTaskExpanded && ( + <>
+ display: "-webkit-box", + WebkitLineClamp: isTextExpanded ? "unset" : 3, + WebkitBoxOrient: "vertical", + overflow: "hidden", + whiteSpace: "pre-wrap", + wordBreak: "break-word", + overflowWrap: "anywhere", + }}> + {task.text} +
+ {!isTextExpanded && showSeeMore && ( +
+
+
setIsTextExpanded(!isTextExpanded)}> + See more +
+
+ )} +
+ {isTextExpanded && showSeeMore && (
setIsExpanded(!isExpanded)}> - See more + onClick={() => setIsTextExpanded(!isTextExpanded)}> + See less
-
- )} -
- {isExpanded && showSeeMore && ( -
setIsExpanded(!isExpanded)}> - See less -
- )} - {task.images && task.images.length > 0 && } -
-
-
- Tokens: - - - {tokensIn?.toLocaleString()} - - - - {tokensOut?.toLocaleString()} - -
- {(apiConfiguration?.apiProvider === "openai" || apiConfiguration?.apiProvider === "ollama") && ( - )} -
- - {(doesModelSupportPromptCache || cacheReads !== undefined || cacheWrites !== undefined) && ( -
- Cache: - - - +{(cacheWrites || 0)?.toLocaleString()} - - - - {(cacheReads || 0)?.toLocaleString()} - -
- )} - {apiConfiguration?.apiProvider !== "openai" && apiConfiguration?.apiProvider !== "ollama" && ( -
-
- API Cost: - ${totalCost?.toFixed(4)} + {task.images && task.images.length > 0 && } +
+
+
+ Tokens: + + + {tokensIn?.toLocaleString()} + + + + {tokensOut?.toLocaleString()} + +
+ {(apiConfiguration?.apiProvider === "openai" || + apiConfiguration?.apiProvider === "ollama") && }
- + + {(doesModelSupportPromptCache || cacheReads !== undefined || cacheWrites !== undefined) && ( +
+ Cache: + + + +{(cacheWrites || 0)?.toLocaleString()} + + + + {(cacheReads || 0)?.toLocaleString()} + +
+ )} + {apiConfiguration?.apiProvider !== "openai" && + apiConfiguration?.apiProvider !== "ollama" && ( +
+
+ API Cost: + ${totalCost?.toFixed(4)} +
+ +
+ )}
- )} -
+ + )}
{/* {apiProvider === "kodu" && (
( vscode.postMessage({ type: "exportCurrentTask" })} - style={{ - marginBottom: "-2px", - marginRight: "-2.5px", - }}> + style={ + { + // marginBottom: "-2px", + // marginRight: "-2.5px", + } + }>
EXPORT
)