From 0b50b0b43245082ffc1a92cda2af08f90d136adf Mon Sep 17 00:00:00 2001 From: Song367 <601337784@qq.com> Date: Sat, 21 Mar 2026 14:25:50 +0800 Subject: [PATCH] feat: embed subtitle defaults in upload card --- src/components/UploadScreen.test.tsx | 18 ++- src/components/UploadScreen.tsx | 195 ++++++++++++++------------- 2 files changed, 116 insertions(+), 97 deletions(-) diff --git a/src/components/UploadScreen.test.tsx b/src/components/UploadScreen.test.tsx index 614ba2e..dfdfd63 100644 --- a/src/components/UploadScreen.test.tsx +++ b/src/components/UploadScreen.test.tsx @@ -73,7 +73,15 @@ describe('UploadScreen', () => { 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('renders subtitle defaults inside the upload card footer area', () => { + renderUploadScreen(); + + expect(screen.getByTestId('upload-dropzone-card')).toContainElement( + screen.getByTestId('upload-subtitle-defaults-panel'), + ); + expect(screen.queryByTestId('subtitle-defaults-card')).not.toBeInTheDocument(); }); it('shows all supported tts languages in a compact always-visible grid', () => { @@ -100,6 +108,14 @@ describe('UploadScreen', () => { expect(screen.getByRole('button', { name: 'Generate Translated Video' })).toBeInTheDocument(); }); + it('keeps subtitle preview controls active after moving them into the upload card', () => { + renderUploadScreen(); + + expect(screen.getByTestId('upload-subtitle-defaults-panel')).toContainElement( + screen.getByTestId('upload-subtitle-preview'), + ); + }); + 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 116a9dd..814e367 100644 --- a/src/components/UploadScreen.tsx +++ b/src/components/UploadScreen.tsx @@ -64,7 +64,7 @@ export default function UploadScreen({ >
@@ -105,10 +105,104 @@ export default function UploadScreen({
-
-

{m.upload.supportedFormats}

-
- {activeModeLabel} +
+
+
+
+

{m.upload.subtitleDefaults}

+

{m.upload.subtitleDefaultsDesc}

+
+ +
+ +
+
+
+

+ {m.upload.subtitlePreview} +

+
+
+ +
+
+
+ + + {format(m.upload.fromBottom, { value: subtitleDefaults.bottomOffsetPercent })} + +
+ + setSubtitleDefaults((previous) => ({ + ...previous, + bottomOffsetPercent: Number(e.target.value), + })) + } + className="w-full accent-sky-500" + /> +
+ +
+
+ + + {format(m.upload.pxValue, { value: subtitleDefaults.fontSize })} + +
+ + setSubtitleDefaults((previous) => ({ + ...previous, + fontSize: Number(e.target.value), + })) + } + className="w-full accent-sky-500" + /> +
+
+
+ +
+

{m.upload.supportedFormats}

+
+ {activeModeLabel} +
@@ -230,97 +324,6 @@ export default function UploadScreen({ -
-
-
-

{m.upload.subtitleDefaults}

-

{m.upload.subtitleDefaultsDesc}

-
- -
- -
-
-
-

- {m.upload.subtitlePreview} -

-
-
- -
-
-
- - - {format(m.upload.fromBottom, { value: subtitleDefaults.bottomOffsetPercent })} - -
- - setSubtitleDefaults((previous) => ({ - ...previous, - bottomOffsetPercent: Number(e.target.value), - })) - } - className="w-full accent-sky-500" - /> -
- -
-
- - - {format(m.upload.pxValue, { value: subtitleDefaults.fontSize })} - -
- - setSubtitleDefaults((previous) => ({ - ...previous, - fontSize: Number(e.target.value), - })) - } - className="w-full accent-sky-500" - /> -
-
-
{showTrimModal && tempFile && (