From 8ab45f1b6e5fbaf40ba2d1a6acc8cff980a43657 Mon Sep 17 00:00:00 2001 From: sepehr Date: Sun, 31 May 2026 11:05:34 +0200 Subject: [PATCH] style(translate): make LLM cards compact in a 3-column grid, remove glossary language filtering, and add contextual help under engine selection --- .../dashboard/translate/GlossarySelector.tsx | 6 +- .../dashboard/translate/ProviderSelector.tsx | 159 ++++++++---------- 2 files changed, 69 insertions(+), 96 deletions(-) diff --git a/frontend/src/app/dashboard/translate/GlossarySelector.tsx b/frontend/src/app/dashboard/translate/GlossarySelector.tsx index feb7c98..7a98d21 100644 --- a/frontend/src/app/dashboard/translate/GlossarySelector.tsx +++ b/frontend/src/app/dashboard/translate/GlossarySelector.tsx @@ -222,11 +222,7 @@ export function GlossarySelector({ sourceLang, targetLang, isPro, mode, glossary const sourceFlag = SUPPORTED_LANGUAGES.find(l => l.code === sourceLang)?.flag ?? ''; const targetFlag = SUPPORTED_LANGUAGES.find(l => l.code === targetLang)?.flag ?? ''; - const langFiltered = sourceLang === 'auto' - ? glossaries - : glossaries.filter(g => g.source_language === sourceLang); - - const filteredGlossaries = langFiltered.length > 0 ? langFiltered : glossaries; + const filteredGlossaries = glossaries; const selected = glossaries.find(g => g.id === glossaryId); return (
onProviderChange(p.id)} className={cn( - 'relative overflow-hidden w-full text-start rounded-2xl border p-4 transition-all duration-300 active:scale-[0.99] flex items-start gap-3.5', + 'p-2 py-1.5 rounded-lg border text-left transition-all relative overflow-hidden flex flex-col justify-center min-h-[44px]', isSelected - ? 'border-brand-accent bg-brand-muted/20 dark:bg-zinc-800/40 ring-1 ring-brand-accent/20' - : 'border-brand-dark/10 dark:border-white/10 bg-white dark:bg-[#141414] hover:border-brand-accent/30 dark:hover:border-brand-accent/30 hover:scale-[1.005]' + ? 'border-brand-accent bg-brand-accent/5 dark:bg-brand-accent/10' + : 'border-black/[0.05] dark:border-white/[0.05] bg-brand-muted/20 dark:bg-zinc-800/10 hover:bg-brand-muted/50 dark:hover:bg-zinc-800/20' )} > - {/* Radio Indicator */} -
- {isSelected &&
} -
- - {/* Content */} -
+
- {label} - - - {description} + Standard + {isSelected &&
}
- - {/* Selected badge */} - {isSelected && ( - - )} + + {label} + ); }; @@ -181,7 +167,6 @@ export function ProviderSelector({ const renderLlmCard = (p: AvailableProvider, locked: boolean) => { const isSelected = provider === p.id; const theme = LLM_THEMES[p.id] || DEFAULT_LLM_THEME; - const description = theme.descriptionOverride || p.description; return ( ); }; return ( -
+
{/* Title */}
{/* Active Tab List */} -
+
{activeTab === 'classic' ? ( classicProviders.length > 0 ? ( -
+
{classicProviders.map((p) => renderClassicCard(p))}
) : ( -

+

Aucun traducteur standard disponible.

) ) : ( llmProviders.length > 0 ? ( -
+
{llmProviders.map((p) => renderLlmCard(p, !isPro))}
) : ( -

+

Aucun modèle IA configuré.

) )} + + {/* Dynamic Contextual Help Area */} + {provider && ( +
+ {activeTab === 'classic' ? ( + (() => { + const activeP = classicProviders.find(p => p.id === provider); + const meta = activeP ? CLASSIC_THEMES[activeP.id] : null; + return activeP ? ( +

+ {meta?.labelOverride || activeP.label} : + {meta?.descriptionOverride || activeP.description} +

+ ) : null; + })() + ) : ( + (() => { + const activeP = llmProviders.find(p => p.id === provider); + const theme = activeP ? (LLM_THEMES[activeP.id] || DEFAULT_LLM_THEME) : null; + return activeP && theme ? ( +

+ {activeP.label} : + {theme.descriptionOverride} ({activeP.model || 'default'}) +

+ ) : null; + })() + )} +
+ )}
{/* Pro upgrade banner when llm is active and user is not pro */} {!isPro && activeTab === 'llm' && ( -
- - +
+ + {t('dashboard.translate.provider.llmDivider') || 'Intelligence Artificielle Active'} -

- Débloquez la traduction contextuelle haut de gamme pour des documents entiers tout en préservant le ton exact. +

+ Débloquez la traduction contextuelle haut de gamme pour vos documents entiers.

{t('dashboard.translate.provider.upgrade') || 'Passer Pro'}