From c2a777580a606409bfdfda766d1d7f9af29b1524 Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Thu, 26 Feb 2026 16:49:03 -0300 Subject: [PATCH] fix(ui): improve dashboard responsiveness and i18n error message - Add responsive breakpoints (sm/lg) for flex and grid layouts - Prevent text overflow with min-w-0 and break-words utilities - Stack buttons and inputs vertically on small screens - Replace hardcoded HTTP error with translated audit log message --- .../dashboard/logs/AuditLogTab.tsx | 2 +- .../dashboard/providers/new/page.tsx | 14 ++-- .../settings/components/IPFilterSection.tsx | 12 +-- .../settings/components/PricingTab.tsx | 75 ++++++++++--------- .../settings/components/ResilienceTab.tsx | 4 +- .../settings/components/RoutingTab.tsx | 24 ++++-- .../settings/components/SystemPromptTab.tsx | 6 +- .../settings/components/SystemStorageTab.tsx | 4 +- .../settings/components/ThinkingBudgetTab.tsx | 2 +- .../(dashboard)/dashboard/settings/page.tsx | 54 ++++++------- .../translator/TranslatorPageClient.tsx | 14 +++- .../translator/components/ChatTesterMode.tsx | 6 +- .../translator/components/LiveMonitorMode.tsx | 4 +- .../translator/components/PlaygroundMode.tsx | 2 +- .../translator/components/TestBenchMode.tsx | 7 +- src/app/landing/components/Features.tsx | 6 +- src/app/landing/components/FlowAnimation.tsx | 6 +- src/app/landing/components/Footer.tsx | 6 +- src/app/landing/components/GetStarted.tsx | 20 ++--- src/app/landing/components/HeroSection.tsx | 10 +-- src/app/landing/components/HowItWorks.tsx | 14 ++-- src/app/landing/components/Navigation.tsx | 10 ++- src/app/landing/page.tsx | 10 ++- src/app/layout.tsx | 4 +- src/i18n/config.ts | 63 +++++++++++++++- 25 files changed, 240 insertions(+), 139 deletions(-) diff --git a/src/app/(dashboard)/dashboard/logs/AuditLogTab.tsx b/src/app/(dashboard)/dashboard/logs/AuditLogTab.tsx index 24e8e09f51..dc5fcfa12e 100644 --- a/src/app/(dashboard)/dashboard/logs/AuditLogTab.tsx +++ b/src/app/(dashboard)/dashboard/logs/AuditLogTab.tsx @@ -41,7 +41,7 @@ export default function AuditLogTab() { params.set("offset", String(offset)); const res = await fetch(`/api/compliance/audit-log?${params.toString()}`); - if (!res.ok) throw new Error(`HTTP ${res.status}`); + if (!res.ok) throw new Error(t("failedFetchAuditLog")); const data: AuditEntry[] = await res.json(); setHasMore(data.length > PAGE_SIZE); diff --git a/src/app/(dashboard)/dashboard/providers/new/page.tsx b/src/app/(dashboard)/dashboard/providers/new/page.tsx index 605426ff80..8dadb07130 100644 --- a/src/app/(dashboard)/dashboard/providers/new/page.tsx +++ b/src/app/(dashboard)/dashboard/providers/new/page.tsx @@ -75,7 +75,7 @@ export default function NewProviderPage() { const selectedProvider = (AI_PROVIDERS as any)[formData.provider]; return ( -
+
{/* Header */}
arrow_back {t("backToProviders")} -

{t("addNewProvider")}

+

+ {t("addNewProvider")} +

{t("configureNewProvider")}

@@ -126,13 +128,13 @@ export default function NewProviderPage() { -
+
{authMethodOptions.map((method) => ( @@ -198,7 +200,7 @@ export default function NewProviderPage() { )} {/* Actions */} -
+
{/* Mode selector */} -
+
{MODES.map((m) => (
{editMode ? ( -
+
@@ -217,7 +217,7 @@ function RateLimitCard({ rateLimitStatus, defaults, onSaveDefaults, saving }) {

{t("defaultSafetyNet")}

-
+
{[ { key: "requestsPerMinute", label: t("rpm") }, { key: "minTimeBetweenRequests", label: t("minGap"), format: formatMs }, diff --git a/src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx b/src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx index 567185d9d4..634f440537 100644 --- a/src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx +++ b/src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx @@ -99,7 +99,10 @@ export default function RoutingTab() {

{t("routingStrategy")}

-
+
{STRATEGIES.map((s) => ( @@ -192,7 +195,7 @@ export default function RoutingTab() {
)} -
+
setNewTarget(e.target.value)} />
-
diff --git a/src/app/(dashboard)/dashboard/settings/components/SystemPromptTab.tsx b/src/app/(dashboard)/dashboard/settings/components/SystemPromptTab.tsx index acc78269f0..d292a53a62 100644 --- a/src/app/(dashboard)/dashboard/settings/components/SystemPromptTab.tsx +++ b/src/app/(dashboard)/dashboard/settings/components/SystemPromptTab.tsx @@ -92,14 +92,12 @@ export default function SystemPromptTab() { disabled={loading} />
- {config.prompt.length} chars + {t("chars", { count: config.prompt.length })}

info - {t("systemPromptHint")} Send{" "} - _skipSystemPrompt: true in a - request to bypass. + {t("systemPromptHint")}

)} diff --git a/src/app/(dashboard)/dashboard/settings/components/SystemStorageTab.tsx b/src/app/(dashboard)/dashboard/settings/components/SystemStorageTab.tsx index 8df06ecd8f..fad6afc6dc 100644 --- a/src/app/(dashboard)/dashboard/settings/components/SystemStorageTab.tsx +++ b/src/app/(dashboard)/dashboard/settings/components/SystemStorageTab.tsx @@ -259,7 +259,7 @@ export default function SystemStorageTab() {
{/* Storage info grid */} -
+

{t("databasePath")} @@ -277,7 +277,7 @@ export default function SystemStorageTab() {

{/* Export / Import */} -
+
- ))} +
+
+ {tabs.map((tab) => ( + + ))} +
{/* Tab contents */} diff --git a/src/app/(dashboard)/dashboard/translator/TranslatorPageClient.tsx b/src/app/(dashboard)/dashboard/translator/TranslatorPageClient.tsx index 45adeefcf0..0a4c073adf 100644 --- a/src/app/(dashboard)/dashboard/translator/TranslatorPageClient.tsx +++ b/src/app/(dashboard)/dashboard/translator/TranslatorPageClient.tsx @@ -26,9 +26,9 @@ export default function TranslatorPageClient() { }; return ( -
+
{/* Header */} -
+

translate @@ -38,7 +38,15 @@ export default function TranslatorPageClient() { {modeDescriptions[mode] || t("modeDescriptionFallback")}

- +
+ +
{/* Mode Content */} diff --git a/src/app/(dashboard)/dashboard/translator/components/ChatTesterMode.tsx b/src/app/(dashboard)/dashboard/translator/components/ChatTesterMode.tsx index 7f9e908291..07aaed5b04 100644 --- a/src/app/(dashboard)/dashboard/translator/components/ChatTesterMode.tsx +++ b/src/app/(dashboard)/dashboard/translator/components/ChatTesterMode.tsx @@ -248,7 +248,7 @@ export default function ChatTesterMode() { }; return ( -
+
{/* Info Banner */}
@@ -264,7 +264,7 @@ export default function ChatTesterMode() {
-
+
{/* Left: Chat Interface */}
{/* Controls */} @@ -349,7 +349,7 @@ export default function ChatTesterMode() { ? t("youWithFormat", { format: FORMAT_META[clientFormat]?.label }) : t("assistant")}

-

{msg.content}

+

{msg.content}

))} diff --git a/src/app/(dashboard)/dashboard/translator/components/LiveMonitorMode.tsx b/src/app/(dashboard)/dashboard/translator/components/LiveMonitorMode.tsx index 4a2f0a630f..7d535efaae 100644 --- a/src/app/(dashboard)/dashboard/translator/components/LiveMonitorMode.tsx +++ b/src/app/(dashboard)/dashboard/translator/components/LiveMonitorMode.tsx @@ -54,7 +54,7 @@ export default function LiveMonitorMode() { : 0; return ( -
+
{/* Info Banner */}
- + {event.model || notAvailable} diff --git a/src/app/(dashboard)/dashboard/translator/components/PlaygroundMode.tsx b/src/app/(dashboard)/dashboard/translator/components/PlaygroundMode.tsx index b16d55c20f..b1e0a6de13 100644 --- a/src/app/(dashboard)/dashboard/translator/components/PlaygroundMode.tsx +++ b/src/app/(dashboard)/dashboard/translator/components/PlaygroundMode.tsx @@ -186,7 +186,7 @@ export default function PlaygroundMode() { onClick={handleTranslate} loading={translating} disabled={!inputContent.trim() || translating} - className="whitespace-nowrap" + className="w-full sm:w-auto" > {t("translateAction")} diff --git a/src/app/(dashboard)/dashboard/translator/components/TestBenchMode.tsx b/src/app/(dashboard)/dashboard/translator/components/TestBenchMode.tsx index d95981e1e1..1d4a263474 100644 --- a/src/app/(dashboard)/dashboard/translator/components/TestBenchMode.tsx +++ b/src/app/(dashboard)/dashboard/translator/components/TestBenchMode.tsx @@ -107,7 +107,7 @@ export default function TestBenchMode() { ...prev, [scenario.id]: { status: "error", - error: errData.error || `HTTP ${sendRes.status}`, + error: errData.error || t("errorMessage", { message: `HTTP ${sendRes.status}` }), latency, httpStatus: sendRes.status, }, @@ -152,7 +152,7 @@ export default function TestBenchMode() { const srcMeta = FORMAT_META[sourceFormat] || FORMAT_META.openai; return ( -
+
{/* Info Banner */}
@@ -167,7 +167,7 @@ export default function TestBenchMode() { {/* Controls */}
-
+

{t(feature.titleKey)}

-

{t(feature.descKey)}

+

+ {t(feature.descKey)} +

))}
diff --git a/src/app/landing/components/FlowAnimation.tsx b/src/app/landing/components/FlowAnimation.tsx index 193d7f9d93..c1fd457774 100644 --- a/src/app/landing/components/FlowAnimation.tsx +++ b/src/app/landing/components/FlowAnimation.tsx @@ -49,8 +49,8 @@ export default function FlowAnimation() { }, [providers.length]); return ( -
-
+
+
{/* OmniRoute Hub - Center */}
@@ -56,8 +58,8 @@ export default function HowItWorks() {
-

{t("howItWorksStep3Title")}

-

{t("howItWorksStep3Description")}

+

{t("howItWorksStep3Title")}

+

{t("howItWorksStep3Description")}

diff --git a/src/app/landing/components/Navigation.tsx b/src/app/landing/components/Navigation.tsx index 07da785878..ca0dd2caba 100644 --- a/src/app/landing/components/Navigation.tsx +++ b/src/app/landing/components/Navigation.tsx @@ -11,18 +11,20 @@ export default function Navigation() { return (