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.
This commit is contained in:
MyPrototypeWhat 2025-09-29 12:45:35 +08:00
parent e6e1fb0404
commit ef4bede062
8 changed files with 190 additions and 121 deletions

View File

@ -1,5 +1,5 @@
import type { SwitchProps } from '@heroui/react' 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 // Enhanced Switch component with loading state support
interface CustomSwitchProps extends SwitchProps { interface CustomSwitchProps extends SwitchProps {
@ -21,7 +21,34 @@ const CustomizedSwitch = ({ isLoading, children, ref, thumbIcon, ...props }: Cus
) )
} }
const DescriptionSwitch = ({ children, ...props }: CustomSwitchProps) => {
return (
<CustomizedSwitch
size="sm"
classNames={{
base: cn(
'inline-flex w-full max-w-md flex-row-reverse items-center hover:bg-content2',
'cursor-pointer justify-between gap-2 rounded-lg border-2 border-transparent py-2 pr-1',
'data-[selected=true]:border-primary'
),
wrapper: 'p-0 h-4 overflow-visible',
thumb: cn(
'h-6 w-6 border-2 shadow-lg',
'group-data-[hover=true]:border-primary',
//selected
'group-data-[selected=true]:ms-6',
// pressed
'group-data-[pressed=true]:w-7',
'group-data-pressed:group-data-selected:ms-4'
)
}}
{...props}>
{children}
</CustomizedSwitch>
)
}
CustomizedSwitch.displayName = 'Switch' CustomizedSwitch.displayName = 'Switch'
export { CustomizedSwitch as Switch } export { DescriptionSwitch, CustomizedSwitch as Switch }
export type { CustomSwitchProps as SwitchProps } export type { CustomSwitchProps as SwitchProps }

View File

