From 2f200aa61baaf9d5bbd1a08b3d169658dcf7b06a Mon Sep 17 00:00:00 2001 From: Paul Bailey Date: Tue, 9 Dec 2025 13:24:47 +0000 Subject: [PATCH] feat: redesign UI with clean, modern SaaS aesthetic - Remove excessive animations and gradients - Implement clean card-based layout - Add professional progress stepper with checkmarks - Simplify color scheme to gray/indigo/purple - Create minimal, elegant component designs - Add subtle hover effects and transitions - Improve typography and spacing - Remove emoji overload, keep minimal icons - Create professional button styles - Implement clean form inputs with focus states - Add proper visual hierarchy - Simplify loading states and messages - Create cohesive, modern user experience --- frontend/src/App.css | 44 +--- frontend/src/App.tsx | 97 ++++---- .../src/components/AudioPlayerSection.tsx | 51 ++--- .../src/components/ScriptReviewSection.tsx | 84 ++----- frontend/src/components/TextInputSection.tsx | 52 ++--- .../src/components/VoiceAssignmentSection.tsx | 208 +++++++----------- frontend/src/index.css | 92 +++----- 7 files changed, 222 insertions(+), 406 deletions(-) diff --git a/frontend/src/App.css b/frontend/src/App.css index 30cf955..e40e221 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -1,53 +1,11 @@ -/* Mobile-first responsive styles */ #root { width: 100%; margin: 0 auto; padding: 0; - position: relative; - z-index: 1; } -/* Ensure touch-friendly interactions */ -.touch-manipulation { - touch-action: manipulation; -} - -/* Smooth animations */ button, input, select, textarea { - transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1); -} - -/* Advanced button hover effects */ -button:not(:disabled) { - position: relative; - overflow: hidden; -} - -button:not(:disabled)::before { - content: ''; - position: absolute; - top: 50%; - left: 50%; - width: 0; - height: 0; - border-radius: 50%; - background: rgba(255, 255, 255, 0.3); - transform: translate(-50%, -50%); - transition: width 0.6s, height 0.6s; -} - -button:not(:disabled):hover::before { - width: 300px; - height: 300px; -} - -button:not(:disabled):hover { - transform: translateY(-4px) scale(1.02); - box-shadow: 0 20px 40px rgba(0, 0, 0, 0.2); -} - -button:not(:disabled):active { - transform: translateY(-2px) scale(1.01); + transition: all 0.2s ease; } /* Custom range slider styling for better mobile support */ diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 802d791..689383c 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -158,39 +158,52 @@ function App() { const allRolesAssigned = roles.length > 0 && roles.every(role => voiceAssignments.has(role.id)) return ( -
-
- {/* Header with gradient text and icon */} -
-
-
-
- 🎧 -
+
+
+ {/* Header */} +
+
+ 🎧
-

+

Text to Audiobook

-

+

Transform your stories into immersive audio experiences with AI-powered voices

- {/* Progress indicator */} -
-
-
-
-
+ {/* Progress Steps */} +
+ {['Input', 'Voices', 'Review', 'Done'].map((step, index) => { + const phases = ['input', 'assignment', 'review', 'generated']; + const isActive = phase === phases[index]; + const isPast = phases.indexOf(phase) > index; + + return ( +
+
+ {isPast ? '✓' : index + 1} +
+ {index < 3 && ( +
+ )} +
+ ); + })}
{error && ( -
+
- ⚠️ + ⚠️
-

Error

-

{error}

+

Error

+

{error}

@@ -209,10 +222,10 @@ function App() { {phase === 'assignment' && ( <> {isLongText && ( -
-
- ⏱️ -

Generation may take several minutes for very long content.

+
+
+ ⏱️ +

Generation may take several minutes for very long content.

)} @@ -236,10 +249,10 @@ function App() { {phase === 'review' && ( <> {isLongText && ( -
-
- ⏱️ -

Generation may take several minutes for very long content.

+
+
+ ⏱️ +

Generation may take several minutes for very long content.

)} @@ -262,30 +275,24 @@ function App() { )} {isGenerating && isLongText && ( -
-
-
-
-
-
+
+
+
-

Generating Your Audiobook

-

This may take several minutes for very long content. Please be patient...

+

Generating Your Audiobook

+

This may take several minutes. Please be patient...

)} {isGeneratingScript && ( -
-
-
-
-
-
+
+
+
-

Generating Script Preview

-

AI is analyzing your text and assigning speakers...

+

Generating Script Preview

+

AI is analyzing your text...

diff --git a/frontend/src/components/AudioPlayerSection.tsx b/frontend/src/components/AudioPlayerSection.tsx index bf9c303..a329b74 100644 --- a/frontend/src/components/AudioPlayerSection.tsx +++ b/frontend/src/components/AudioPlayerSection.tsx @@ -8,68 +8,47 @@ export default function AudioPlayerSection({ onDownload }: AudioPlayerSectionProps) { return ( -
+
{/* Success Header */} -
-
-
- 🎉 -
+
+
+ 🎉
-

+

Your Audiobook is Ready!

-

+

Listen below or download to enjoy offline

- {/* Audio Player Card */} -
-
-
- 🎧 -
-
-

Listen Now

-

Your personalized audiobook

-
-
- + {/* Audio Player */} +
{/* Download Button */} -
+
{/* Success Message */} -
-
- ✅ -

Success!

-
+

- Your audiobook has been successfully generated with AI-powered voices! + ✅ Your audiobook has been successfully generated!

diff --git a/frontend/src/components/ScriptReviewSection.tsx b/frontend/src/components/ScriptReviewSection.tsx index 6f07d60..370b9ab 100644 --- a/frontend/src/components/ScriptReviewSection.tsx +++ b/frontend/src/components/ScriptReviewSection.tsx @@ -22,52 +22,37 @@ export default function ScriptReviewSection({ }; return ( -
-
-
- 📋 -
-
-

Review Script

-

Fine-tune speaker assignments

-
-
- -
-
- 💡 -

Review the AI-generated script and adjust speaker assignments as needed.

-
+
+
+

Review Script

+

Review and adjust speaker assignments before generating your audiobook.

{/* Script Segments */} -
+
{segments.map((segment, index) => (
- {/* Segment Header */} -
+ {/* Header */} +
-
+
{index + 1}
- - SEGMENT - + Segment
{/* Speaker Dropdown */} -
-