fix(ui): 批量修复字号/间距/弹窗/表格 UI 问题(接续)

- 密码修改弹窗: max-w-md→max-w-lg, py-3.5→py-3, text-[10px]→text-xs
- 角色选择按钮: flex-wrap + min-w-[100px] 防窄屏换行
- 用户表格: overflow-x-auto + min-w-[700px] 响应式
- 全部 42 处 text-[10px] → text-xs(标签/徽章/说明文字)
- PermissionSettingsView 剩余 2 处 text-[10px]→text-xs

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Developer
2026-06-09 10:39:48 +08:00
parent ffe365201a
commit c166d298b8
2 changed files with 53 additions and 53 deletions
@@ -329,7 +329,7 @@ export const PermissionSettingsView: React.FC = () => {
<Key size={18} className="text-indigo-600" />
{selectedRole.name}
{selectedRole.isSystem && (
<span className="text-[10px] font-black text-slate-400 bg-slate-100 px-2 py-0.5 rounded-full uppercase tracking-wider">
<span className="text-xs font-black text-slate-400 bg-slate-100 px-2 py-0.5 rounded-full uppercase tracking-wider">
</span>
)}
@@ -392,7 +392,7 @@ export const PermissionSettingsView: React.FC = () => {
{category}
</span>
<span className={cn(
'text-[10px] font-bold px-2 py-0.5 rounded-full',
'text-xs font-bold px-2 py-0.5 rounded-full',
allChecked
? 'bg-indigo-100 text-indigo-600'
: someChecked
+51 -51
View File
@@ -846,7 +846,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
</h3>
<div className="space-y-4 max-w-sm">
<div className="space-y-2">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">
{t('switchLanguage')}
</label>
<select
@@ -970,7 +970,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
initial={{ scale: 0.95, opacity: 0 }}
animate={{ scale: 1, opacity: 1 }}
exit={{ scale: 0.95, opacity: 0 }}
className="bg-white rounded-3xl p-10 w-full max-w-md shadow-2xl border border-white/20"
className="bg-white rounded-3xl p-10 w-full max-w-lg shadow-2xl border border-white/20"
>
<div className="flex items-center justify-between mb-8">
<h3 className="text-xl font-black text-slate-900 tracking-tight">{t('changeUserPassword')}</h3>
@@ -981,22 +981,22 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<form onSubmit={(e) => { e.preventDefault(); handleUserPasswordChange(); }} className="space-y-6">
<div>
<label className="block text-[10px] font-black text-slate-400 uppercase tracking-widest mb-2 px-1">
<label className="block text-xs font-black text-slate-400 uppercase tracking-wider mb-2 px-1">
{t('newPassword')}
</label>
<input
type="password"
value={passwordChangeUserData.newPassword}
onChange={(e) => setPasswordChangeUserData({ ...passwordChangeUserData, newPassword: e.target.value })}
className="w-full px-4 py-3.5 bg-slate-50 border border-slate-200 rounded-2xl text-[14px] font-medium transition-all focus:outline-none focus:ring-4 focus:ring-indigo-500/10 focus:border-indigo-500/50"
className="w-full px-4 py-3 bg-slate-50 border border-slate-200 rounded-2xl text-sm font-medium transition-all focus:outline-none focus:ring-4 focus:ring-indigo-500/10 focus:border-indigo-500/50"
placeholder={t('enterNewPassword')}
required
/>
</div>
<div className="flex gap-4 pt-4">
<button type="button" onClick={() => setPasswordChangeUserData(null)} className="flex-1 py-3.5 text-slate-500 font-bold text-sm">{t('cancel')}</button>
<button type="submit" className="flex-1 py-3.5 bg-slate-900 text-white rounded-2xl font-black uppercase tracking-widest text-xs hover:bg-indigo-600 shadow-xl shadow-slate-100 transition-all">{t('confirmChange')}</button>
<button type="button" onClick={() => setPasswordChangeUserData(null)} className="flex-1 py-3 text-slate-500 font-bold text-sm">{t('cancel')}</button>
<button type="submit" className="flex-1 py-3 bg-slate-900 text-white rounded-2xl font-black uppercase tracking-widest text-xs hover:bg-indigo-600 shadow-xl shadow-slate-100 transition-all">{t('confirmChange')}</button>
</div>
</form>
</motion.div>
@@ -1057,14 +1057,14 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<label className="block text-xs font-black text-slate-400 uppercase tracking-wider mb-2 px-1">
</label>
<div className="flex gap-2">
<div className="flex flex-wrap gap-2">
{['USER', 'TENANT_ADMIN', 'SUPER_ADMIN'].map(r => (
<button
key={r}
type="button"
onClick={() => setEditUserData({ ...editUserData, role: r })}
disabled={r === 'SUPER_ADMIN' && currentUser?.role !== 'SUPER_ADMIN'}
className={`px-4 py-2.5 rounded-xl text-xs font-black uppercase tracking-wider transition-all border-2 ${
className={`flex-1 min-w-[100px] px-4 py-2.5 rounded-xl text-xs font-black uppercase tracking-wider transition-all border-2 ${
editUserData.role === r
? r === 'SUPER_ADMIN'
? 'border-red-500 bg-red-50 text-red-700'
@@ -1083,7 +1083,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
))}
</div>
{editUserData.role === 'SUPER_ADMIN' && currentUser?.role !== 'SUPER_ADMIN' && (
<p className="text-[10px] text-amber-600 mt-1"></p>
<p className="text-xs text-amber-600 mt-1"></p>
)}
</div>
@@ -1123,8 +1123,8 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
document.body
)}
<div className="w-full bg-white/70 backdrop-blur-md border border-slate-200/50 rounded-2xl overflow-hidden shadow-sm">
<table className="w-full border-collapse text-left">
<div className="w-full bg-white/70 backdrop-blur-md border border-slate-200/50 rounded-2xl overflow-x-auto shadow-sm">
<table className="w-full border-collapse text-left min-w-[700px]">
<thead>
<tr className="bg-slate-50/50 border-b border-slate-200/50">
<th className="px-6 py-3 text-xs font-black text-slate-400 uppercase tracking-wider">{t('username')}</th>
@@ -1182,7 +1182,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
))}
</div>
) : (
<span className="text-[10px] text-slate-400 italic">{t('noOrganization')}</span>
<span className="text-xs text-slate-400 italic">{t('noOrganization')}</span>
)}
</td>
<td className="px-6 py-4">
@@ -1278,7 +1278,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<div className="p-6 border-b border-slate-100 flex items-center justify-between shrink-0">
<div>
<h3 className="font-black text-slate-900 text-lg tracking-tight">{t('orgManagement')}</h3>
<p className="text-[10px] font-bold text-slate-400 uppercase tracking-widest">{t('globalTenantControl')}</p>
<p className="text-xs font-bold text-slate-400 uppercase tracking-widest">{t('globalTenantControl')}</p>
</div>
<button
onClick={() => {
@@ -1327,7 +1327,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<Building size={20} />
</div>
<div>
<p className="text-[10px] font-black text-slate-400 uppercase tracking-widest">{t('totalTenants')}</p>
<p className="text-xs font-black text-slate-400 uppercase tracking-widest">{t('totalTenants')}</p>
<p className="text-xl font-black text-slate-900">{stats.tenants}</p>
</div>
</div>
@@ -1384,7 +1384,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<div className="flex-1 flex flex-col border-r border-slate-100 overflow-hidden">
<div className="p-6 border-b border-slate-50 flex items-center justify-between shrink-0">
<h4 className="text-xs font-black text-slate-400 uppercase tracking-widest">{t('orgMembers')}</h4>
<span className="text-[10px] font-black px-2 py-0.5 bg-slate-100 text-slate-500 rounded-full">
<span className="text-xs font-black px-2 py-0.5 bg-slate-100 text-slate-500 rounded-full">
{t('membersCount').replace('$1', (memberTotal || 0).toString())}
</span>
</div>
@@ -1421,7 +1421,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
{(!tenantMembers || tenantMembers.length === 0) && (
<div className="py-20 text-center">
<Users size={24} className="mx-auto text-slate-200 mb-2" />
<p className="text-[10px] font-bold text-slate-300 uppercase tracking-wider">{t('noMembersAssigned')}</p>
<p className="text-xs font-bold text-slate-300 uppercase tracking-wider">{t('noMembersAssigned')}</p>
</div>
)}
</div>
@@ -1450,13 +1450,13 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<div className="mt-3 flex gap-1 p-1 bg-white border border-slate-200 rounded-xl">
<button
onClick={() => setBindingRole('USER')}
className={`flex-1 py-1.5 text-[10px] font-black uppercase tracking-widest rounded-lg transition-all ${bindingRole === 'USER' ? 'bg-indigo-600 text-white shadow-sm' : 'text-slate-400 hover:text-slate-600'}`}
className={`flex-1 py-1.5 text-xs font-black uppercase tracking-widest rounded-lg transition-all ${bindingRole === 'USER' ? 'bg-indigo-600 text-white shadow-sm' : 'text-slate-400 hover:text-slate-600'}`}
>
{t('roleRegularUser')}
</button>
<button
onClick={() => setBindingRole('TENANT_ADMIN')}
className={`flex-1 py-1.5 text-[10px] font-black uppercase tracking-widest rounded-lg transition-all ${bindingRole === 'TENANT_ADMIN' ? 'bg-indigo-600 text-white shadow-sm' : 'text-slate-400 hover:text-slate-600'}`}
className={`flex-1 py-1.5 text-xs font-black uppercase tracking-widest rounded-lg transition-all ${bindingRole === 'TENANT_ADMIN' ? 'bg-indigo-600 text-white shadow-sm' : 'text-slate-400 hover:text-slate-600'}`}
>
{t('roleTenantAdmin')}
</button>
@@ -1517,15 +1517,15 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<h3 className="text-xl font-black text-slate-900 mb-6">{editingTenant ? t('editOrg') : t('newTenant')}</h3>
<form onSubmit={handleCreateTenant} className="space-y-5">
<div>
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('tenantName')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('tenantName')}</label>
<input className="w-full mt-1 px-4 py-3 bg-slate-50 border border-slate-200 rounded-2xl text-sm" placeholder={t('tenantName')} value={newTenant.name} onChange={e => setNewTenant({ ...newTenant, name: e.target.value })} required />
</div>
<div>
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('domainOptional')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('domainOptional')}</label>
<input className="w-full mt-1 px-4 py-3 bg-slate-50 border border-slate-200 rounded-2xl text-sm" placeholder={t('domainOptional')} value={newTenant.domain} onChange={e => setNewTenant({ ...newTenant, domain: e.target.value })} />
</div>
<div>
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('parentOrg')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('parentOrg')}</label>
{!editingTenant ? (
<div className="w-full mt-1 px-4 py-3 bg-slate-100 border border-slate-200 rounded-2xl text-sm text-slate-500 font-bold">
{newTenant.parentId ? tenants.find(t => t.id === newTenant.parentId)?.name : t('noneRoot')}
@@ -1567,14 +1567,14 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<Users size={20} />
</div>
<p className="text-xl font-black text-slate-900">{stats.users}</p>
<p className="text-[10px] font-bold text-slate-400 uppercase tracking-widest mt-1">{t('totalSystemUsers')}</p>
<p className="text-xs font-bold text-slate-400 uppercase tracking-widest mt-1">{t('totalSystemUsers')}</p>
</div>
<div className="p-6 bg-white border border-slate-200 rounded-3xl text-left shadow-sm">
<div className="w-10 h-10 rounded-xl bg-emerald-50 flex items-center justify-center text-emerald-600 mb-4">
<Shield size={20} />
</div>
<p className="text-xl font-black text-slate-900">{tenants.filter(t => t.parentId === null).length}</p>
<p className="text-[10px] font-bold text-slate-400 uppercase tracking-widest mt-1">{t('rootOrgs')}</p>
<p className="text-xs font-bold text-slate-400 uppercase tracking-widest mt-1">{t('rootOrgs')}</p>
</div>
</div>
@@ -1585,15 +1585,15 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<h3 className="text-xl font-black text-slate-900 mb-6">{t('newTenant')}</h3>
<form onSubmit={handleCreateTenant} className="space-y-5">
<div>
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('tenantName')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('tenantName')}</label>
<input className="w-full mt-1 px-4 py-3 bg-slate-50 border border-slate-200 rounded-2xl text-sm" placeholder={t('tenantName')} value={newTenant.name} onChange={e => setNewTenant({ ...newTenant, name: e.target.value })} required />
</div>
<div>
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('domainOptional')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('domainOptional')}</label>
<input className="w-full mt-1 px-4 py-3 bg-slate-50 border border-slate-200 rounded-2xl text-sm" placeholder={t('domainOptional')} value={newTenant.domain} onChange={e => setNewTenant({ ...newTenant, domain: e.target.value })} />
</div>
<div>
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('parentOrg')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('parentOrg')}</label>
<select
className="w-full mt-1 px-4 py-3 bg-slate-50 border border-slate-200 rounded-2xl text-sm outline-none focus:ring-2 focus:ring-indigo-500/20"
value={newTenant.parentId || ''}
@@ -1663,7 +1663,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
</div>
<div className="grid grid-cols-1 gap-6">
<div>
<label className="block text-[10px] font-black text-slate-400 uppercase tracking-widest mb-2 px-1">{t('defaultLLMModel')}</label>
<label className="block text-xs font-black text-slate-400 uppercase tracking-widest mb-2 px-1">{t('defaultLLMModel')}</label>
<select
value={localKbSettings.selectedLLMId || ''}
onChange={(e) => handleUpdateKbSettings('selectedLLMId', e.target.value)}
@@ -1677,7 +1677,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<label className="block text-[10px] font-black text-slate-400 uppercase tracking-widest mb-2 px-1">{t('embeddingModel')}</label>
<label className="block text-xs font-black text-slate-400 uppercase tracking-widest mb-2 px-1">{t('embeddingModel')}</label>
<select
value={localKbSettings.selectedEmbeddingId || ''}
onChange={(e) => handleUpdateKbSettings('selectedEmbeddingId', e.target.value)}
@@ -1690,7 +1690,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
</select>
</div>
<div>
<label className="block text-[10px] font-black text-slate-400 uppercase tracking-widest mb-2 px-1">{t('rerankModel')}</label>
<label className="block text-xs font-black text-slate-400 uppercase tracking-widest mb-2 px-1">{t('rerankModel')}</label>
<select
value={localKbSettings.selectedRerankId || ''}
onChange={(e) => handleUpdateKbSettings('selectedRerankId', e.target.value)}
@@ -1703,7 +1703,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
</select>
</div>
<div>
<label className="block text-[10px] font-black text-slate-400 uppercase tracking-widest mb-2 px-1">
<label className="block text-xs font-black text-slate-400 uppercase tracking-widest mb-2 px-1">
{t('defaultVisionModel')}
<span className="ml-1 text-[8px] opacity-60">({t('typeVision')})</span>
</label>
@@ -1733,7 +1733,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
<div>
<div className="flex justify-between mb-3 px-1">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest">{t('chunkSize')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest">{t('chunkSize')}</label>
<span className="text-sm font-black text-indigo-600 bg-indigo-50 px-2 py-0.5 rounded-lg">{localKbSettings.chunkSize || 1000}</span>
</div>
<input
@@ -1748,7 +1748,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
</div>
<div>
<div className="flex justify-between mb-3 px-1">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest">{t('chunkOverlap')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest">{t('chunkOverlap')}</label>
<span className="text-sm font-black text-indigo-600 bg-indigo-50 px-2 py-0.5 rounded-lg">{localKbSettings.chunkOverlap || 100}</span>
</div>
<input
@@ -1775,7 +1775,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<div className="space-y-8">
<div>
<div className="flex justify-between mb-3 px-1">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest">{t('temperature')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest">{t('temperature')}</label>
<span className="text-sm font-black text-indigo-600 bg-indigo-50 px-2 py-0.5 rounded-lg">{localKbSettings.temperature}</span>
</div>
<input
@@ -1793,7 +1793,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
</div>
</div>
<div>
<label className="block text-[10px] font-black text-slate-400 uppercase tracking-widest mb-2 px-1">{t('maxResponseTokens')}</label>
<label className="block text-xs font-black text-slate-400 uppercase tracking-widest mb-2 px-1">{t('maxResponseTokens')}</label>
<input
type="number"
value={localKbSettings.maxTokens || 2000}
@@ -1816,7 +1816,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<div className="grid grid-cols-1 md:grid-cols-2 gap-8">
<div>
<div className="flex justify-between mb-3 px-1">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest">{t('topK')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest">{t('topK')}</label>
<span className="text-sm font-black text-indigo-600 bg-indigo-50 px-2 py-0.5 rounded-lg">{localKbSettings.topK}</span>
</div>
<input
@@ -1831,7 +1831,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
</div>
<div>
<div className="flex justify-between mb-3 px-1">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest">{t('similarityThreshold')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest">{t('similarityThreshold')}</label>
<span className="text-sm font-black text-indigo-600 bg-indigo-50 px-2 py-0.5 rounded-lg">{localKbSettings.similarityThreshold}</span>
</div>
<input
@@ -1850,7 +1850,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<div className="flex items-center justify-between p-5 bg-slate-50/50 rounded-2xl border border-slate-200/30 transition-all hover:bg-white hover:border-indigo-100">
<div>
<div className="text-sm font-bold text-slate-800">{t('enableHybridSearch')}</div>
<div className="text-[10px] text-slate-400 font-medium">{t('hybridSearchDesc')}</div>
<div className="text-xs text-slate-400 font-medium">{t('hybridSearchDesc')}</div>
</div>
<button
onClick={() => handleUpdateKbSettings('enableFullTextSearch', !localKbSettings.enableFullTextSearch)}
@@ -1867,7 +1867,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
className="p-5 bg-indigo-50/30 rounded-2xl border border-indigo-100/50 space-y-4"
>
<div className="flex justify-between mb-2 px-1">
<label className="text-[10px] font-black text-indigo-400 uppercase tracking-widest">{t('hybridWeight')}</label>
<label className="text-xs font-black text-indigo-400 uppercase tracking-widest">{t('hybridWeight')}</label>
<span className="text-sm font-black text-indigo-600">{localKbSettings.hybridVectorWeight || 0.5}</span>
</div>
<input
@@ -1890,7 +1890,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<div className="flex items-center justify-between p-5 bg-slate-50/50 rounded-2xl border border-slate-200/30 transition-all hover:bg-white hover:border-indigo-100">
<div>
<div className="text-sm font-bold text-slate-800">{t('enableQueryExpansion')}</div>
<div className="text-[10px] text-slate-400 font-medium">{t('queryExpansionDesc')}</div>
<div className="text-xs text-slate-400 font-medium">{t('queryExpansionDesc')}</div>
</div>
<button
onClick={() => handleUpdateKbSettings('enableQueryExpansion', !localKbSettings.enableQueryExpansion)}
@@ -1903,7 +1903,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<div className="flex items-center justify-between p-5 bg-slate-50/50 rounded-2xl border border-slate-200/30 transition-all hover:bg-white hover:border-indigo-100">
<div>
<div className="text-sm font-bold text-slate-800">{t('enableHyDE')}</div>
<div className="text-[10px] text-slate-400 font-medium">{t('hydeDesc')}</div>
<div className="text-xs text-slate-400 font-medium">{t('hydeDesc')}</div>
</div>
<button
onClick={() => handleUpdateKbSettings('enableHyDE', !localKbSettings.enableHyDE)}
@@ -1917,7 +1917,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<div className="flex items-center justify-between p-5 bg-slate-50/50 rounded-2xl border border-slate-200/30 transition-all hover:bg-white hover:border-indigo-100">
<div>
<div className="text-sm font-bold text-slate-800">{t('enableReranking')}</div>
<div className="text-[10px] text-slate-400 font-medium">{t('rerankingDesc')}</div>
<div className="text-xs text-slate-400 font-medium">{t('rerankingDesc')}</div>
</div>
<button
onClick={() => handleUpdateKbSettings('enableRerank', !localKbSettings.enableRerank)}
@@ -1934,7 +1934,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
className="p-5 bg-indigo-50/30 rounded-2xl border border-indigo-100/50 space-y-4"
>
<div className="flex justify-between mb-2 px-1">
<label className="text-[10px] font-black text-indigo-400 uppercase tracking-widest">{t('rerankSimilarityThreshold')}</label>
<label className="text-xs font-black text-indigo-400 uppercase tracking-widest">{t('rerankSimilarityThreshold')}</label>
<span className="text-sm font-black text-indigo-600">{localKbSettings.rerankSimilarityThreshold || 0.5}</span>
</div>
<input
@@ -1996,17 +1996,17 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<div className="space-y-2">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('mmFormName')} *</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('mmFormName')} *</label>
<input className="w-full px-4 py-3.5 bg-slate-50 border border-slate-200 rounded-2xl text-sm font-medium focus:ring-4 focus:ring-indigo-500/10 focus:border-indigo-500/50 outline-none transition-all" value={modelFormData.name || ''} onChange={e => setModelFormData({ ...modelFormData, name: e.target.value })} disabled={isLoading} />
</div>
<div className="space-y-2">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('mmFormModelId')} *</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('mmFormModelId')} *</label>
<input className="w-full px-4 py-3.5 bg-slate-50 border border-slate-200 rounded-2xl text-sm font-mono focus:ring-4 focus:ring-indigo-500/10 focus:border-indigo-500/50 outline-none transition-all" value={modelFormData.modelId || ''} onChange={e => setModelFormData({ ...modelFormData, modelId: e.target.value })} disabled={isLoading} />
</div>
</div>
<div className="space-y-2">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('mmFormType')} *</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('mmFormType')} *</label>
<select className="w-full px-4 py-3.5 bg-slate-50 border border-slate-200 rounded-2xl text-sm font-medium focus:ring-4 focus:ring-indigo-500/10 focus:border-indigo-500/50 outline-none transition-all appearance-none" value={modelFormData.type} onChange={e => setModelFormData({ ...modelFormData, type: e.target.value as ModelType })} disabled={isLoading}>
<option value={ModelType.LLM}>{t('typeLLM')}</option>
<option value={ModelType.EMBEDDING}>{t('typeEmbedding')}</option>
@@ -2016,12 +2016,12 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
</div>
<div className="space-y-2">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('mmFormBaseUrl')} *</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('mmFormBaseUrl')} *</label>
<input className="w-full px-4 py-3.5 bg-slate-50 border border-slate-200 rounded-2xl text-sm font-mono focus:ring-4 focus:ring-indigo-500/10 focus:border-indigo-500/50 outline-none transition-all" value={modelFormData.baseUrl || ''} onChange={e => setModelFormData({ ...modelFormData, baseUrl: e.target.value })} disabled={isLoading} />
</div>
<div className="space-y-2">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('mmFormApiKey')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('mmFormApiKey')}</label>
<input
type="password"
className="w-full px-4 py-3.5 bg-slate-50 border border-slate-200 rounded-2xl text-sm font-mono focus:ring-4 focus:ring-indigo-500/10 focus:border-indigo-500/50 outline-none transition-all"
@@ -2035,11 +2035,11 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
{modelFormData.type === ModelType.EMBEDDING && (
<div className="grid grid-cols-2 gap-6 p-6 bg-slate-50 rounded-3xl border border-slate-200/50">
<div className="space-y-2">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('maxInput')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('maxInput')}</label>
<input type="number" className="w-full px-4 py-3 bg-white border border-slate-200 rounded-xl text-sm font-bold" value={modelFormData.maxInputTokens || 8191} onChange={e => setModelFormData({ ...modelFormData, maxInputTokens: parseInt(e.target.value) })} />
</div>
<div className="space-y-2">
<label className="text-[10px] font-black text-slate-400 uppercase tracking-widest px-1">{t('dimensions')}</label>
<label className="text-xs font-black text-slate-400 uppercase tracking-widest px-1">{t('dimensions')}</label>
<input type="number" className="w-full px-4 py-3 bg-white border border-slate-200 rounded-xl text-sm font-bold" value={modelFormData.dimensions || 1536} onChange={e => setModelFormData({ ...modelFormData, dimensions: parseInt(e.target.value) })} />
</div>
</div>
@@ -2126,7 +2126,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
</div>
<div className="flex items-center justify-between pt-4 border-t border-slate-100/50 relative z-10">
<div className="flex items-center gap-1 text-[10px] font-bold text-slate-400">
<div className="flex items-center gap-1 text-xs font-bold text-slate-400">
<SettingsIcon size={12} />
{t('configured')}
</div>
@@ -2268,7 +2268,7 @@ export const SettingsView: React.FC<SettingsViewProps> = ({
<X className="w-4 h-4 text-red-600" />
</div>
<div>
<span className="font-black uppercase tracking-widest text-[10px] block mb-0.5">{t('errorLabel')}</span>
<span className="font-black uppercase tracking-widest text-xs block mb-0.5">{t('errorLabel')}</span>
{error}
</div>
</motion.div>