From ea353c963cbbf5c72cf74f52e43183b6f4d0dcbe Mon Sep 17 00:00:00 2001 From: Song367 <601337784@qq.com> Date: Sat, 21 Mar 2026 14:06:30 +0800 Subject: [PATCH] feat: move language card into top row --- src/components/UploadScreen.test.tsx | 16 +++ src/components/UploadScreen.tsx | 148 +++++++++++++-------------- 2 files changed, 90 insertions(+), 74 deletions(-) diff --git a/src/components/UploadScreen.test.tsx b/src/components/UploadScreen.test.tsx index 4fc006d..614ba2e 100644 --- a/src/components/UploadScreen.test.tsx +++ b/src/components/UploadScreen.test.tsx @@ -67,6 +67,15 @@ describe('UploadScreen', () => { expect(screen.getByRole('heading', { name: 'Language & Dubbing' })).toBeInTheDocument(); }); + it('renders upload, mode, and language cards as first-row regions', () => { + renderUploadScreen(); + + expect(screen.getByTestId('upload-dropzone-card')).toBeInTheDocument(); + expect(screen.getByTestId('mode-card')).toBeInTheDocument(); + expect(screen.getByTestId('language-card')).toBeInTheDocument(); + expect(screen.getByTestId('subtitle-defaults-card')).toBeInTheDocument(); + }); + it('shows all supported tts languages in a compact always-visible grid', () => { renderUploadScreen(); @@ -84,6 +93,13 @@ describe('UploadScreen', () => { expect(screen.queryByText('DEF')).not.toBeInTheDocument(); }); + it('keeps the language card controls intact after moving into the first row', () => { + renderUploadScreen(); + + expect(screen.getByTestId('language-card')).toContainElement(screen.getByTestId('tts-language-grid')); + expect(screen.getByRole('button', { name: 'Generate Translated Video' })).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 aa4010f..116a9dd 100644 --- a/src/components/UploadScreen.tsx +++ b/src/components/UploadScreen.tsx @@ -34,7 +34,6 @@ export default function UploadScreen({ const [subtitleDefaults, setSubtitleDefaults] = useState(DEFAULT_SUBTITLE_DEFAULTS); const fileInputRef = useRef(null); 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-[24px] border border-white/70 px-4 py-4 shadow-[0_18px_60px_-34px_rgba(15,23,42,0.3)] sm:px-5'; @@ -61,13 +60,13 @@ export default function UploadScreen({ return (
-
+

{m.upload.uploadPanelTitle} @@ -76,14 +75,6 @@ export default function UploadScreen({ {m.upload.uploadPanelDescription}

- -
-

- {m.upload.modeWorkflowTitle} -

-

{activeModeLabel}

-

{activeModeDescription}

-
@@ -122,17 +113,20 @@ export default function UploadScreen({
- +
{showTrimModal && tempFile && (