@ -11,7 +11,7 @@ export { default as IndicatorLight } from './base/IndicatorLight'
export { default as Spinner } from './base/Spinner' export { default as Spinner } from './base/Spinner'
export type { StatusTagProps, StatusType } from './base/StatusTag' export type { StatusTagProps, StatusType } from './base/StatusTag'
export { ErrorTag, InfoTag, StatusTag, SuccessTag, WarnTag } 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 { default as TextBadge } from './base/TextBadge'
export { getToastUtilities, type ToastUtilities } from './base/Toast' 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' export { default as ToolsCallingIcon } from './icons/ToolsCallingIcon'
// Interactive Components // Interactive Components
export { default as Selector } from './base/Selector'
export { export {
default as CodeEditor, default as CodeEditor,
type CodeEditorHandles, type CodeEditorHandles,
@ -64,9 +65,7 @@ export type { EditableNumberProps } from './interactive/EditableNumber'
export { default as EditableNumber } from './interactive/EditableNumber' export { default as EditableNumber } from './interactive/EditableNumber'
export { default as HelpTooltip } from './interactive/HelpTooltip' export { default as HelpTooltip } from './interactive/HelpTooltip'
export { default as ImageToolButton } from './interactive/ImageToolButton' export { default as ImageToolButton } from './interactive/ImageToolButton'
export { default as InfoPopover } from './interactive/InfoPopover'
export { default as InfoTooltip } from './interactive/InfoTooltip' export { default as InfoTooltip } from './interactive/InfoTooltip'
export { default as Selector } from './interactive/Selector'
export { Sortable } from './interactive/Sortable' export { Sortable } from './interactive/Sortable'
export { default as WarnTooltip } from './interactive/WarnTooltip' export { default as WarnTooltip } from './interactive/WarnTooltip'

View File

@ -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<PopoverProps, 'children'>
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 (
<Popover {...rest}>
<Info size={iconSize} color={iconColor} style={{ ...iconStyle }} role="img" aria-label="Information" />
</Popover>
)
}
export default InfoPopover

View File

@ -1,7 +1,7 @@
import type { Meta, StoryObj } from '@storybook/react' import type { Meta, StoryObj } from '@storybook/react'
import { useState } from 'react' import { useState } from 'react'
import Selector from '../../../src/components/interactive/Selector' import Selector from '../../../src/components/base/Selector'
const meta: Meta<typeof Selector> = { const meta: Meta<typeof Selector> = {
title: 'Interactive/Selector', title: 'Interactive/Selector',

View File

@ -13,7 +13,14 @@ interface HelpTooltipProps extends InheritedTooltipProps {
const HelpTooltip = ({ iconColor = 'var(--color-text-2)', iconSize = 14, iconStyle, ...rest }: HelpTooltipProps) => { const HelpTooltip = ({ iconColor = 'var(--color-text-2)', iconSize = 14, iconStyle, ...rest }: HelpTooltipProps) => {
return ( return (
<Tooltip {...rest}> <Tooltip {...rest}>
<HelpCircle size={iconSize} color={iconColor} style={{ ...iconStyle }} role="img" aria-label="Help" /> <HelpCircle
size={iconSize}
color={iconColor}
style={{ ...iconStyle, cursor: 'help' }}
role="img"
aria-label="Help"
className="relative z-10"
/>
</Tooltip> </Tooltip>
) )
} }

View File

@ -1,5 +1,4 @@
import { RowFlex, Selector, Switch } from '@cherrystudio/ui' import { Button, DescriptionSwitch, RowFlex, Selector } from '@cherrystudio/ui'
import { Button } from '@cherrystudio/ui'
import { useMultiplePreferences, usePreference } from '@data/hooks/usePreference' import { useMultiplePreferences, usePreference } from '@data/hooks/usePreference'
import EditableNumber from '@renderer/components/EditableNumber' import EditableNumber from '@renderer/components/EditableNumber'
import Scrollbar from '@renderer/components/Scrollbar' import Scrollbar from '@renderer/components/Scrollbar'
@ -184,19 +183,23 @@ const SettingsTab: FC<Props> = (props) => {
}> }>
<SettingGroup style={{ marginTop: 5 }}> <SettingGroup style={{ marginTop: 5 }}>
<Row align="middle"> <Row align="middle">
<SettingRowTitleSmall> {/* <SettingRowTitleSmall>
{t('chat.settings.temperature.label')} {t('chat.settings.temperature.label')}
<HelpTooltip title={t('chat.settings.temperature.tip')} /> <HelpTooltip title={t('chat.settings.temperature.tip')} />
</SettingRowTitleSmall> </SettingRowTitleSmall> */}
<Switch <DescriptionSwitch
size="sm" size="sm"
className="ml-auto" className="ml-auto"
isSelected={enableTemperature} isSelected={enableTemperature}
onValueChange={(enabled) => { onValueChange={(enabled) => {
setEnableTemperature(enabled) setEnableTemperature(enabled)
onUpdateAssistantSettings({ enableTemperature: enabled }) onUpdateAssistantSettings({ enableTemperature: enabled })
}} }}>
/> <SettingRowTitleSmall>
{t('chat.settings.temperature.label')}
<HelpTooltip title={t('chat.settings.temperature.tip')} />
</SettingRowTitleSmall>
</DescriptionSwitch>
</Row> </Row>
{enableTemperature ? ( {enableTemperature ? (
<Row align="middle" gutter={10}> <Row align="middle" gutter={10}>
@ -234,25 +237,19 @@ const SettingsTab: FC<Props> = (props) => {
</Row> </Row>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('models.stream_output')}</SettingRowTitleSmall> <DescriptionSwitch
<Switch
size="sm" size="sm"
isSelected={streamOutput} isSelected={streamOutput}
onValueChange={(checked) => { onValueChange={(checked) => {
setStreamOutput(checked) setStreamOutput(checked)
onUpdateAssistantSettings({ streamOutput: checked }) onUpdateAssistantSettings({ streamOutput: checked })
}} }}>
/> <SettingRowTitleSmall>{t('models.stream_output')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<Row align="middle"> <DescriptionSwitch
<SettingRowTitleSmall>
{t('chat.settings.max_tokens.label')}
<HelpTooltip title={t('chat.settings.max_tokens.tip')} />
</SettingRowTitleSmall>
</Row>
<Switch
size="sm" size="sm"
isSelected={enableMaxTokens} isSelected={enableMaxTokens}
onValueChange={async (enabled) => { onValueChange={async (enabled) => {
@ -268,8 +265,12 @@ const SettingsTab: FC<Props> = (props) => {
} }
setEnableMaxTokens(enabled) setEnableMaxTokens(enabled)
onUpdateAssistantSettings({ enableMaxTokens: enabled }) onUpdateAssistantSettings({ enableMaxTokens: enabled })
}} }}>
/> <SettingRowTitleSmall>
{t('chat.settings.max_tokens.label')}
<HelpTooltip title={t('chat.settings.max_tokens.tip')} />
</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
{enableMaxTokens && ( {enableMaxTokens && (
<Row align="middle" gutter={10} style={{ marginTop: 10 }}> <Row align="middle" gutter={10} style={{ marginTop: 10 }}>
@ -302,30 +303,38 @@ const SettingsTab: FC<Props> = (props) => {
<CollapsibleSettingGroup title={t('settings.messages.title')} defaultExpanded={true}> <CollapsibleSettingGroup title={t('settings.messages.title')} defaultExpanded={true}>
<SettingGroup> <SettingGroup>
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.messages.prompt')}</SettingRowTitleSmall> <DescriptionSwitch size="sm" isSelected={showPrompt} onValueChange={setShowPrompt}>
<Switch size="sm" isSelected={showPrompt} onValueChange={setShowPrompt} /> <SettingRowTitleSmall>{t('settings.messages.prompt')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.messages.use_serif_font')}</SettingRowTitleSmall> {/* <SettingRowTitleSmall>{t('settings.messages.use_serif_font')}</SettingRowTitleSmall> */}
<Switch <DescriptionSwitch
size="sm" size="sm"
isSelected={messageFont === 'serif'} isSelected={messageFont === 'serif'}
onValueChange={(checked) => setMessageFont(checked ? 'serif' : 'system')} onValueChange={(checked) => setMessageFont(checked ? 'serif' : 'system')}>
/> <SettingRowTitleSmall>{t('settings.messages.use_serif_font')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall> {/* <SettingRowTitleSmall>
{t('chat.settings.thought_auto_collapse.label')} {t('chat.settings.thought_auto_collapse.label')}
<HelpTooltip title={t('chat.settings.thought_auto_collapse.tip')} /> <HelpTooltip title={t('chat.settings.thought_auto_collapse.tip')} />
</SettingRowTitleSmall> </SettingRowTitleSmall> */}
<Switch size="sm" isSelected={thoughtAutoCollapse} onValueChange={setThoughtAutoCollapse} /> <DescriptionSwitch isSelected={thoughtAutoCollapse} onValueChange={setThoughtAutoCollapse}>
<SettingRowTitleSmall>
{t('chat.settings.thought_auto_collapse.label')}
<HelpTooltip title={t('chat.settings.thought_auto_collapse.tip')} />
</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.messages.show_message_outline')}</SettingRowTitleSmall> <DescriptionSwitch isSelected={showMessageOutline} onValueChange={setShowMessageOutline}>
<Switch size="sm" isSelected={showMessageOutline} onValueChange={setShowMessageOutline} /> <SettingRowTitleSmall>{t('settings.messages.show_message_outline')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
@ -414,11 +423,16 @@ const SettingsTab: FC<Props> = (props) => {
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall> {/* <SettingRowTitleSmall>
{t('settings.math.single_dollar.label')} {t('settings.math.single_dollar.label')}
<HelpTooltip title={t('settings.math.single_dollar.tip')} /> <HelpTooltip title={t('settings.math.single_dollar.tip')} />
</SettingRowTitleSmall> </SettingRowTitleSmall> */}
<Switch size="sm" isSelected={mathEnableSingleDollar} onValueChange={setMathEnableSingleDollar} /> <DescriptionSwitch size="sm" isSelected={mathEnableSingleDollar} onValueChange={setMathEnableSingleDollar}>
<SettingRowTitleSmall>
{t('settings.math.single_dollar.label')}
<HelpTooltip title={t('settings.math.single_dollar.tip')} />
</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
</SettingGroup> </SettingGroup>
@ -440,23 +454,32 @@ const SettingsTab: FC<Props> = (props) => {
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall> {/* <SettingRowTitleSmall>
{t('chat.settings.code_fancy_block.label')} {t('chat.settings.code_fancy_block.label')}
<HelpTooltip title={t('chat.settings.code_fancy_block.tip')} /> <HelpTooltip title={t('chat.settings.code_fancy_block.tip')} />
</SettingRowTitleSmall> </SettingRowTitleSmall> */}
<Switch size="sm" isSelected={codeFancyBlock} onValueChange={setCodeFancyBlock} /> <DescriptionSwitch size="sm" isSelected={codeFancyBlock} onValueChange={setCodeFancyBlock}>
<SettingRowTitleSmall>
{t('chat.settings.code_fancy_block.label')}
<HelpTooltip title={t('chat.settings.code_fancy_block.tip')} />
</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall> {/* <SettingRowTitleSmall>
{t('chat.settings.code_execution.title')} {t('chat.settings.code_execution.title')}
<HelpTooltip title={t('chat.settings.code_execution.tip')} /> <HelpTooltip title={t('chat.settings.code_execution.tip')} />
</SettingRowTitleSmall> </SettingRowTitleSmall> */}
<Switch <DescriptionSwitch
size="sm" size="sm"
isSelected={codeExecution.enabled} isSelected={codeExecution.enabled}
onValueChange={(checked) => setCodeExecution({ enabled: checked })} onValueChange={(checked) => setCodeExecution({ enabled: checked })}>
/> <SettingRowTitleSmall>
{t('chat.settings.code_execution.title')}
<HelpTooltip title={t('chat.settings.code_execution.tip')} />
</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
{codeExecution.enabled && ( {codeExecution.enabled && (
<> <>
@ -480,75 +503,90 @@ const SettingsTab: FC<Props> = (props) => {
)} )}
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('chat.settings.code_editor.title')}</SettingRowTitleSmall> {/* <SettingRowTitleSmall>{t('chat.settings.code_editor.title')}</SettingRowTitleSmall> */}
<Switch <DescriptionSwitch
size="sm" size="sm"
isSelected={codeEditor.enabled} isSelected={codeEditor.enabled}
onValueChange={(checked) => setCodeEditor({ enabled: checked })} onValueChange={(checked) => setCodeEditor({ enabled: checked })}>
/> <SettingRowTitleSmall>{t('chat.settings.code_editor.title')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
{codeEditor.enabled && ( {codeEditor.enabled && (
<> <>
<SettingDivider /> <SettingDivider />
<SettingRow style={{ paddingLeft: 8 }}> <SettingRow style={{ paddingLeft: 8 }}>
<SettingRowTitleSmall>{t('chat.settings.code_editor.highlight_active_line')}</SettingRowTitleSmall> {/* <SettingRowTitleSmall>
<Switch {t('chat.settings.code_editor.highlight_active_line')}
<HelpTooltip title={t('chat.settings.code_editor.highlight_active_line.tip')} />
</SettingRowTitleSmall> */}
<DescriptionSwitch
size="sm" size="sm"
isSelected={codeEditor.highlightActiveLine} isSelected={codeEditor.highlightActiveLine}
onValueChange={(checked) => setCodeEditor({ highlightActiveLine: checked })} onValueChange={(checked) => setCodeEditor({ highlightActiveLine: checked })}>
/> <SettingRowTitleSmall>
{t('chat.settings.code_editor.highlight_active_line')}
<HelpTooltip title={t('chat.settings.code_editor.highlight_active_line.tip')} />
</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow style={{ paddingLeft: 8 }}> <SettingRow style={{ paddingLeft: 8 }}>
<SettingRowTitleSmall>{t('chat.settings.code_editor.fold_gutter')}</SettingRowTitleSmall> {/* <SettingRowTitleSmall>{t('chat.settings.code_editor.fold_gutter')}</SettingRowTitleSmall> */}
<Switch <DescriptionSwitch
size="sm" size="sm"
isSelected={codeEditor.foldGutter} isSelected={codeEditor.foldGutter}
onValueChange={(checked) => setCodeEditor({ foldGutter: checked })} onValueChange={(checked) => setCodeEditor({ foldGutter: checked })}>
/> <SettingRowTitleSmall>{t('chat.settings.code_editor.fold_gutter')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow style={{ paddingLeft: 8 }}> <SettingRow style={{ paddingLeft: 8 }}>
<SettingRowTitleSmall>{t('chat.settings.code_editor.autocompletion')}</SettingRowTitleSmall> {/* <SettingRowTitleSmall>{t('chat.settings.code_editor.autocompletion')}</SettingRowTitleSmall> */}
<Switch <DescriptionSwitch
size="sm" size="sm"
isSelected={codeEditor.autocompletion} isSelected={codeEditor.autocompletion}
onValueChange={(checked) => setCodeEditor({ autocompletion: checked })} onValueChange={(checked) => setCodeEditor({ autocompletion: checked })}>
/> <SettingRowTitleSmall>{t('chat.settings.code_editor.autocompletion')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow style={{ paddingLeft: 8 }}> <SettingRow style={{ paddingLeft: 8 }}>
<SettingRowTitleSmall>{t('chat.settings.code_editor.keymap')}</SettingRowTitleSmall> {/* <SettingRowTitleSmall>{t('chat.settings.code_editor.keymap')}</SettingRowTitleSmall> */}
<Switch <DescriptionSwitch
size="sm" size="sm"
isSelected={codeEditor.keymap} isSelected={codeEditor.keymap}
onValueChange={(checked) => setCodeEditor({ keymap: checked })} onValueChange={(checked) => setCodeEditor({ keymap: checked })}>
/> <SettingRowTitleSmall>{t('chat.settings.code_editor.keymap')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
</> </>
)} )}
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('chat.settings.show_line_numbers')}</SettingRowTitleSmall> <DescriptionSwitch size="sm" isSelected={codeShowLineNumbers} onValueChange={setCodeShowLineNumbers}>
<Switch size="sm" isSelected={codeShowLineNumbers} onValueChange={setCodeShowLineNumbers} /> <SettingRowTitleSmall>{t('chat.settings.show_line_numbers')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('chat.settings.code_collapsible')}</SettingRowTitleSmall> <DescriptionSwitch size="sm" isSelected={codeCollapsible} onValueChange={setCodeCollapsible}>
<Switch size="sm" isSelected={codeCollapsible} onValueChange={setCodeCollapsible} /> <SettingRowTitleSmall>{t('chat.settings.code_collapsible')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('chat.settings.code_wrappable')}</SettingRowTitleSmall> <DescriptionSwitch size="sm" isSelected={codeWrappable} onValueChange={setCodeWrappable}>
<Switch size="sm" isSelected={codeWrappable} onValueChange={setCodeWrappable} /> <SettingRowTitleSmall>{t('chat.settings.code_wrappable')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall> <DescriptionSwitch size="sm" isSelected={codeImageTools} onValueChange={setCodeImageTools}>
{t('chat.settings.code_image_tools.label')} <SettingRowTitleSmall>
<HelpTooltip title={t('chat.settings.code_image_tools.tip')} /> {t('chat.settings.code_image_tools.label')}
</SettingRowTitleSmall> <HelpTooltip title={t('chat.settings.code_image_tools.tip')} />
<Switch size="sm" isSelected={codeImageTools} onValueChange={setCodeImageTools} /> </SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
</SettingGroup> </SettingGroup>
<SettingDivider /> <SettingDivider />
@ -556,13 +594,18 @@ const SettingsTab: FC<Props> = (props) => {
<CollapsibleSettingGroup title={t('settings.messages.input.title')} defaultExpanded={false}> <CollapsibleSettingGroup title={t('settings.messages.input.title')} defaultExpanded={false}>
<SettingGroup> <SettingGroup>
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.messages.input.show_estimated_tokens')}</SettingRowTitleSmall> <DescriptionSwitch
<Switch size="sm" isSelected={showInputEstimatedTokens} onValueChange={setShowInputEstimatedTokens} /> size="sm"
isSelected={showInputEstimatedTokens}
onValueChange={setShowInputEstimatedTokens}>
<SettingRowTitleSmall>{t('settings.messages.input.show_estimated_tokens')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.messages.input.paste_long_text_as_file')}</SettingRowTitleSmall> <DescriptionSwitch size="sm" isSelected={pasteLongTextAsFile} onValueChange={setPasteLongTextAsFile}>
<Switch size="sm" isSelected={pasteLongTextAsFile} onValueChange={setPasteLongTextAsFile} /> <SettingRowTitleSmall>{t('settings.messages.input.paste_long_text_as_file')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
{pasteLongTextAsFile && ( {pasteLongTextAsFile && (
<> <>
@ -583,41 +626,55 @@ const SettingsTab: FC<Props> = (props) => {
)} )}
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.messages.markdown_rendering_input_message')}</SettingRowTitleSmall> <DescriptionSwitch
<Switch
size="sm" size="sm"
isSelected={renderInputMessageAsMarkdown} isSelected={renderInputMessageAsMarkdown}
onValueChange={setRenderInputMessageAsMarkdown} onValueChange={setRenderInputMessageAsMarkdown}>
/> <SettingRowTitleSmall>{t('settings.messages.markdown_rendering_input_message')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
{!(language || navigator.language).startsWith('en') && ( {!(language || navigator.language).startsWith('en') && (
<> <>
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.input.auto_translate_with_space')}</SettingRowTitleSmall> <DescriptionSwitch
<Switch size="sm" isSelected={autoTranslateWithSpace} onValueChange={setAutoTranslateWithSpace} /> size="sm"
isSelected={autoTranslateWithSpace}
onValueChange={setAutoTranslateWithSpace}>
<SettingRowTitleSmall>{t('settings.input.auto_translate_with_space')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
</> </>
)} )}
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.input.show_translate_confirm')}</SettingRowTitleSmall> <DescriptionSwitch size="sm" isSelected={showTranslateConfirm} onValueChange={setShowTranslateConfirm}>
<Switch size="sm" isSelected={showTranslateConfirm} onValueChange={setShowTranslateConfirm} /> <SettingRowTitleSmall>{t('settings.input.show_translate_confirm')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.messages.input.enable_quick_triggers')}</SettingRowTitleSmall> <DescriptionSwitch
<Switch size="sm" isSelected={enableQuickPanelTriggers} onValueChange={setEnableQuickPanelTriggers} /> size="sm"
isSelected={enableQuickPanelTriggers}
onValueChange={setEnableQuickPanelTriggers}>
<SettingRowTitleSmall>{t('settings.messages.input.enable_quick_triggers')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.messages.input.confirm_delete_message')}</SettingRowTitleSmall> <DescriptionSwitch size="sm" isSelected={confirmDeleteMessage} onValueChange={setConfirmDeleteMessage}>
<Switch size="sm" isSelected={confirmDeleteMessage} onValueChange={setConfirmDeleteMessage} /> <SettingRowTitleSmall>{t('settings.messages.input.confirm_delete_message')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitleSmall>{t('settings.messages.input.confirm_regenerate_message')}</SettingRowTitleSmall> <DescriptionSwitch
<Switch size="sm" isSelected={confirmRegenerateMessage} onValueChange={setConfirmRegenerateMessage} /> size="sm"
isSelected={confirmRegenerateMessage}
onValueChange={setConfirmRegenerateMessage}>
<SettingRowTitleSmall>{t('settings.messages.input.confirm_regenerate_message')}</SettingRowTitleSmall>
</DescriptionSwitch>
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>

View File

@ -60,7 +60,8 @@ const ModelListGroup: React.FC<ModelListGroupProps> = ({
onSelectionChange: handleCollapseChange onSelectionChange: handleCollapseChange
}} }}
accordionItemProps={{ accordionItemProps={{
startContent: ( disableIndicatorAnimation: true,
indicator: (
<Tooltip title={t('settings.models.manage.remove_whole_group')} mouseLeaveDelay={0}> <Tooltip title={t('settings.models.manage.remove_whole_group')} mouseLeaveDelay={0}>
<Button <Button
variant="light" variant="light"