From 294c64877de166e23b338ada5e411a14431e6647 Mon Sep 17 00:00:00 2001 From: ajaysi Date: Mon, 20 Apr 2026 14:17:30 +0530 Subject: [PATCH] Enhance voice clone UI: gradient border, professional title, advanced options toggle - Reduced script text to ~60% (more concise) - Added gradient border styling on script card - Improved title styling (uppercase, letter-spacing) - Added Settings icon button to toggle advanced options - Advanced options (Clone Engine, Custom Voice ID, Model, etc.) now hidden by default --- .../components/VoiceAvatarPlaceholder.tsx | 47 +++++++++++++++---- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/frontend/src/components/OnboardingWizard/PersonalizationStep/components/VoiceAvatarPlaceholder.tsx b/frontend/src/components/OnboardingWizard/PersonalizationStep/components/VoiceAvatarPlaceholder.tsx index f651302a..c1471841 100644 --- a/frontend/src/components/OnboardingWizard/PersonalizationStep/components/VoiceAvatarPlaceholder.tsx +++ b/frontend/src/components/OnboardingWizard/PersonalizationStep/components/VoiceAvatarPlaceholder.tsx @@ -1,7 +1,7 @@ import React, { useMemo, useRef, useState, useEffect } from 'react'; import { Box, Typography, Paper, Stack, Button, Alert, TextField, CircularProgress, Slider, FormControlLabel, Checkbox, MenuItem, Tooltip, Chip, Divider, Grid, IconButton, Modal, Fade, Backdrop, LinearProgress } from '@mui/material'; import { keyframes } from '@mui/system'; -import { Mic, GraphicEq, Timer, CloudUpload, Stop, PlayArrow, InfoOutlined, TextFields, HelpOutline, AutoAwesome, Campaign, MicNone, Podcasts, RestartAlt, Undo, Headphones, Article, VideoLibrary, TrendingUp, CheckCircle, RecordVoiceOver } from '@mui/icons-material'; +import { Mic, GraphicEq, Timer, CloudUpload, Stop, PlayArrow, InfoOutlined, TextFields, HelpOutline, AutoAwesome, Campaign, MicNone, Podcasts, RestartAlt, Undo, Headphones, Article, VideoLibrary, TrendingUp, CheckCircle, RecordVoiceOver, Settings } from '@mui/icons-material'; import { createVoiceClone, createVoiceDesign, getLatestVoiceClone, setBrandVoice } from '../../../../api/brandAssets'; import { OperationButton } from '../../../shared/OperationButton'; @@ -58,6 +58,7 @@ export const VoiceAvatarPlaceholder: React.FC<{ domainName?: string; onVoiceSet? const [accuracy, setAccuracy] = useState(0.7); const [languageBoost, setLanguageBoost] = useState('auto'); const [qualityPreset, setQualityPreset] = useState<'clean' | 'noisy' | 'accent'>('clean'); + const [showAdvancedOptions, setShowAdvancedOptions] = useState(false); const [qwenLanguage, setQwenLanguage] = useState('auto'); const [referenceText, setReferenceText] = useState(''); const [voiceDescription, setVoiceDescription] = useState(''); @@ -826,12 +827,40 @@ export const VoiceAvatarPlaceholder: React.FC<{ domainName?: string; onVoiceSet? - - Read this script to capture your voice: - - - - "Hi, I'm excited to use AI to scale my content creation. This voice clone will help me stay consistent across all my channels. At our company, we value transparency and innovation, and we strive to deliver the best solutions for our clients every single day. Imagine a world where creativity knows no bounds, where your ideas can take flight and reach millions of people instantly." + + + Read this script to capture your voice: + + setShowAdvancedOptions(!showAdvancedOptions)} + sx={{ + color: showAdvancedOptions ? '#7C3AED' : '#9CA3AF', + bgcolor: showAdvancedOptions ? 'rgba(124, 58, 237, 0.1)' : 'transparent', + '&:hover': { bgcolor: 'rgba(124, 58, 237, 0.15)' } + }} + > + + + + + + "Hi, I'm excited to use AI to scale my content creation. This voice clone will help me stay consistent across all my channels. At our company, we value transparency and innovation, and we strive to deliver the best solutions for our clients every single day." @@ -893,7 +922,7 @@ export const VoiceAvatarPlaceholder: React.FC<{ domainName?: string; onVoiceSet? {(audioPreviewUrl || audioFile || (inputType === 'text' && voiceDescription?.trim().length > 0)) && } {/* Inputs for Voice Cloning (Mic/Upload) - Shown only after sample available */} - {inputType !== 'text' && (audioPreviewUrl || audioFile) && ( + {inputType !== 'text' && (audioPreviewUrl || audioFile) && showAdvancedOptions && ( 0 && ( + {inputType === 'text' && voiceDescription?.trim().length > 0 && showAdvancedOptions && (