diff --git a/packages/ui/src/components/primitives/select.tsx b/packages/ui/src/components/primitives/select.tsx index 57fdb2bc61..31b5d5ce48 100644 --- a/packages/ui/src/components/primitives/select.tsx +++ b/packages/ui/src/components/primitives/select.tsx @@ -9,8 +9,10 @@ const selectTriggerVariants = cva( { variants: { state: { - default: 'bg-zinc-50 dark:bg-zinc-900 border-border aria-expanded:border-primary aria-expanded:ring-3 aria-expanded:ring-primary/20', - error: 'bg-zinc-50 dark:bg-zinc-900 border border-destructive! aria-expanded:ring-3 aria-expanded:ring-red-600/20', + default: + 'bg-zinc-50 dark:bg-zinc-900 border-border aria-expanded:border-primary aria-expanded:ring-3 aria-expanded:ring-primary/20', + error: + 'bg-zinc-50 dark:bg-zinc-900 border border-destructive! aria-expanded:ring-3 aria-expanded:ring-red-600/20', disabled: 'opacity-50 cursor-not-allowed pointer-events-none bg-zinc-50 dark:bg-zinc-900' }, size: { diff --git a/packages/ui/stories/components/composites/Selector.stories.tsx b/packages/ui/stories/components/composites/Selector.stories.tsx deleted file mode 100644 index 6c4dc6cd2a..0000000000 --- a/packages/ui/stories/components/composites/Selector.stories.tsx +++ /dev/null @@ -1,209 +0,0 @@ -import type { Meta } from '@storybook/react' -import { useState } from 'react' - -import { Selector } from '../../../src/components' - -const meta: Meta = { - title: 'Components/Composites/Selector', - component: Selector, - parameters: { - layout: 'padded' - }, - tags: ['autodocs'], - argTypes: { - items: { - control: false, - description: '选项数组' - }, - selectedKeys: { - control: false, - description: '选中的键值集合' - }, - onSelectionChange: { - control: false, - description: '选择变化回调函数' - }, - selectionMode: { - control: 'select', - options: ['single', 'multiple'], - description: '选择模式' - }, - placeholder: { - control: 'text', - description: '占位符文本' - }, - size: { - control: 'select', - options: ['sm', 'md', 'lg'], - description: 'HeroUI 大小变体' - }, - isDisabled: { - control: 'boolean', - description: '是否禁用' - }, - className: { - control: 'text', - description: '自定义类名' - } - } -} - -export default meta - -// 基础用法 - 单选 -export const Default = { - render: function Render() { - const [selectedValue, setSelectedValue] = useState('react') - - return ( -
- setSelectedValue(value)} - placeholder="选择框架" - items={[ - { value: 'react', label: 'React' }, - { value: 'vue', label: 'Vue' }, - { value: 'angular', label: 'Angular' }, - { value: 'svelte', label: 'Svelte' } - ]} - /> -
- 当前选择: {selectedValue} -
-
- ) - } -} - -// 多选模式 -export const Multiple = { - render: function Render() { - const [selectedValues, setSelectedValues] = useState(['react', 'vue']) - - return ( -
- setSelectedValues(values)} - placeholder="选择多个框架" - items={[ - { value: 'react', label: 'React' }, - { value: 'vue', label: 'Vue' }, - { value: 'angular', label: 'Angular' }, - { value: 'svelte', label: 'Svelte' }, - { value: 'solid', label: 'Solid' } - ]} - /> -
- 已选择 ({selectedValues.length}): {selectedValues.join(', ')} -
-
- ) - } -} - -// 数字值类型 -export const NumberValues = { - render: function Render() { - const [selectedValue, setSelectedValue] = useState(2) - - return ( -
- setSelectedValue(value)} - placeholder="选择优先级" - items={[ - { value: 1, label: '🔴 紧急' }, - { value: 2, label: '🟠 高' }, - { value: 3, label: '🟡 中' }, - { value: 4, label: '🟢 低' } - ]} - /> -
- 优先级值: {selectedValue} (类型: {typeof selectedValue}) -
-
- ) - } -} - -// 不同大小 -export const Sizes = { - render: function Render() { - const items = [ - { value: 'option1', label: '选项 1' }, - { value: 'option2', label: '选项 2' }, - { value: 'option3', label: '选项 3' } - ] - - return ( -
-
- - -
-
- - -
-
- - -
-
- ) - } -} - -// 禁用状态 -export const Disabled = { - render: function Render() { - return ( - - ) - } -} - -// 实际应用场景:语言选择 -export const LanguageSelector = { - render: function Render() { - const [selectedValue, setSelectedValue] = useState('zh') - - const languages = [ - { value: 'zh', label: '🇨🇳 简体中文' }, - { value: 'en', label: '🇺🇸 English' }, - { value: 'ja', label: '🇯🇵 日本語' }, - { value: 'ko', label: '🇰🇷 한국어' }, - { value: 'fr', label: '🇫🇷 Français' }, - { value: 'de', label: '🇩🇪 Deutsch' } - ] - - return ( -
- setSelectedValue(value)} - placeholder="选择语言" - items={languages} - /> -
- 当前语言: {languages.find((l) => l.value === selectedValue)?.label} -
-
- ) - } -} diff --git a/packages/ui/stories/components/primitives/Select.stories.tsx b/packages/ui/stories/components/primitives/Select.stories.tsx index 2bd6c4955b..72424a233b 100644 --- a/packages/ui/stories/components/primitives/Select.stories.tsx +++ b/packages/ui/stories/components/primitives/Select.stories.tsx @@ -20,7 +20,8 @@ const meta: Meta = { layout: 'centered', docs: { description: { - component: 'A dropdown select component based on Radix UI, with support for groups, separators, and custom content.' + component: + 'A dropdown select component based on Radix UI, with support for groups, separators, and custom content.' } } }, diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index f8ef107567..79e85c9bab 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -1,4 +1,15 @@ -import { Button, DescriptionSwitch, HelpTooltip, RowFlex, Selector, type SelectorItem, Switch } from '@cherrystudio/ui' +import { + Button, + DescriptionSwitch, + HelpTooltip, + RowFlex, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, + Switch +} from '@cherrystudio/ui' import { useMultiplePreferences, usePreference } from '@data/hooks/usePreference' import EditableNumber from '@renderer/components/EditableNumber' import Scrollbar from '@renderer/components/Scrollbar' @@ -32,6 +43,13 @@ import { useTranslation } from 'react-i18next' import styled from 'styled-components' import OpenAISettingsGroup from './components/OpenAISettingsGroup' + +// Type definition for select items +type SelectorItem = { + value: T + label: string +} + interface Props { assistant: Assistant } @@ -418,39 +436,51 @@ const SettingsTab: FC = (props) => { - {/* {t('message.message.style.label')} */} - setMessageStyle(value)} - items={messageStyleItems} - /> + {t('message.message.style.label')} + - {/* {t('message.message.multi_model_style.label')} */} - setMultiModelMessageStyle(value)} - items={multiModelMessageStyleItems} - /> + {t('message.message.multi_model_style.label')} + - {/* {t('settings.messages.navigation.label')} */} - setMessageNavigation(value)} - items={messageNavigationItems} - /> + {t('settings.messages.navigation.label')} + @@ -479,15 +509,19 @@ const SettingsTab: FC = (props) => { - {/* {t('settings.math.engine.label')} */} - setMathEngine(value)} - items={mathEngineItems} - /> + {t('settings.math.engine.label')} + @@ -508,15 +542,19 @@ const SettingsTab: FC = (props) => { - {/* {t('message.message.code_style')} */} - onCodeStyleChange(value)} - items={codeStyleItems} - /> + {t('message.message.code_style')} + @@ -744,28 +782,35 @@ const SettingsTab: FC = (props) => { - {/* {t('settings.input.target_language.label')} */} - setTargetLanguage(value)} - placeholder={UNKNOWN.emoji + ' ' + UNKNOWN.label()} - items={targetLanguageItems} - /> + {t('settings.input.target_language.label')} + - {/* {} */} - setSendMessageShortcut(value)} - items={sendMessageShortcutItems} - /> + {t('settings.messages.input.send_shortcuts')} +