From fd86f7e10be435dabceade9eaa7cd0e956eb6ca6 Mon Sep 17 00:00:00 2001 From: Song367 <601337784@qq.com> Date: Sat, 21 Mar 2026 13:59:42 +0800 Subject: [PATCH] feat: fit upload controls into first fold --- src/App.test.tsx | 17 ++-- src/App.tsx | 20 ++--- src/components/UploadScreen.test.tsx | 17 ++++ src/components/UploadScreen.tsx | 127 ++++++++++++--------------- src/i18n.tsx | 5 +- 5 files changed, 95 insertions(+), 91 deletions(-) diff --git a/src/App.test.tsx b/src/App.test.tsx index efd9131..f6b1b37 100644 --- a/src/App.test.tsx +++ b/src/App.test.tsx @@ -34,11 +34,18 @@ describe('App bilingual UI', () => { fireEvent.click(screen.getByLabelText('switch-ui-language-en')); expect(screen.getByRole('heading', { name: 'Upload & prepare' })).toBeInTheDocument(); - expect( - screen.getByText( - 'Upload a source video, tune subtitle defaults, and choose dubbing settings before generation.', - ), - ).toBeInTheDocument(); + expect(screen.getByText('Everything you need to start translation is visible right away.')).toBeInTheDocument(); expect(screen.getByText('Video Translate')).toBeInTheDocument(); }); + + it('renders the upload shell with compact first-fold copy', () => { + render(); + + fireEvent.click(screen.getByLabelText('switch-ui-language-en')); + + expect(screen.getByRole('heading', { name: 'Upload & prepare' })).toBeInTheDocument(); + expect( + screen.getByText('Everything you need to start translation is visible right away.'), + ).toBeInTheDocument(); + }); }); diff --git a/src/App.tsx b/src/App.tsx index 4c64240..460d807 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -70,24 +70,24 @@ function AppContent() { return (
-
+
{currentView === 'upload' ? (
-
-
- +
+
+ {m.upload.workbenchEyebrow} {m.app.productName}
-
-

+
+

{m.upload.workbenchTitle}

-

+

{m.upload.workbenchDescription}

@@ -96,11 +96,11 @@ function AppContent() {
{languageSwitcher}

) : ( -
{languageSwitcher}
+
{languageSwitcher}
)}
-
+
{currentView === 'upload' ? ( ) : ( diff --git a/src/components/UploadScreen.test.tsx b/src/components/UploadScreen.test.tsx index ba2f248..4fc006d 100644 --- a/src/components/UploadScreen.test.tsx +++ b/src/components/UploadScreen.test.tsx @@ -67,6 +67,23 @@ describe('UploadScreen', () => { expect(screen.getByRole('heading', { name: 'Language & Dubbing' })).toBeInTheDocument(); }); + it('shows all supported tts languages in a compact always-visible grid', () => { + renderUploadScreen(); + + expect(screen.getByTestId('tts-language-grid')).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Chinese' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Cantonese' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'English' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'French' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Indonesian' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'German' })).toBeInTheDocument(); + expect(screen.getByRole('button', { name: 'Filipino' })).toBeInTheDocument(); + + expect(screen.queryByText('ABC')).not.toBeInTheDocument(); + expect(screen.queryByText('GHI')).not.toBeInTheDocument(); + expect(screen.queryByText('DEF')).not.toBeInTheDocument(); + }); + it('shows a fixed English subtitle language and the supported TTS languages', () => { renderUploadScreen(); diff --git a/src/components/UploadScreen.tsx b/src/components/UploadScreen.tsx index 4d9dadb..aa4010f 100644 --- a/src/components/UploadScreen.tsx +++ b/src/components/UploadScreen.tsx @@ -36,7 +36,7 @@ export default function UploadScreen({ const activeModeLabel = mode === 'editing' ? m.upload.editingMode : m.upload.simpleMode; const activeModeDescription = mode === 'editing' ? m.upload.editingModeDesc : m.upload.simpleModeDesc; const settingsCardClass = - 'app-surface rounded-[28px] border border-white/70 px-5 py-5 shadow-[0_18px_60px_-34px_rgba(15,23,42,0.3)] sm:px-6'; + 'app-surface rounded-[24px] border border-white/70 px-4 py-4 shadow-[0_18px_60px_-34px_rgba(15,23,42,0.3)] sm:px-5'; const clearPendingUpload = () => { setTempFile(null); @@ -61,23 +61,23 @@ export default function UploadScreen({ return (
-
+
-

+

{m.upload.uploadPanelTitle}

-

+

{m.upload.uploadPanelDescription}

-
+

{m.upload.modeWorkflowTitle}

@@ -86,9 +86,9 @@ export default function UploadScreen({
-
+
-
+
-
- +
+
-

{m.upload.uploadVideo}

-

+

{m.upload.uploadVideo}

+

{m.upload.clickToUpload}

- @@ -114,7 +114,7 @@ export default function UploadScreen({
-
+

{m.upload.supportedFormats}

{activeModeLabel} @@ -124,19 +124,19 @@ export default function UploadScreen({