diff --git a/packages/client/src/components/layout/ModelSelector.vue b/packages/client/src/components/layout/ModelSelector.vue index fcdee7a..7861378 100644 --- a/packages/client/src/components/layout/ModelSelector.vue +++ b/packages/client/src/components/layout/ModelSelector.vue @@ -1,41 +1,105 @@ @@ -55,4 +119,134 @@ function handleChange(value: string | number | Array) { letter-spacing: 0.5px; margin-bottom: 6px; } + +.model-trigger { + display: flex; + align-items: center; + gap: 6px; + width: 100%; + padding: 6px 8px; + background: $bg-input; + border: 1px solid $border-color; + border-radius: $radius-sm; + color: $text-primary; + font-size: 13px; + cursor: pointer; + transition: border-color $transition-fast; + + &:hover { + border-color: $accent-muted; + } +} + +.model-name { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + text-align: left; +} + +.model-arrow { + flex-shrink: 0; + color: $text-muted; +} + +.model-search { + margin-bottom: 12px; +} + +.model-list { + max-height: 50vh; + overflow-y: auto; + scrollbar-width: thin; +} + +.model-group { + margin-bottom: 4px; +} + +.model-group-header { + display: flex; + align-items: center; + gap: 6px; + padding: 8px 8px; + font-size: 12px; + font-weight: 600; + color: $text-secondary; + cursor: pointer; + border-radius: $radius-sm; + user-select: none; + transition: background-color $transition-fast; + + &:hover { + background-color: $bg-secondary; + } +} + +.model-group-arrow { + flex-shrink: 0; + transition: transform $transition-fast; + + &.collapsed { + transform: rotate(-90deg); + } +} + +.model-group-label { + flex: 1; +} + +.model-group-count { + font-size: 11px; + color: $text-muted; + font-weight: 400; +} + +.model-group-items { + padding-left: 8px; +} + +.model-item { + display: flex; + align-items: center; + gap: 8px; + padding: 7px 10px; + font-size: 13px; + color: $text-secondary; + border-radius: $radius-sm; + cursor: pointer; + transition: all $transition-fast; + + &:hover { + background-color: rgba(var(--accent-primary-rgb), 0.06); + color: $text-primary; + } + + &.active { + color: $accent-primary; + font-weight: 500; + } +} + +.model-item-name { + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + font-family: $font-code; + font-size: 12px; +} + +.model-check { + flex-shrink: 0; + color: $accent-primary; +} + +.model-empty { + padding: 24px 0; + text-align: center; + font-size: 13px; + color: $text-muted; +} diff --git a/packages/client/src/i18n/locales/en.ts b/packages/client/src/i18n/locales/en.ts index 337fcb6..1de19d7 100644 --- a/packages/client/src/i18n/locales/en.ts +++ b/packages/client/src/i18n/locales/en.ts @@ -190,6 +190,7 @@ export default { // Models models: { title: 'Models', + searchPlaceholder: 'Search models...', addProvider: 'Add Provider', providerType: 'Provider Type', preset: 'Preset', diff --git a/packages/client/src/i18n/locales/zh.ts b/packages/client/src/i18n/locales/zh.ts index 6fa017a..94e88c1 100644 --- a/packages/client/src/i18n/locales/zh.ts +++ b/packages/client/src/i18n/locales/zh.ts @@ -190,6 +190,7 @@ export default { // 模型 models: { title: '模型', + searchPlaceholder: '搜索模型...', addProvider: '添加 Provider', providerType: 'Provider 类型', preset: '预设',