From eefa9648c4e0493b485b4771902a8dd28dc414ce Mon Sep 17 00:00:00 2001 From: Mathew Pareles Date: Wed, 9 Apr 2025 01:10:32 -0700 Subject: [PATCH] ui changes --- .../contrib/void/browser/media/void.css | 1 - .../src/markdown/ApplyBlockHoverButtons.tsx | 74 ++++-- .../react/src/sidebar-tsx/SidebarChat.tsx | 222 +++++++++++------- .../VoidSelectionHelper.tsx | 14 ++ .../react/src/void-settings-tsx/Settings.tsx | 3 +- .../react/src/void-tooltip/VoidTooltip.tsx | 45 +++- .../void/common/voidSettingsService.ts | 2 +- .../llmMessage/sendLLMMessage.impl.ts | 2 +- 8 files changed, 245 insertions(+), 118 deletions(-) diff --git a/src/vs/workbench/contrib/void/browser/media/void.css b/src/vs/workbench/contrib/void/browser/media/void.css index 724a8d28..ac5ff5f3 100644 --- a/src/vs/workbench/contrib/void/browser/media/void.css +++ b/src/vs/workbench/contrib/void/browser/media/void.css @@ -78,7 +78,6 @@ /* styles for all containers used by void */ .void-scope { - background-color: var(--vscode-editor-background); --scrollbar-vertical-width: 8px; --scrollbar-horizontal-height: 6px; } diff --git a/src/vs/workbench/contrib/void/browser/react/src/markdown/ApplyBlockHoverButtons.tsx b/src/vs/workbench/contrib/void/browser/react/src/markdown/ApplyBlockHoverButtons.tsx index 6a13d4bc..4e009f7a 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/markdown/ApplyBlockHoverButtons.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/markdown/ApplyBlockHoverButtons.tsx @@ -11,6 +11,7 @@ import { URI } from '../../../../../../../base/common/uri.js' import { FileSymlink, LucideIcon, RotateCw, Terminal } from 'lucide-react' import { Check, X, Square, Copy, Play, } from 'lucide-react' import { getBasename, ListableToolItem, ToolChildrenWrapper } from '../sidebar-tsx/SidebarChat.js' +import { PlacesType, VariantType } from 'react-tooltip' enum CopyButtonText { Idle = 'Copy', @@ -31,13 +32,13 @@ export const IconShell1 = ({ onClick, Icon, disabled, className, ...props }: Ico e.stopPropagation(); onClick?.(e); }} + // border border-void-border-1 rounded className={` - size-[22px] - p-[4px] + size-[18px] + p-[2px] flex items-center justify-center - text-sm bg-void-bg-3 text-void-fg-1 + text-sm bg-void-bg-3 text-void-fg-3 hover:brightness-110 - border border-void-border-1 rounded disabled:opacity-50 disabled:cursor-not-allowed ${className} `} @@ -92,13 +93,14 @@ export const CopyButton = ({ codeStr }: { codeStr: string }) => { return } -export const JumpToFileButton = ({ uri }: { uri: URI | 'current' }) => { +export const JumpToFileButton = ({ uri, ...props }: { uri: URI | 'current' } & React.ButtonHTMLAttributes) => { const accessor = useAccessor() const commandService = accessor.get('ICommandService') @@ -108,6 +110,8 @@ export const JumpToFileButton = ({ uri }: { uri: URI | 'current' }) => { onClick={() => { commandService.executeCommand('vscode.open', uri, { preview: true }) }} + {...tooltipPropsForApplyBlock({ tooltipName: 'Goto file' })} + {...props} /> ) return jumpToFileButton @@ -120,7 +124,6 @@ export const JumpToTerminalButton = ({ onClick }: { onClick: () => void }) => { ) } @@ -174,16 +177,18 @@ export const useApplyButtonState = ({ applyBoxId, uri }: { applyBoxId: string, u } -export const StatusIndicator = ({ color, title, className }: { color: 'green' | 'orange' | 'dark' | null, title?: React.ReactNode, className?: string }) => { +type IndicatorColor = 'green' | 'orange' | 'dark' | 'yellow' | null +export const StatusIndicator = ({ indicatorColor, title, className, ...props }: { indicatorColor: IndicatorColor, title?: React.ReactNode, className?: string } & React.HTMLAttributes) => { return ( -
- {title && {title}} +
+ {title && {title}}
@@ -191,7 +196,15 @@ export const StatusIndicator = ({ color, title, className }: { color: 'green' | ); }; -export const StatusIndicatorForApplyButton = ({ applyBoxId, uri }: { applyBoxId: string, uri: URI | 'current' }) => { +const tooltipPropsForApplyBlock = ({ tooltipName, color = undefined, position = 'top-end', offset = undefined }: { tooltipName: string, color?: IndicatorColor, position?: PlacesType, offset?: number }) => ({ + 'data-tooltip-id': color === 'orange' ? `void-tooltip-orange` : color === 'green' ? 'void-tooltip-green' : 'void-tooltip', + 'data-tooltip-place': position as PlacesType, + 'data-tooltip-content': `${tooltipName}`, + 'data-tooltip-offset': offset, +}) + + +export const StatusIndicatorForApplyButton = ({ applyBoxId, uri }: { applyBoxId: string, uri: URI | 'current' } & React.HTMLAttributes) => { const { currStreamState } = useApplyButtonState({ applyBoxId, uri }) @@ -202,7 +215,19 @@ export const StatusIndicatorForApplyButton = ({ applyBoxId, uri }: { applyBoxId: null ) - const statusIndicatorHTML = + const tooltipName = ( + currStreamState === 'idle-no-changes' ? 'Done' : + currStreamState === 'streaming' ? 'Applying' : + currStreamState === 'idle-has-changes' ? 'Done' : // also 'Done'? 'Applied' looked bad + '' + ) + + const statusIndicatorHTML = return statusIndicatorHTML } @@ -267,11 +292,22 @@ export const ApplyButtonsHTML = ({ codeStr, applyBoxId, reapplyIcon, uri }: { co if (currStreamState === 'streaming') { - return + return } if (currStreamState === 'idle-no-changes') { - return + + return } if (currStreamState === 'idle-has-changes') { @@ -283,12 +319,12 @@ export const ApplyButtonsHTML = ({ codeStr, applyBoxId, reapplyIcon, uri }: { co } diff --git a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx index 57ea58e8..6a3da4ba 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/sidebar-tsx/SidebarChat.tsx @@ -23,9 +23,10 @@ import { getModelCapabilities, getIsReasoningEnabledState } from '../../../../co import { AlertTriangle, Ban, Check, ChevronRight, Dot, FileIcon, Pencil, Undo, Undo2, X } from 'lucide-react'; import { ChatMessage, CheckpointEntry, StagingSelectionItem, ToolMessage } from '../../../../common/chatThreadServiceTypes.js'; import { ToolCallParams, ToolName, toolNames, ToolNameWithApproval } from '../../../../common/toolsServiceTypes.js'; -import { ApplyButtonsHTML, CopyButton, JumpToFileButton, JumpToTerminalButton, StatusIndicator, StatusIndicatorForApplyButton, useApplyButtonState } from '../markdown/ApplyBlockHoverButtons.js'; +import { ApplyButtonsHTML, CopyButton, IconShell1, JumpToFileButton, JumpToTerminalButton, StatusIndicator, StatusIndicatorForApplyButton, useApplyButtonState } from '../markdown/ApplyBlockHoverButtons.js'; import { IsRunningType } from '../../../chatThreadService.js'; import { acceptAllBg, acceptBorder, buttonFontSize, buttonTextColor, rejectAllBg, rejectBg, rejectBorder } from '../../../../common/helpers/colors.js'; +import { PlacesType } from 'react-tooltip'; @@ -391,6 +392,9 @@ export const ButtonSubmit = ({ className, disabled, ...props }: ButtonProps & Re ${disabled ? 'bg-vscode-disabled-fg cursor-default' : 'bg-white cursor-pointer'} ${className} `} + // data-tooltip-id='void-tooltip' + // data-tooltip-content={'Send'} + // data-tooltip-place='left' {...props} > @@ -955,25 +959,32 @@ const UserMessageComponent = ({ chatMessage, messageIdx, isCheckpointGhost, _scr
- { - if (mode === 'display') { - onOpenEdit() - } else if (mode === 'edit') { - onCloseEdit() - } - }} - /> + +
+ { + if (mode === 'display') { + onOpenEdit() + } else if (mode === 'edit') { + onCloseEdit() + } + }} + /> +
+
@@ -1240,7 +1251,7 @@ const ToolRequestAcceptRejectButtons = () => {
+ + {dividerHTML} + +
{ + setClickState('init'); + }} + > + +
return
{ diff --git a/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx b/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx index 21f80ed9..d86a753a 100644 --- a/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx +++ b/src/vs/workbench/contrib/void/browser/react/src/void-tooltip/VoidTooltip.tsx @@ -5,6 +5,7 @@ import { Tooltip } from 'react-tooltip'; import 'react-tooltip/dist/react-tooltip.css'; +import { useIsDark } from '../util/services.js'; /** * Creates a configured global tooltip component with consistent styling @@ -13,6 +14,10 @@ import 'react-tooltip/dist/react-tooltip.css'; * 2. Add data-tooltip-id="void-tooltip" and data-tooltip-content="Your tooltip text" to any element */ export const VoidTooltip = () => { + + + const isDark = useIsDark() + return ( // use native colors so we don't have to worry about @@void-scope styles @@ -39,15 +44,30 @@ export const VoidTooltip = () => { <> @@ -55,7 +75,20 @@ export const VoidTooltip = () => { + + diff --git a/src/vs/workbench/contrib/void/common/voidSettingsService.ts b/src/vs/workbench/contrib/void/common/voidSettingsService.ts index d9d8a584..b4ddb7ab 100644 --- a/src/vs/workbench/contrib/void/common/voidSettingsService.ts +++ b/src/vs/workbench/contrib/void/common/voidSettingsService.ts @@ -95,7 +95,7 @@ const _updatedModelsAfterDefaultModelsChange = (defaultModelNames: string[], opt export const modelFilterOfFeatureName: { [featureName in FeatureName]: { filter: (o: ModelSelection, opts: { chatMode: ChatMode }) => boolean; emptyMessage: null | { message: string, priority: 'always' | 'fallback' } } } = { 'Autocomplete': { filter: (o) => getModelCapabilities(o.providerName, o.modelName).supportsFIM, emptyMessage: { message: 'No models support FIM', priority: 'always' } }, - 'Chat': { filter: (o, { chatMode }) => chatMode === 'normal' ? true : !!getModelCapabilities(o.providerName, o.modelName).supportsTools, emptyMessage: { message: 'No models support tool use', priority: 'fallback' } }, + 'Chat': { filter: o => true, emptyMessage: null, }, 'Ctrl+K': { filter: o => true, emptyMessage: null, }, 'Apply': { filter: o => true, emptyMessage: null, }, } diff --git a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts index 58ccc443..eec26258 100644 --- a/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts +++ b/src/vs/workbench/contrib/void/electron-main/llmMessage/sendLLMMessage.impl.ts @@ -95,7 +95,7 @@ const newOpenAICompatibleSDK = ({ settingsOfProvider, providerName, includeInPay } else if (providerName === 'gemini') { const thisConfig = settingsOfProvider[providerName] - return new OpenAI({ baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai', apiKey: thisConfig.apiKey, ...commonPayloadOpts }) + return new OpenAI({ baseURL: 'https://generativelanguage.googleapis.com/v1beta/openai/', apiKey: thisConfig.apiKey, ...commonPayloadOpts }) } else if (providerName === 'deepseek') { const thisConfig = settingsOfProvider[providerName]