From ef4bede0622c85960c7388225fe90b7a879e93c0 Mon Sep 17 00:00:00 2001 From: MyPrototypeWhat Date: Mon, 29 Sep 2025 12:45:35 +0800 Subject: [PATCH] feat: introduce DescriptionSwitch component and update component exports - Added a new DescriptionSwitch component to enhance the Switch functionality with a description feature. - Updated the exports in index.ts to include the new DescriptionSwitch alongside existing components. - Refactored the SettingsTab to utilize DescriptionSwitch for improved UI consistency. - Removed the InfoPopover component as part of the cleanup process. --- .../{interactive => base}/Selector/index.tsx | 0 .../ui/src/components/base/Switch/index.tsx | 31 ++- packages/ui/src/components/index.ts | 5 +- .../interactive/InfoPopover/index.tsx | 22 -- .../interactive/Selector.stories.tsx | 2 +- .../components/TooltipIcons/HelpTooltip.tsx | 9 +- .../src/pages/home/Tabs/SettingsTab.tsx | 239 +++++++++++------- .../ModelList/ModelListGroup.tsx | 3 +- 8 files changed, 190 insertions(+), 121 deletions(-) rename packages/ui/src/components/{interactive => base}/Selector/index.tsx (100%) delete mode 100644 packages/ui/src/components/interactive/InfoPopover/index.tsx diff --git a/packages/ui/src/components/interactive/Selector/index.tsx b/packages/ui/src/components/base/Selector/index.tsx similarity index 100% rename from packages/ui/src/components/interactive/Selector/index.tsx rename to packages/ui/src/components/base/Selector/index.tsx diff --git a/packages/ui/src/components/base/Switch/index.tsx b/packages/ui/src/components/base/Switch/index.tsx index b3fdf7b989..51d9721603 100644 --- a/packages/ui/src/components/base/Switch/index.tsx +++ b/packages/ui/src/components/base/Switch/index.tsx @@ -1,5 +1,5 @@ import type { SwitchProps } from '@heroui/react' -import { Spinner, Switch } from '@heroui/react' +import { cn, Spinner, Switch } from '@heroui/react' // Enhanced Switch component with loading state support interface CustomSwitchProps extends SwitchProps { @@ -21,7 +21,34 @@ const CustomizedSwitch = ({ isLoading, children, ref, thumbIcon, ...props }: Cus ) } +const DescriptionSwitch = ({ children, ...props }: CustomSwitchProps) => { + return ( + + {children} + + ) +} + CustomizedSwitch.displayName = 'Switch' -export { CustomizedSwitch as Switch } +export { DescriptionSwitch, CustomizedSwitch as Switch } export type { CustomSwitchProps as SwitchProps } diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts index 8add0fbfd1..9999c43ec7 100644 --- a/packages/ui/src/components/index.ts +++ b/packages/ui/src/components/index.ts @@ -11,7 +11,7 @@ export { default as IndicatorLight } from './base/IndicatorLight' export { default as Spinner } from './base/Spinner' export type { StatusTagProps, StatusType } from './base/StatusTag' export { ErrorTag, InfoTag, StatusTag, SuccessTag, WarnTag } from './base/StatusTag' -export { Switch } from './base/Switch' +export { DescriptionSwitch, Switch } from './base/Switch' export { default as TextBadge } from './base/TextBadge' export { getToastUtilities, type ToastUtilities } from './base/Toast' @@ -50,6 +50,7 @@ export { default as SvgSpinners180Ring } from './icons/SvgSpinners180Ring' export { default as ToolsCallingIcon } from './icons/ToolsCallingIcon' // Interactive Components +export { default as Selector } from './base/Selector' export { default as CodeEditor, type CodeEditorHandles, @@ -64,9 +65,7 @@ export type { EditableNumberProps } from './interactive/EditableNumber' export { default as EditableNumber } from './interactive/EditableNumber' export { default as HelpTooltip } from './interactive/HelpTooltip' export { default as ImageToolButton } from './interactive/ImageToolButton' -export { default as InfoPopover } from './interactive/InfoPopover' export { default as InfoTooltip } from './interactive/InfoTooltip' -export { default as Selector } from './interactive/Selector' export { Sortable } from './interactive/Sortable' export { default as WarnTooltip } from './interactive/WarnTooltip' diff --git a/packages/ui/src/components/interactive/InfoPopover/index.tsx b/packages/ui/src/components/interactive/InfoPopover/index.tsx deleted file mode 100644 index 13ead1dd04..0000000000 --- a/packages/ui/src/components/interactive/InfoPopover/index.tsx +++ /dev/null @@ -1,22 +0,0 @@ -// Original path: src/renderer/src/components/InfoPopover.tsx -import type { PopoverProps } from 'antd' -import { Popover } from 'antd' -import { Info } from 'lucide-react' - -type InheritedPopoverProps = Omit - -interface InfoPopoverProps extends InheritedPopoverProps { - iconColor?: string - iconSize?: string | number - iconStyle?: React.CSSProperties -} - -const InfoPopover = ({ iconColor = 'var(--color-text-3)', iconSize = 14, iconStyle, ...rest }: InfoPopoverProps) => { - return ( - - - - ) -} - -export default InfoPopover diff --git a/packages/ui/stories/components/interactive/Selector.stories.tsx b/packages/ui/stories/components/interactive/Selector.stories.tsx index 2c737a911d..49f4d8f4c4 100644 --- a/packages/ui/stories/components/interactive/Selector.stories.tsx +++ b/packages/ui/stories/components/interactive/Selector.stories.tsx @@ -1,7 +1,7 @@ import type { Meta, StoryObj } from '@storybook/react' import { useState } from 'react' -import Selector from '../../../src/components/interactive/Selector' +import Selector from '../../../src/components/base/Selector' const meta: Meta = { title: 'Interactive/Selector', diff --git a/src/renderer/src/components/TooltipIcons/HelpTooltip.tsx b/src/renderer/src/components/TooltipIcons/HelpTooltip.tsx index d0de56dbe6..910dc4741f 100644 --- a/src/renderer/src/components/TooltipIcons/HelpTooltip.tsx +++ b/src/renderer/src/components/TooltipIcons/HelpTooltip.tsx @@ -13,7 +13,14 @@ interface HelpTooltipProps extends InheritedTooltipProps { const HelpTooltip = ({ iconColor = 'var(--color-text-2)', iconSize = 14, iconStyle, ...rest }: HelpTooltipProps) => { return ( - + ) } diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index c8d0862797..efeb69c92c 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -1,5 +1,4 @@ -import { RowFlex, Selector, Switch } from '@cherrystudio/ui' -import { Button } from '@cherrystudio/ui' +import { Button, DescriptionSwitch, RowFlex, Selector } from '@cherrystudio/ui' import { useMultiplePreferences, usePreference } from '@data/hooks/usePreference' import EditableNumber from '@renderer/components/EditableNumber' import Scrollbar from '@renderer/components/Scrollbar' @@ -184,19 +183,23 @@ const SettingsTab: FC = (props) => { }> - + {/* {t('chat.settings.temperature.label')} - - */} + { setEnableTemperature(enabled) onUpdateAssistantSettings({ enableTemperature: enabled }) - }} - /> + }}> + + {t('chat.settings.temperature.label')} + + + {enableTemperature ? ( @@ -234,25 +237,19 @@ const SettingsTab: FC = (props) => { - {t('models.stream_output')} - { setStreamOutput(checked) onUpdateAssistantSettings({ streamOutput: checked }) - }} - /> + }}> + {t('models.stream_output')} + - - - {t('chat.settings.max_tokens.label')} - - - - { @@ -268,8 +265,12 @@ const SettingsTab: FC = (props) => { } setEnableMaxTokens(enabled) onUpdateAssistantSettings({ enableMaxTokens: enabled }) - }} - /> + }}> + + {t('chat.settings.max_tokens.label')} + + + {enableMaxTokens && ( @@ -302,30 +303,38 @@ const SettingsTab: FC = (props) => { - {t('settings.messages.prompt')} - + + {t('settings.messages.prompt')} + - {t('settings.messages.use_serif_font')} - {t('settings.messages.use_serif_font')} */} + setMessageFont(checked ? 'serif' : 'system')} - /> + onValueChange={(checked) => setMessageFont(checked ? 'serif' : 'system')}> + {t('settings.messages.use_serif_font')} + - + {/* {t('chat.settings.thought_auto_collapse.label')} - - + */} + + + {t('chat.settings.thought_auto_collapse.label')} + + + - {t('settings.messages.show_message_outline')} - + + {t('settings.messages.show_message_outline')} + @@ -414,11 +423,16 @@ const SettingsTab: FC = (props) => { - + {/* {t('settings.math.single_dollar.label')} - - + */} + + + {t('settings.math.single_dollar.label')} + + + @@ -440,23 +454,32 @@ const SettingsTab: FC = (props) => { - + {/* {t('chat.settings.code_fancy_block.label')} - - + */} + + + {t('chat.settings.code_fancy_block.label')} + + + - + {/* {t('chat.settings.code_execution.title')} - - */} + setCodeExecution({ enabled: checked })} - /> + onValueChange={(checked) => setCodeExecution({ enabled: checked })}> + + {t('chat.settings.code_execution.title')} + + + {codeExecution.enabled && ( <> @@ -480,75 +503,90 @@ const SettingsTab: FC = (props) => { )} - {t('chat.settings.code_editor.title')} - {t('chat.settings.code_editor.title')} */} + setCodeEditor({ enabled: checked })} - /> + onValueChange={(checked) => setCodeEditor({ enabled: checked })}> + {t('chat.settings.code_editor.title')} + {codeEditor.enabled && ( <> - {t('chat.settings.code_editor.highlight_active_line')} - + {t('chat.settings.code_editor.highlight_active_line')} + + */} + setCodeEditor({ highlightActiveLine: checked })} - /> + onValueChange={(checked) => setCodeEditor({ highlightActiveLine: checked })}> + + {t('chat.settings.code_editor.highlight_active_line')} + + + - {t('chat.settings.code_editor.fold_gutter')} - {t('chat.settings.code_editor.fold_gutter')} */} + setCodeEditor({ foldGutter: checked })} - /> + onValueChange={(checked) => setCodeEditor({ foldGutter: checked })}> + {t('chat.settings.code_editor.fold_gutter')} + - {t('chat.settings.code_editor.autocompletion')} - {t('chat.settings.code_editor.autocompletion')} */} + setCodeEditor({ autocompletion: checked })} - /> + onValueChange={(checked) => setCodeEditor({ autocompletion: checked })}> + {t('chat.settings.code_editor.autocompletion')} + - {t('chat.settings.code_editor.keymap')} - {t('chat.settings.code_editor.keymap')} */} + setCodeEditor({ keymap: checked })} - /> + onValueChange={(checked) => setCodeEditor({ keymap: checked })}> + {t('chat.settings.code_editor.keymap')} + )} - {t('chat.settings.show_line_numbers')} - + + {t('chat.settings.show_line_numbers')} + - {t('chat.settings.code_collapsible')} - + + {t('chat.settings.code_collapsible')} + - {t('chat.settings.code_wrappable')} - + + {t('chat.settings.code_wrappable')} + - - {t('chat.settings.code_image_tools.label')} - - - + + + {t('chat.settings.code_image_tools.label')} + + + @@ -556,13 +594,18 @@ const SettingsTab: FC = (props) => { - {t('settings.messages.input.show_estimated_tokens')} - + + {t('settings.messages.input.show_estimated_tokens')} + - {t('settings.messages.input.paste_long_text_as_file')} - + + {t('settings.messages.input.paste_long_text_as_file')} + {pasteLongTextAsFile && ( <> @@ -583,41 +626,55 @@ const SettingsTab: FC = (props) => { )} - {t('settings.messages.markdown_rendering_input_message')} - + onValueChange={setRenderInputMessageAsMarkdown}> + {t('settings.messages.markdown_rendering_input_message')} + {!(language || navigator.language).startsWith('en') && ( <> - {t('settings.input.auto_translate_with_space')} - + + {t('settings.input.auto_translate_with_space')} + )} - {t('settings.input.show_translate_confirm')} - + + {t('settings.input.show_translate_confirm')} + - {t('settings.messages.input.enable_quick_triggers')} - + + {t('settings.messages.input.enable_quick_triggers')} + - {t('settings.messages.input.confirm_delete_message')} - + + {t('settings.messages.input.confirm_delete_message')} + - {t('settings.messages.input.confirm_regenerate_message')} - + + {t('settings.messages.input.confirm_regenerate_message')} + diff --git a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListGroup.tsx b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListGroup.tsx index 0bde50f114..fa4ac0cfcc 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListGroup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/ModelList/ModelListGroup.tsx @@ -60,7 +60,8 @@ const ModelListGroup: React.FC = ({ onSelectionChange: handleCollapseChange }} accordionItemProps={{ - startContent: ( + disableIndicatorAnimation: true, + indicator: (